Javascript XSS预防

onl*_*oon 5 javascript security xss sanitization node.js

有一个Node.js项目可以清理数据,还有一个用于JavaScript的OWASP库,用于处理清理以防止XSS.

我一直在对这些库进行基准测试,它们非常密集,也许是一种矫枉过正,我的应用程序不需要任何动态HTML(由用户提交,bbtags或者什么都不提供,根本不需要),所以为什么不这样做:

  1. 禁用" <"和" >"字符,不要替换它们或任何东西,只需禁用它们,如果用户提交这些字符,请向它们发出警告,禁用这些字符(客户端和服务器端验证)
  2. & => &amp;
  3. " => &quot;
  4. ' => &#x27;
  5. / => /
  6. 编码提交的URL(GET参数等)
  7. 由于我的应用程序使用HTML5 PushState并且后端与前端完全分离,因此涵盖了基于DOM的XSS.

这足以保护自己,正如我所说,我的应用程序不需要用户提交任何HTML,所以我根本不需要<>标签.

感谢所有反馈,这就是我现在使用的:

var pattern = /<(.*)>/;

function hasHtmlTags(string) {
    return pattern.test(string);
};

if (hasHtmlTags(userData)) {
    // Do something?
} else {
    // Create entity.
}
Run Code Online (Sandbox Code Playgroud)

因此,用户仍然可以使用他们的表情符号<等等,并且只有在找到<和>的组合时才会触发该函数.所以没有昂贵的正则表达式等,只需禁用<和>组合,我们应该没问题.

Kon*_*nev 8

这是一个通用的编码程序:

var lt = /</g, 
    gt = />/g, 
    ap = /'/g, 
    ic = /"/g;
value = value.toString().replace(lt, "&lt;").replace(gt, "&gt;").replace(ap, "&#39;").replace(ic, "&#34;");
Run Code Online (Sandbox Code Playgroud)

如果您的用户没有向您的服务器提交任何内容,您甚至不需要上述内容.如果用户提交并且您正在使用用户输入,则上述内容应该是安全的.只要'<'和'>'被全局消毒,括号也是你的好消息.

  • owasp cheatsheet涵盖了XSS的所有可能方案.如果您没有在标签的定义(非内容)或脚本标签内输出数据,那么您可以省略其中的大量数据. (2认同)

jap*_*ott 6

为什么不在encodeURIComponent向客户端发送数据之前使用?

var string="<script>...</script>";
string=encodeURIComponent(string); // %3Cscript%3E...%3C/script%3
Run Code Online (Sandbox Code Playgroud)

  • 答案是错误的。如果有人输入 `&lt;script&gt;...&lt;/script&gt;`,他们不希望它被呈现为 `%3Cscript%3E...%3C/script%3`。它将特殊字符分解为行噪声。您可以通过完全丢弃所有输入来防止 XSS,但这并不能解决问题。 (3认同)

Hyb*_*s95 5

考虑到https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html

这是他们建议的实施:

function escapeOutput(toOutput){
    return toOutput.replace(/\&/g, '&amp;')
        .replace(/\</g, '&lt;')
        .replace(/\>/g, '&gt;')
        .replace(/\"/g, '&quot;')
        .replace(/\'/g, '&#x27')
        .replace(/\//g, '&#x2F');
}
Run Code Online (Sandbox Code Playgroud)

还要确保仅在必要时使用此功能,否则可能会破坏某些东西。

但我建议您查看已制作的用于清理输出的库:

https://github.com/ecto/bleach