HTML转义主要对HTML起作用,对javascript脚本不起作用。 单引号在脚本参数里依然被认为是单引号,转义后被认为是转义后的单引号
属性值(URL)
onload 脚本(事件绑定)的参数
JavaScript脚本定义的里面能被客户输入的话也会存在问题
XSS进阶:HTML转义概要
属性值(URL)
a元素的href属性、img元素、frame元素、iframe元素的src属性等
如果属性中URL的值是由外界传入的话,外界就能够使用javascript:JavaScript代码形式(javascript协议)的URL执行javascript代码
解决方案:
当URL由程序动态生成时,需要对其进行校验,仅允许http和https
协议。此外,通过校验的URL还需要作为属性值进行HTML转义
具体来说,URL需满足以下两个条件中的一个。
以http:或https:开头的绝对URL
以/开头的相对URL
事件绑定函数
解决方法
先写一个对javascript进行转义的函数,再对客户输入的内容进行javascript的转义,最后再对javascript转义后的内容进行HTML转义
script元素中的字符串变量
理论上讲只需要做javascript转义,html转义不需要,HTML转义的内容是给客户看的,script标签的内容客户是看不到的。
js字符串面量动态生成的对策
动态生成javascript字符串字面量时需要遵循以下规则。
1、按照JavaScript语法,将引号(单引号及双引号)和斜杠\及换行符等进行转义。"->\" '->\' 换行符->\n \->\\
2.1、如果是事件绑定函数,将(1)的执行结果按照字符实体进行HTML转义,并用双引号括起来
2.2、如果是在script元素中,执行(1)后确保字符串中不存在</.
最好的办法可能就是避免动态生成JavaScript。
解决方案:Unicode转义 前提是编码是UTF-8
为了规避动态生成JavaScript带来的风险,可以采取将字母和数字以外的所有字符都进行转义的方法
除了字母,数字,减号和点号 都进行转义
辅助方案:错误消息导致的信息泄露
在php.ini中做如下设置
display_errors = Off