我必須通過一個jQuery插件的一些數據。我可以將它傳遞給一個使用GET請求獲取數據的URL,或者直接傳遞一個數組來消除一個服務器請求。有問題的數據是用戶提供的,在數據庫輸入時沒有消毒。用動態生成的JavaScript保護XSS
下面的腳本不顯示插件,但確實顯示了我可能會將數據傳遞給客戶端,以便它可以直接傳遞給插件。正如所看到的,動態生成的JS方法對於XSS是可疑的,但是,Ajax/JSON方法似乎不是。
對於這種情況,應該如何確保動態生成的JavaScript方法,並且Ajax/JSON方法存在風險?
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>XSS Testing</title>
<script src="getStuff.php?type=js" type="text/javascript"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.js" type="text/javascript"></script>
<script type="text/javascript">
$(function(){
console.log(stuff);
$.get("getStuff.php", function(data) {
console.log(data);
},'json');
});
</script>
</head>
<body>
</body>
</html>
getStuff.php
<?php
$getFromDB=array(
'Mary',
'x"];alert(\'xss2\');x=["x',
'John'
);
if(isset($_GET['type']) && $_GET['type']=='js') {
header('Content-Type: application/javascript;');
$s='var stuff=[';
foreach($getFromDB as $row) {
$s.='"'.$row.'",';
}
$s=substr($s, 0, -1).'];';
echo($s);
}
else {
header('Content-Type: application/json;');
echo(json_encode($getFromDB));
}
?>
*「有問題的數據是用戶提供的,在數據庫輸入時沒有消毒。」*從外部世界進入系統的所有**數據需要在數據庫中記錄之前進行消毒/檢查,在任何合理的系統中。如果你不這樣做,你會在某個時候被有人登錄到你的系統的人咬住,但是有惡意的意圖。 – 2015-04-02 17:08:29
@ T.J.Crowder真的嗎? http://stackoverflow.com/questions/11253532/html-xss-escape-on-input-vs-output http://lukeplant.me.uk/blog/posts/why-escape-on-input-is-a -bad-idea/ – user1032531 2015-04-02 17:30:11
是的,這是措辭不佳,正如我們在別處商定的那樣。對不起'回合。我並不是說在輸入時輸入**,而是在輸入時檢查**,看它是否合理。當然,你在輸出中轉義,[如我在下面所述](http://stackoverflow.com/a/29418704/157247)。 – 2015-04-02 18:09:04