补充一下昨天没说的一部分XSS攻击手段
script元素中的XSS
当script中一部分JavaScript是动态生成时,因为script不能解释Tab和字符实体
所以无需进行html转义,只需要对JavaScript转义
比如下面这段代码
但是,若是输入值中包含</script>这个标签时,</script>会被当成JavaScript的结束符
游览器只会将<script></script>中间的代码传递给JavaScript引擎处理
此时,若是在script元素处理的代码中插入一条</script><script>alert(document.cookie)//
script字面量会被迫终结,然后继续执行后面恶意插入的JavaSript
所以,动态生成JavaScript字符串字面量需要遵循以下规则
按照JavaScript语法,将引号(单双),斜杠及换行符等进行转义
即在前面加上一个\
若是事件绑定函数,在上述执行结果进行html转义后,用双引号括起来
若是script元素,确保执行结果生成的字符串不存在</
但是JavaScript转义规则相当复杂,执行起来可能有所疏漏,所以有以下两种处理方法
Unicode转义
为了规避JavaScript动态生成带来的风险,可以将除字母和数字外所有字符都进行转义
这是利用了JavaScript代码能将.U+XXX转义为\uXXX的功能
转义代码如下,由于教材问题,最下面有一条代码显示不全
这里也不对点号和减号做转义,因为不会对安全性有影响
这里图个方便,脚本解释我直接发截图上来
JavaScript引用定义在script元素外的方法
除了这个Unicode转义外,也可以引用定义在script元素外的参数
这样也能避免被</script>强行终止script元素字符串字面量
该方案实施需要利用到hidden参数,示例代码如下
第一行代码中也有部分未显示完全
开头的input元素指定了id,使其能够被引用
并且,根据属性值转义规则,使用htmlspecialchars函数转义后用双引号括起来
而后,input的值在倒数第二行被getElementById方法引用
此方法的优势在于不用遵循JavaScript繁琐的问题,仅用少量的规则就能防范XSS
但由于定义JavaScript代码与参数间隔较远,在实际使用中,比较影响可读性
然后,是一种被称作"DOM based XSS"的XSS
JavaScript常用于客户端的显示处理,而隐患也在此
如下
我们这里对URL做出修改
http://example.jp/43-011.html?name=<script>alert(document.cookie)</script>
攻击者注入的JavaScript代码不会出现在服务器端生成的html中,因此这类XSS被称作"DOM based XSS"
所以,即使部分显示使用JavaScript也要考虑其中是否会包含HTML标签
JavaScript标准函数中没有提供HTML转义的功能
我们这边可以使用jQuery这个JavaScript库来示范字符串的显示,代码如下
使用span元素确定字符串的显示位置,然后向id指定的DOM中插入文本文字,然后用text方法自动转义
开发博客系统或SNS网站时,可能是要允许用户使用自定义CSS或HTML标签的
但这样会带来很大得到XSS风险
一旦允许输入HTML标签,用户就能使用script元素或事件绑定函数执行JavaScript
同理,在CSS中使用experssion功能也能执行JavaScript
所以,最好的方法还是使用能够解析HTML文本语法结构的第三方数据库
比如PHP中的HTML Purifier
最后,一部分错误消息显示,可能会导致信息泄漏
这边要修改报错提示,显示出来的错误提示只有大概,而详细内容保存在日志中
PHP中禁止显示详细错误信息,在php.ini中修改属性
display_errors = off
总结
这边介绍的XSS漏洞,产生的主要原因是显示的方法存在问题
所以第一步,需要生成正确的HTML
后面再来补是很麻烦的一件事,所以最好一开始就编写正确的代码来杜绝XSS漏洞