[英]Javascript XSS Prevention
有一个 Node.js 项目可以清理数据,还有一个用于处理清理以防止 XSS 的 JavaScript 的 OWASP 库。
我一直在对这些库进行基准测试,它们非常密集,可能有点矫枉过正,我的应用程序不需要任何动态 HTML(由用户、bbtags 或其他任何东西提交,根本不需要)所以为什么不这样做:
<
”和“ >
”字符,不要替换它们或任何东西,只是禁用它们,如果用户提交这些,给他们一个警告,这些被禁用(客户端和服务器端验证)&
=> &
"
=> "
'
=> '
/
=> /
这是否足以保护我自己,正如我所说,我的应用程序不需要用户提交任何 HTML,所以我根本不需要<
和>
标签。
感谢所有反馈,这是我现在使用的:
var pattern = /<(.*)>/;
function hasHtmlTags(string) {
return pattern.test(string);
};
if (hasHtmlTags(userData)) {
// Do something?
} else {
// Create entity.
}
所以用户仍然可以使用他们的表情符号 :< 等,并且只有在找到 < 和 > 的组合时才会触发该功能。 所以没有昂贵的正则表达式之类的,只需禁用 < 和 > 组合,我们应该没问题。
这是一个通用的编码过程:
var lt = /</g,
gt = />/g,
ap = /'/g,
ic = /"/g;
value = value.toString().replace(lt, "<").replace(gt, ">").replace(ap, "'").replace(ic, """);
如果您的用户没有向您的服务器提交任何内容,您甚至不需要上述内容。 如果用户提交并且您正在使用用户输入,则上述内容应该是安全的。 只要 '<' 和 '>' 是全局消毒的并且括号也是你的好去处。
为什么不在将数据发送到客户端之前使用encodeURIComponent
呢?
var string="<script>...</script>";
string=encodeURIComponent(string); // %3Cscript%3E...%3C/script%3
考虑到https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html
这是他们建议的实施:
function escapeOutput(toOutput){
return toOutput.replace(/\&/g, '&')
.replace(/\</g, '<')
.replace(/\>/g, '>')
.replace(/\"/g, '"')
.replace(/\'/g, ''')
.replace(/\//g, '/');
}
还要确保仅在必要时使用此功能,否则可能会破坏某些东西。
但我建议您查看已制作的用于清理输出的库:
您可以使用类似的功能
function htmlEncode(str){
return String(str).replace(/[^\w. ]/gi, function(c){
return '&#'+c.charCodeAt(0)+';';
});
}
然后,您将按如下方式使用此函数:
<script>document.body.innerHTML = htmlEncode(untrustedValue)</script>
如果您的输入在 JavaScript 字符串中,则需要一个执行 Unicode 转义的编码器。 这是一个示例 Unicode 编码器:
function jsEscape(str){
return String(str).replace(/[^\w. ]/gi, function(c){
return '\\u'+('0000'+c.charCodeAt(0).toString(16)).slice(-4);
});
}
然后,您将按如下方式使用此函数:
<script>document.write('<script>x="'+jsEscape(untrustedValue)+'";<\/script>')</script>
更多信息: https : //portswigger.net/web-security/cross-site-scripting/preventing
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.