2016-02-12 69 views
0

直到最近,我还没有和HTML或PHP混为一谈。我的任务是使用漏洞工具来诊断问题,然后尝试修复它们。我发现最高警报是一个跨站脚本(XXS)警报。我已经阅读了这个漏洞,但是在告诉我我真的需要做什么时发现它很混乱。代码如下:试图摆脱代码中的跨站点脚本(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> 

此程序。

我真的只是想找出我应该试图解决这个错误。谢谢

+1

你需要提供更多的代码和你正在得到什么错误...什么工具检查这个? – cmorrissey

+0

我正在使用名为ZAP –

+0

@RandyGilman的漏洞工具,如来自OWASP的ZAP? –

回答

2

因为你在这里打印出来的变量:

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。 http://www.w3schools.com/php/filter_validate_email.asp

$username = htmlentites($_POST["username"]); 
if (!filter_var($email, FILTER_VALIDATE_EMAIL) === false) 
{ 
    //Bad email, so something else. 
    die('...'); 
} 
$email = $_POST["emailadd"]; 
+0

好吧,我看到这是一个很好的链接,以帮助我感谢 –

+0

这些是一个很好的开始。你击败了我。 ha –

+0

我清理了用户名,并添加了如果陈述,但我不断收到跨站点脚本(反映)现在。这比以前更好,因为我有2个警报,但现在我只有一个。任何想法反映的部分是什么意思? –

2

问题是,在写入该表之前,您并没有清除用户名或密码。

+0

好的,我会尝试搜索如何清理用户名和密码。 –

+0

你也可以看看输入验证。你基本上想要防止任何不需要的代码执行。在上面提供的页面中,用户可以将javascript或php传递给用户名或密码字段,然后执行该字段。 –

1

使用

$username = htmlspecialchars($_POST['username']); 
$email = htmlspecialchars($_POST['emailadd']); 

$username = htmlentities($_POST['username']); 
$email = htmlentities($_POST['emailadd']); 

htmlentities();替换为一个HTML变种的所有字符,而htmlspecialchars();替换的字符数量净化你的$username$email变量。

请注意,这是清理POST数据的最基本形式。您可以查看此filter function以获得更“复杂”的消毒和验证。

+0

哪里是放置代码的正确位置,因为我在放置它后立即要求用户输入它们,它不会加载? –

+0

@RandyGilman将它替换为您在'//取回发布数据'下的代码 –