2016-02-12 58 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將它替換爲您在'//取回發佈數據'下的代碼 –