javascript - URL 编码是否足以用于 href 属性以防止 XSS?
问题描述
根据OWASP,用户输入到 href 属性应该“......除了字母数字字符,使用 %HH 转义格式转义所有 ASCII 值小于 256 的字符。”
我不明白这背后的理由。为什么 URL 编码不能完成这项工作?我花了几个小时尝试为动态生成并呈现给用户的 URL 字符串创建攻击向量,对我来说,这似乎是针对 XSS 攻击的非常可靠的保护。
我也一直在研究这个问题,大多数人都建议将 URL 编码与 HTML 编码一起使用。我完全明白为什么 HTML 编码不足,因为仍然可以使用其他向量,例如onclick=alert()
有人可以向我展示一个攻击向量的示例,该攻击向量用于操纵使用 URL 编码和没有 HTML 编码或 owasp.org 在规则 #5 中建议的编码呈现的 href?
解决方案
不,如果有人注射,javascript:alert(0)
那么它会起作用。没有任何编码方法可以阻止这种情况,您应该尝试阻止 javascript URI 方案以及所有其他允许 XSS 存在的 URI 方案,data:
例如blob:
。
建议的操作是不要将用户输入直接反映到链接中。
此外,重要的是要记住不要简单地使用诸如preg_replace
换行符之类的东西来精确地阻止这些方案,因为它会绕过这个并产生 XSS 有效负载。比如:java%0a%0dscript:alert(0);
。如您所见,在负载中间放置了一个 CRLF 字符,以防止 PHP(或其他服务器端语言)将其识别为javascript:
您已阻止。但是 HTML 仍会将其呈现为javascript:alert(0);
CRLF 字符是空格并被 HTML 忽略(在元素属性的值内),但由 PHP 和其他语言解释。
推荐阅读
- django - Django覆盖模型保存方法返回旧数据
- svg - 我的 SVG 有什么问题 - 它不会填充线性渐变?
- snowflake-cloud-data-platform - 雪花 - 如何在雪花节点 sdk 的批量插入中使用 array_construct()
- python - 如何使用“重置”回调按钮将散景图形重置为其初始状态?
- c - 在C中按块重新分配char数组(字符串)
- python - 如何将名称文件引用为稍后在程序中打开的变量
- python - 为我的笔记本电脑添加电池管理功能
- javascript - 如何获取内容脚本来访问 chrome storage api
- angular - 无效的 CORS 请求:403 Forbidden Error Angular
- javascript - javascript中数组的长度是如何决定的?为什么这段代码中数组对象 person 的长度是 1?