Javascript XSS预防
有一个Node.js项目可以清理数据,还有一个用于JavaScript的OWASP库可以处理清理以防止XSS 我一直在对这些库进行基准测试,它们非常密集,可能有些过分,我的应用程序不需要任何动态HTML(由用户提交、bbtags或其他任何东西,根本不需要),所以为什么不这样做:Javascript XSS预防,javascript,security,node.js,xss,sanitization,Javascript,Security,Node.js,Xss,Sanitization,有一个Node.js项目可以清理数据,还有一个用于JavaScript的OWASP库可以处理清理以防止XSS 我一直在对这些库进行基准测试,它们非常密集,可能有些过分,我的应用程序不需要任何动态HTML(由用户提交、bbtags或其他任何东西,根本不需要),所以为什么不这样做: 禁用“”字符,不要替换它们或任何东西,只需禁用它们,如果用户提交这些字符,则向它们发出警告,说明这些字符已被禁用(客户端和服务器端验证) &=>& “=>” ”=>&x27 /=>/ 对提交的URL进行编码(获取参
”字符,不要替换它们或任何东西,只需禁用它们,如果用户提交这些字符,则向它们发出警告,说明这些字符已被禁用(客户端和服务器端验证)&
=>&代码>
“
=>”
”
=>&x27代码>
/
=>/
标记
感谢所有反馈,这是我现在使用的:
var pattern = /<(.*)>/;
function hasHtmlTags(string) {
return pattern.test(string);
};
if (hasHtmlTags(userData)) {
// Do something?
} else {
// Create entity.
}
var模式=/;
函数hasHtmlTags(字符串){
返回模式.test(字符串);
};
if(hasHtmlTags(userData)){
//做点什么?
}否则{
//创建实体。
}
因此用户仍然可以使用他们的表情:<等等,并且只有在找到<和>的组合时才会触发该功能。所以没有昂贵的正则表达式之类的,只要组合禁用
var lt = /</g,
gt = />/g,
ap = /'/g,
ic = /"/g;
value = value.toString().replace(lt, "<").replace(gt, ">").replace(ap, "'").replace(ic, """);
var lt=/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
var string=“…”;
string=encodeURIComponent(string);/%3Cscript%3E…%3C/脚本%3
考虑
以下是他们建议的实施情况:
function escapeOutput(toOutput){
return toOutput.replace(/\&/g, '&')
.replace(/\</g, '<')
.replace(/\>/g, '>')
.replace(/\"/g, '"')
.replace(/\'/g, ''')
.replace(/\//g, '/');
}
函数转义输出(toOutput){
返回到输出。替换(/\&g,&;'))
.替换(/\/g'')
.替换(/\“/g,”))
.替换(/\'/g''')
.替换(//\//g,/');
}
还要确保只有在必要时才使用此功能,否则可能会损坏某些东西
但我建议您看看已经制作的用于sanatizing输出的库:
您可以使用以下函数
function htmlEncode(str){
return String(str).replace(/[^\w. ]/gi, function(c){
return '&#'+c.charCodeAt(0)+';';
});
}
然后,您将按如下方式使用此函数:
<script>document.body.innerHTML = htmlEncode(untrustedValue)</script>
<script>document.write('<script>x="'+jsEscape(untrustedValue)+'";<\/script>')</script>
然后,您将按如下方式使用此函数:
<script>document.body.innerHTML = htmlEncode(untrustedValue)</script>
<script>document.write('<script>x="'+jsEscape(untrustedValue)+'";<\/script>')</script>
document.write('x=“”+jsEscape(不可信值)+'”;'))
更多信息:我明白了,但用户通常不会使用它,如果他们这样做,它们就不是必需的。所以我想,为什么不省去多余的功能并禁用它们。这应该足够了,.too
+1
来澄清问题。如果答案没有错,就没有理由否决。如果有更好的答案,他们将被否决。答案是这是错误的。如果有人输入…
,他们不希望它被呈现为%3Cscript%3E…%3C/script%3
。它会将特殊字符转换为行噪波。您可以通过完全丢弃所有输入来防止XSS,但这并不能解决问题。谢谢@RASG!@Quentin;是的,如果您有一个内联编辑器,这将有助于解决问题是这样的。但这不仅仅是Ineracon的问题。这是关于XSS的。因此,他想阻止userA编写在userB上执行的脚本。如果他在向userB发送HTML时使用encodeURI,那将是“丑陋”的。是的,但userB会看到它……就像你会按照公认的答案用HTML实体替换它们一样。关于“丢弃所有输入“。他还可以关闭网站以防止XSS;”@rahil471这不是重点,因为即使数据本身看起来很奇怪,用户也会将其视为星期一10
。用户确实会向服务器提交内容,只是没有“”字符。如果对它们进行消毒是解决办法,为什么会有一整张OWASP备忘单@OnlineRacon-请参阅备忘单的内容owasp备忘单涵盖XSS的所有可能方案。如果您没有在标记的定义(而不是内容)或脚本标记中输出数据,那么您可以省略大量数据。@KonstantinD Infrastics我更新了我的答案,请检查它。@OnlineRacon您应该对您所拥有的一切都满意。