如下php代码
<?php
error_reporting(0);
$name = $_GET["name"];
?>
<input id="text" type="text" value="<?php echo $name;?>" />
<div id="print"></div>
<script type="text/javascript">
var text = document.getElementById("text");
var print = document.getElementById("print");
print.innerHTML = text.value; // 获取 text的值,并且输出在print内。这里是导致xss的主要原因。
</script>
为什么会有两种不同情况?chrome 55版本
http://localhost/test/?name=<script>alert(1)</script>//失败
http://localhost/test/?name=<img src=1 onerror=alert(1)>//成功
你好,这个问题主要是chrome自带的xss过滤器导致的
目前很多浏览器都会自身对用户的输入进行判断,检测是否存在攻击字符,比如你上述提到的<script>标签,这段脚本很明显就是一段xss攻击向量,因此浏览器会对这段输入进行处理,不同的浏览器处理方式也不一样。
但为了不影响用户体验,过滤器一般也只会对一些基础的xss攻击语句进行处理,所以题主下面的语句很可能过滤器并未检测和处理,因此造成了上述情况。
不好意思,之前没仔细看代码,题主是通过innerHTML将文本插入,这样的方式确实不会执行,我上述的回答仅适用于直接输出时造成的执行差异。