直到最近,我才开始处理这个类的HTML或PHP。我的任务是使用漏洞工具来诊断问题,然后尝试修复它们。我发现最高的警报是跨站点脚本(XXS)警报。我读过关于这个漏洞的文章,但在告诉我实际需要做什么时感到很困惑。守则如下:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Form Login</title>
</head>
<body OnLoad="document.main.username.focus();">
<table >
<tr>
<td colspan="2">
<h4>Enter your Username and Email Address to continue</h4>
</td>
</tr>
<!-- create the main form with an input text box named uid and a password text box named mypassword -->
<form name="main" method="post" action="authcheck.php">
<tr>
<td>username:</td>
<td><input name="username" type="text" size="50"></td>
</tr>
<tr>
<td>Email Address:</td>
<td><input name="emailadd" type="text" size="50"></td>
</tr>
<tr>
<td colspan="2" align="center"><input name="btnsubmit" type="submit" value="Submit"></td>
</tr>
</table>
</form>
</body>
</html> 上面提到的下一个方案如下:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>User Authenticate </title>
</head>
<body>
<?php
// Retrieve Post Data
$username = $_POST["username"];
$email = $_POST["emailadd"];
// Set the session information
session_start();
$_SESSION['appusername'] = $username;
$_SESSION['appemail'] = $email;
// Display the Session information
echo "<h3> Session Data </h3>";
echo "<table border='1'>";
echo "<tr>
<td>Username </td>
<td> Email </td>
</tr>";
echo "<tr>
<td>" . $_SESSION['appusername'] . "</td>";
echo "<td>" . $_SESSION['appemail']. "</td>";
echo "</tr>";
echo "</table>";
// Provide a button to logout
echo "<form name='logout' method='post' action='logout.php'>
<input name='btnsubmit' type='submit' value='Logout'>
</form>";
?>
</body>
</html>这个程序是在我按下提交按钮时生成的。
我真的只是想找出我应该做什么来修复这个错误。谢谢
发布于 2016-02-12 20:54:29
因为您在这里打印变量:
echo "<tr>
<td>" . $_SESSION['appusername'] . "</td>";
echo "<td>" . $_SESSION['appemail']. "</td>";
echo "</tr>"; 为了做到这一点,您需要删除HTML标记,并将它们替换为entites。要做到这一点,你至少需要:
$username = htmlentites($_POST["username"]);
$email = htmlentities($_POST["emailadd"]);然而,您应该使用filter_var进行更多的操作。email.asp:
$username = htmlentites($_POST["username"]);
if (!filter_var($email, FILTER_VALIDATE_EMAIL) === false)
{
//Bad email, so something else.
die('...');
}
$email = $_POST["emailadd"];发布于 2016-02-12 20:46:05
问题是,在将用户名或密码写入该表之前,您不会对用户名或密码进行消毒。
发布于 2016-02-12 20:55:28
使用以下方法净化$username和$email变量
$username = htmlspecialchars($_POST['username']);
$email = htmlspecialchars($_POST['emailadd']); 或
$username = htmlentities($_POST['username']);
$email = htmlentities($_POST['emailadd']);htmlentities();用HTML变体替换所有字符,而htmlspecialchars();替换少量字符。
请注意,这是对POST数据进行消毒的最基本形式。您可以查看这个滤波函数以获得更多的“复杂”消毒和验证。
https://stackoverflow.com/questions/35371716
复制相似问题