【发布时间】:2015-04-02 16:15:44
【问题描述】:
我必须向 jQuery 插件传递一些数据。我可以向它传递一个 URL,它将使用 GET 请求来获取数据,或者直接向它传递一个将消除一个服务器请求的数组。有问题的数据是用户提供的,没有在数据库输入时进行清理。
下面的脚本没有显示插件,但显示了我如何将数据传递给客户端,以便可以直接传递给插件。可以看出,动态生成的 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));
}
?>
【问题讨论】:
-
“有问题的数据是用户提供的,没有在数据库输入时进行清理。” 嗯,所有数据都是从外界进入系统的需要在任何合理的系统中记录在数据库中之前进行消毒/检查。如果您不这样做,您将在某个时候被有效登录您的系统但具有邪恶意图的人咬伤。
-
是的,这措辞很糟糕,正如我们在其他地方所同意的那样。对不起。我不是说在输入时 escape 它,我说的是在输入时 check 它是否看起来合理。当然,你会在输出时转义 as I said below。
标签: javascript php jquery ajax xss