PHPhtmlspecialchars不能防御前端innerHTML产生的XSS注入
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了PHPhtmlspecialchars不能防御前端innerHTML产生的XSS注入,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1723字,纯文字阅读大概需要3分钟。
内容图文
![PHPhtmlspecialchars不能防御前端innerHTML产生的XSS注入](/upload/InfoBanner/zyjiaocheng/206/6e13cf9068f34ed58a02bf9b7180c7c3.jpg)
即使这些内容已经经过服务器端PHP的htmlspecialchars或者HTMLPurifier过滤.
比如下面的代码,页面将alert弹出字符串/xss/,因为JS会把变量中的Unicode字符\u003c和\u003e转换成<和>输出.
//
$xss = '\u003cimg src=https://www.gxlcms.com/1 onerror=alert(/xss/)\u003e';
//XSS
$xss = '\u003ca href=javascript:alert(String.fromCharCode(88,83,83))\u003eXSS\u003c/a\u003e';
header('Content-Type: text/html;charset=utf-8');
?>
$(#xss).append(xss)跟$("#xss").html(xss)输出的都是HTML.
解决方法:
http://segmentfault.com/q/https://www.gxlcms.com/10https://www.gxlcms.com/1000000406752https://www.gxlcms.com/1
你说的对,毕竟很多时候要把AJAX加载的数据用innerHTML添加到页面.
值得注意的是,innerHTML本质也是输出HTML,
所以我们可以在输出前用JS像PHP的htmlspecialchars那样
把特殊字符(&,",',<,>)替换为HTML实体(&"'<>).
或者干脆直接用innerText(IE)和textContent(Firefox),也就是jQuery的text()来输出文本内容.
Firefox不支持IE的innerText,但支持textContent.
StackOverflow上找到的两个实现:
function htmlspecialchars(str) {
return str
.replace(/&/g, "&")
.replace(/</g, "<")
.replace(/>/g, ">")
.replace(/"/g, """)
.replace(/'/g, "'");
}
function htmlspecialchars(str) {
var map = {
'&': '&',
'<': '<',
'>': '>',
'"': '"',
"'": '''
};
return str.replace(/[&<>"']/g, function(k) { return map[k]; });
}
其中g表示全局(global)替换的意思,也就是把字符串中的所有匹配的内容都进行替换.
不过JS模仿PHP的htmlspecialchars是一刀切的方法,数据将丧失HTML特性.
请教下,对于前端AJAX(PJAX)过来后的HTML数据大家是怎么过滤XSS输出的呢? 和>
内容总结
以上是互联网集市为您收集整理的PHPhtmlspecialchars不能防御前端innerHTML产生的XSS注入全部内容,希望文章能够帮你解决PHPhtmlspecialchars不能防御前端innerHTML产生的XSS注入所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。