12

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

我一直在对这些库进行基准测试,它们非常密集,可能有点矫枉过正,我的应用程序不需要任何动态 HTML(由用户提交,bbtags 或其他任何东西,根本不需要)所以为什么不这样做:

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

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

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

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

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

if (hasHtmlTags(userData)) {
    // Do something?
} else {
    // Create entity.
}

所以用户仍然可以使用他们的表情符号 :< 等,并且只有在找到 < 和 > 的组合时才会触发该功能。所以没有昂贵的正则表达式之类的,只需禁用 < 和 > 组合就可以了。

4

4 回答 4

12

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

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

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

于 2012-10-09T12:02:42.743 回答
6

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

var string="<script>...</script>";
string=encodeURIComponent(string); // %3Cscript%3E...%3C/script%3
于 2012-10-09T12:10:58.350 回答
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');
}

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

但我建议你看看已经制作的用于净化输出的库:

https://github.com/ecto/bleach

于 2017-11-08T12:54:16.777 回答
0

您可以使用类似的功能

 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

于 2020-07-20T12:55:38.157 回答