做b2b比较好的网站有哪些网站流量分析工具
XSS常见防范措施
总的原则:输入做过滤,输出做转义
过滤:根据业务需求进行过滤,比如输入点要求输入手机号,在后端写一个逻辑,只允许输入手机号格式的数字。
转义:所有输出到前端的数据都根据输出点进行转义,比如输出到html中进行html实体转义,输入到JS里面的进行js转义。
案例演示
我们选择xss之href输出,这个地方,我们直接看源码
如果你输入的内容,不是百度,它会把你输入的内容,用htmlspecialchars()进行处理,同时它这里也用了ENT_QUOTES这么个类型,这意味着’"<>&都会被处理,然后,会把它输出到a标签里面的href属性里面
其实在a标签href属性里面,可以用js协议来执行js的,我们可以写这样的payload,看一下效果
javascript:alert(111)
整个输入里面,没有我们刚刚特殊字符的
我们看一下源码
我们看到这段payload在我们a标签里面,我们点一下
我们刚刚输入的payload,会被执行,所以说,在a标签里面,href有输出的时候,一般href里面,我们会写超链接,我们在输入的时候,只允许这个地方是http或者是https,才允许,它从这个地方输出,否则的话,是不允许输入,做了这一段之后,我们同时,用htmlspecialchars()进行处理,把特殊符号给处理掉,这样子,这个地方基本是没有问题了
我们看一下js输出,我们可以看一下,它的输出点,输11111,我们看一下源码
它会把我们的输入放到js里面去,然后在对这个变量进行判断,进行对应的输出,我们可以在这个地方构造一个闭合,因为js无非是构造闭合,我们把这段js复制一下,
<script>$ms='1111';if($ms.length != 0){if($ms == 'tmac'){$('#fromjs').text('tmac确实厉害,看那小眼神..')}else {
// alert($ms);$('#fromjs').text('无论如何不要放弃心中所爱..')}}</script>
首先我们输入一个字符单引号,把前面的变量闭合掉,然后我们接着来一个,也就是说,这个script把前面的script闭合掉了,然后在后面紧接着在来一个script,alert(‘xss’),在这里,我们在把之前的script闭合掉,
<script>$ms='x'</script><script>alert('xss')</script>';if($ms.length != 0){if($ms == 'tmac'){$('#fromjs').text('tmac确实厉害,看那小眼神..')}else {
// alert($ms);$('#fromjs').text('无论如何不要放弃心中所爱..')}}</script>
这样子payload,就构造了一个合法的闭合,把前面的script闭合掉,在插入我们自己的js,我们把这段复制下来,
x'</script><script>alert('xss')</script>'
我们把这段在对应的代码里面做测试
我们的xss就被执行了,当我们的输入,输出到前端的js代码里面,就会被执行了
我们看一下后端的代码
前端做接受,接受完变量之后,在js里面通过php输出了
我们看一下上面的备注
//这里讲输入动态的生成到了js中,形成xss
输出点在js里面
//javascript里面是不会对tag和字符实体进行解释的,所以需要进行js转义//讲这个例子主要是为了让你明白,输出点在js中的xss问题,应该怎么修?
//这里如果进行html的实体编码,虽然可以解决XSS的问题,但是实体编码后的内容,在JS里面不会进行翻译,这样会导致前端的功能无法使用。
用之前的htmlspecialchars()方法,对我们的实体输入做实体编码处理的话
//所以在JS的输出点应该使用\对特殊字符进行转义
xss的防范,除了前面的说的方法以外,它的输出点也很重要,根据不同的输出点,我们可能也要一些不同的方法