首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >试图消除代码中的跨站点脚本(XXS)漏洞

试图消除代码中的跨站点脚本(XXS)漏洞
EN

Stack Overflow用户
提问于 2016-02-12 20:34:29
回答 3查看 90关注 0票数 0

直到最近,我才开始处理这个类的HTML或PHP。我的任务是使用漏洞工具来诊断问题,然后尝试修复它们。我发现最高的警报是跨站点脚本(XXS)警报。我读过关于这个漏洞的文章,但在告诉我实际需要做什么时感到很困惑。守则如下:

代码语言:javascript
复制
<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> 

上面提到的下一个方案如下:

代码语言:javascript
复制
<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>

这个程序是在我按下提交按钮时生成的。

我真的只是想找出我应该做什么来修复这个错误。谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-02-12 20:54:29

因为您在这里打印变量:

代码语言:javascript
复制
echo "<tr>
      <td>" . $_SESSION['appusername'] . "</td>";
echo  "<td>" . $_SESSION['appemail']. "</td>";
echo   "</tr>";  

为了做到这一点,您需要删除HTML标记,并将它们替换为entites。要做到这一点,你至少需要:

代码语言:javascript
复制
$username = htmlentites($_POST["username"]);
$email = htmlentities($_POST["emailadd"]);

然而,您应该使用filter_var进行更多的操作。email.asp

代码语言:javascript
复制
$username = htmlentites($_POST["username"]);
if (!filter_var($email, FILTER_VALIDATE_EMAIL) === false)
{
  //Bad email, so something else.
  die('...');
}
$email = $_POST["emailadd"];
票数 2
EN

Stack Overflow用户

发布于 2016-02-12 20:46:05

问题是,在将用户名或密码写入该表之前,您不会对用户名或密码进行消毒。

票数 2
EN

Stack Overflow用户

发布于 2016-02-12 20:55:28

使用以下方法净化$username$email变量

代码语言:javascript
复制
$username = htmlspecialchars($_POST['username']);
$email = htmlspecialchars($_POST['emailadd']);  

代码语言:javascript
复制
$username = htmlentities($_POST['username']);
$email = htmlentities($_POST['emailadd']);

htmlentities();用HTML变体替换所有字符,而htmlspecialchars();替换少量字符。

请注意,这是对POST数据进行消毒的最基本形式。您可以查看这个滤波函数以获得更多的“复杂”消毒和验证。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35371716

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档