存儲型XSS對用戶的輸入進行過濾的方式和反射型XSS相同,這里我們使用htmlspecialchars()
( 把預定義的字符 "<" (小於)和 ">" (大於)轉換為 HTML 實體 )
htmlspecialchars和htmlentities的區別:
htmlspecialchars 只轉義 & 、" 、' 、< 、> 這幾個html代碼
htmlentities 卻會轉化所有的html代碼,連同里面的它無法識別的中文字符也會轉化。
新建Xss_htmlspecialchars_Storage.php ,代碼如下:
<span style="font-size:18px;"><meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<html>
<head>
<title>XssStorage</title>
</head>
<body>
<h2>Message Board<h2>
<br>
<form action="Xss_htmlspecialchars_Storage.php" method="post">
Message:<textarea id='Mid' name="desc"></textarea>
<br>
<br>
Subuser:<input type="text" name="user"/4><br>
<br>
<input type="submit" value="submit" onclick='loction="XssStorage.php"'/>
</form>
<?php
if(isset($_POST['user'])&&isset($_POST['desc'])){
$log=fopen("sqlStorage.txt","a");
fwrite($log,htmlspecialchars($_POST['user'])."\r\n"); # 在此對用戶輸入數據$_POST['user']進行過濾
fwrite($log,htmlspecialchars($_POST['desc'])."\r\n"); # 在此對用戶輸入數據$_POST['desc']進行過濾
fclose($log);
}
if(file_exists("sqlStorage.txt"))
{
$read= fopen("sqlStorage.txt",'r');
while(!feof($read))
{
echo fgets($read)."</br>";
}
fclose($read);
}
?>
</body>
</html></span>
當我們在Message中輸入<script>alert('xss')</script>
:
可以看到頁面並沒有彈窗,查看網頁html代碼:
可以看到htmlspecialchars()函數對用戶輸入的<>
做了轉義處理。