【问题标题】:How to sanitize JS and HTML in inputs? [closed]如何清理输入中的 JS 和 HTML? [关闭]
【发布时间】:2017-06-11 19:55:28
【问题描述】:

我到处寻找,但找不到一个简单的库或工具。

我想清理我网站上的 cmets。

目前,我可以通过 cmets 注入 HTML、CSS 和几乎任何我想要的东西。

<div id="commentsSection">
    <div class="submitCommentForm">
        <textarea id="commentsInput" required minlength="10" maxlength="150">
        </textarea>
        <div id="submitComment">SUBMIT</div>
    </div>
    <div id="commentsBox"></div>
</div>

最好的方法是什么?

【问题讨论】:

  • 使用正则表达式去除标签和不允许的字符
  • 你的意思是清理 cmets,比如避免脏话?
  • 只是一个建议。前后端都要做好卫生。前端卫生,它将改善用户体验。后端安全卫生。
  • @AHB 太好了!但我也想清理可以在输入中编写的 js 代码

标签: javascript html css


【解决方案1】:

因为 JavaScript 可以被禁用,所以清理不是前端的操作;此任务应在后端执行。最佳实践说...

  • 验证输入(前端)
    • 在提交前确保数据符合您的预期
  • 清理输入(后端)
    • 在后端使用意味着在不安全字符到达应用程序的存储层之前转义或删除它
  • 转义输出(后端)
    • 作为一项额外的安全措施,在输出之前,请务必避开来自第 3 方来源的任何内容

我们鼓励您在前端验证数据输入,通知用户在尝试提交无效数据时不允许使用某些字符。如果 JavaScript 随后被禁用,您的后端仍会知道如何处理格式错误的数据。

【讨论】:

  • 这个答案是从其他地方指出来的,我在这里提供一些想法来反驳它。从广义上讲,这里担心的是恶意用户会出于恶意目的注入 HTML 或 JavaScript。此处的指导也仅适用于应用程序 接受 HTML 的情况(如果是,那么这是一个不同的问题)。考虑到这一点,假设我被要求在注册页面中输入用户名。如果我想被称为
  • 所以,这可以存储在数据库中,绝对没有不良影响。确实,这些 cmets 很好地说明了正确操作 - 我可以注入各种打开标签,但它们会转义到输出层的 HTML 实体中。这让我想知道最后一项是否不是理想的建议 - 转义在输出层是必不可少的,它不是一个支持。
  • 数据也应该在到达应用程序的存储层之前进行清理,因为 SQL 注入等漏洞。仅在输出时转义是不够的。见w3schools.com/sql/sql_injection.asp
  • 啊,肯尼斯,我知道我们可能会在哪里谈论不同的目的 - 感谢您的澄清。 SQL 注入应该使用参数绑定来处理,而不是清理——清理是删除字符,通常我们不希望这样。例如,如果将姓氏“O'Reilly”注入 SQL 中会混淆数据库解析器 - 但我们不想删除(清理)撇号。
  • 然而,一些非常偏执的用例(例如银行)对输入进行清理,即使这样做是“错误的”。例如,一家银行可能会告诉我我的用户名中不能有尖括号,并将它们去掉。但是,正如 Stack Overflow 所示,您可以非常安全地在用户名中使用尖括号,因为它是导致安全问题的输出层。
【解决方案2】:

如果您想要更彻底的检查,NPM 包 sanitize-html 是我以前使用过的包。

【讨论】:

  • 链接应该是 cmets,而不是答案。
  • 您仍然可以在浏览器中使用它,如果您不使用 webpack 等,它会给出说明。
  • @AHB 没看到那是我的遗憾。不过,这对我来说似乎有点太宽容了:/
猜你喜欢
  • 1970-01-01
  • 2010-12-07
  • 2018-03-24
  • 2011-07-27
  • 1970-01-01
  • 1970-01-01
  • 2016-11-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多