使用PHP,编写登陆界面。要求界面中包含:存在XSS漏洞、无XSS漏洞两种选项。实现: (1)展示存在XSS漏洞的代码及效果图 (2)展示无XSS漏洞的代码及效果图
时间: 2024-11-25 13:31:44 浏览: 18
在PHP中创建一个登录界面,我们首先需要HTML结构加上PHP处理用户输入的部分。这里分别演示如何引入XSS漏洞和避免它。
### 存在XSS漏洞的示例代码:
```html
<!DOCTYPE html>
<html>
<head>
<title>Login</title>
</head>
<body>
<form action="login.php" method="post">
<label for="username">Username:</label>
<input type="text" id="username" name="username"><br><br>
<label for="password">Password:</label>
<input type="password" id="password" name="password"><br><br>
<input type="submit" value="Login">
</form>
</body>
</html>
<!-- login.php (存在XSS漏洞) -->
<?php
if(isset($_POST['username']) && isset($_POST['password'])) {
$username = $_POST['username'];
$password = $_POST['password'];
// 漏洞:直接输出用户输入到页面,未进行过滤
echo "Welcome, " . htmlspecialchars($username); // 使用htmlspecialchars防止SQL注入,但未阻止XSS攻击
}
?>
```
在这个例子中,`htmlspecialchars()`函数用于转义特殊字符,但在这种情况下,它仅对HTML实体进行了转义,并无法防御CSS注入或JavaScript注入等XSS攻击。
### 避免XSS漏洞的示例代码:
```html
<!-- login.php (无XSS漏洞) -->
<!DOCTYPE html>
<html>
<head>
<title>Login</title>
<script>
function validateForm() {
return /^[a-zA-Z0-9]*$/.test(document.getElementById('username').value);
}
</script>
</head>
<body>
<form onsubmit="return validateForm()" action="login_safe.php" method="post">
<label for="username">Username:</label>
<input type="text" id="username" name="username" pattern="[a-zA-Z0-9]*" required><br><br>
<label for="password">Password:</label>
<input type="password" id="password" name="password"><br><br>
<input type="submit" value="Login">
</form>
</body>
</html>
<!-- login_safe.php -->
<?php
if(isset($_POST['username']) && isset($_POST['password'])) {
$username = filter_var($_POST['username'], FILTER_SANITIZE_STRING); // 过滤掉非法字符
$password = password_verify($_POST['password'], $_SESSION['hashed_password']); // 使用密码哈希避免明文存储
// 输出安全信息
if ($username != '') {
$_SESSION['username'] = $username;
echo "Welcome, " . htmlspecialchars($username);
} else {
echo "Invalid username.";
}
}
?>
```
在这个版本中,我们添加了表单验证(`validateForm()`),限制了用户名只能包含字母和数字,并使用`filter_var()`函数清理用户输入以降低XSS风险。同时,密码存储通常使用哈希和盐,而非直接输出。
**相关问题--**
1. XSS攻击有哪些常见类型?
2. 如何在前端更好地防止XSS攻击?
3. PHP的内置函数还有哪些可以帮助防止XSS?
阅读全文