2012-10-09 83 views
3

有一个用于清理数据的Node.js项目,并且有一个用于处理消毒以防止XSS的JavaScript的OWASP库。我的应用程序不需要任何动态HTML(由用户提交,bbtags或者其他任何不需要的),所以为什么不这样做呢?为什么不这样做呢?为什么不这样做呢?为什么不这样做呢?为什么不这样做?这样的:Javascript XSS预防

  1. 禁用“<”和“>”字,不能代替或什么,只是禁用它们,如果用户提交这些,给他们一个警告,这些被禁用(客户端和服务器 - 侧验证)
  2. & =>&amp;
  3. " =>&quot;
  4. ' =>&#x27;
  5. / =>/
  6. 编码提交的URL(GET参数等)
  7. 基于自我的申请XSS覆盖
  8. DOM使用HTML5 pushState的和后端是完全与前端分开。

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

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

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

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

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

因此用户仍然可以使用他们的表情:<和这样的,而且功能只被触发如果<和>组合被发现。所以没有昂贵的正则表达式等,只是禁用<和>组合,我们应该没问题。

+0

我明白了,但用户不使用它是见于Ger.Offen,如果他们这样做,他们是不是必需的。所以我想,为什么不放过这些矫枉过正和禁用它们。 – onlineracoon

+0

它应该是足够的,[只要你指定你的字符编码](https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet#UTF-7_encoding)。 – user2428118

回答

4

这是一个普遍的编码程序:

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

如果用户没有提交任何东西到你的服务器,你甚至不需要以上。如果用户提交并且您正在使用用户输入,那么上面应该是安全的。只要'<'和'>'全球消毒,括号也是你的好去处。

+0

用户确实向服务器提交了东西,只是没有'<' and '>'字符。如果将它们消毒成为解决方案,那么为什么会有一整套OWASP备忘单? https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting))_Prevention_Cheat_Sheet – onlineracoon

+0

@onlineracoon - 请参阅[本节](https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet#Why_Can .27t_I_Just_HTML_Entity_Encode_Untrusted_Data.3F)备忘录 – Quentin

+2

owasp备忘录涵盖了XSS的所有可能场景。如果您不是在标签的定义(不是内容)内或在脚本标签内输出数据,那么您可以省略一大堆。 –

1

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

var string="<script>...</script>"; 
string=encodeURIComponent(string); // %3Cscript%3E...%3C/script%3 
+1

[escape is deprecated](https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Functions?redirectlocale=zh-CN&redirectslug=Core_JavaScript_1.5_Guide%2FFunctions#escape_and_unescape_functions) – Quentin

+0

'+ 1' to把事情弄直。如果答案不是错误的**,没有理由downvote。如果有更好的答案,他们将被提高。 – RASG

+1

答案是错的。如果有人输入'',他们不希望它被渲染为'%3Cscript%3E ...%3C/script%3'。它将特殊字符压入线噪声。您可以通过丢弃绝对的所有输入来阻止XSS,但这并不能解决问题。 – Quentin

0

考虑https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet

这里是他们的建议的实现:

function escapeOutput(toOutput){ 
    return toOutput.replace('&','&amp;').replace('<','&lt;').replace('>','&gt;').replace('"','&quot;').replace("'",'&#x27').replace('/','&#x2F'); 
} 

还要确保您使用此功能只在必要时,或者你可能打破一些东西。

但我建议你看一看已经取得库sanatizing输出:

https://github.com/ecto/bleach