onl*_*oon 5 javascript security xss sanitization node.js
有一个Node.js项目可以清理数据,还有一个用于JavaScript的OWASP库,用于处理清理以防止XSS.
我一直在对这些库进行基准测试,它们非常密集,也许是一种矫枉过正,我的应用程序不需要任何动态HTML(由用户提交,bbtags或者什么都不提供,根本不需要),所以为什么不这样做:
<"和" >"字符,不要替换它们或任何东西,只需禁用它们,如果用户提交这些字符,请向它们发出警告,禁用这些字符(客户端和服务器端验证)& => &" => "' => '/ => /这足以保护自己,正如我所说,我的应用程序不需要用户提交任何HTML,所以我根本不需要<和>标签.
感谢所有反馈,这就是我现在使用的:
var pattern = /<(.*)>/;
function hasHtmlTags(string) {
return pattern.test(string);
};
if (hasHtmlTags(userData)) {
// Do something?
} else {
// Create entity.
}
Run Code Online (Sandbox Code Playgroud)
因此,用户仍然可以使用他们的表情符号<等等,并且只有在找到<和>的组合时才会触发该函数.所以没有昂贵的正则表达式等,只需禁用<和>组合,我们应该没问题.
这是一个通用的编码程序:
var lt = /</g,
gt = />/g,
ap = /'/g,
ic = /"/g;
value = value.toString().replace(lt, "<").replace(gt, ">").replace(ap, "'").replace(ic, """);
Run Code Online (Sandbox Code Playgroud)
如果您的用户没有向您的服务器提交任何内容,您甚至不需要上述内容.如果用户提交并且您正在使用用户输入,则上述内容应该是安全的.只要'<'和'>'被全局消毒,括号也是你的好消息.
为什么不在encodeURIComponent向客户端发送数据之前使用?
var string="<script>...</script>";
string=encodeURIComponent(string); // %3Cscript%3E...%3C/script%3
Run Code Online (Sandbox Code Playgroud)
考虑到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, '/');
}
Run Code Online (Sandbox Code Playgroud)
还要确保仅在必要时使用此功能,否则可能会破坏某些东西。
但我建议您查看已制作的用于清理输出的库:
https://github.com/ecto/bleach