【问题标题】:Make sure user doesn't put in malicious html in code确保用户没有在代码中放入恶意 html
【发布时间】:2013-05-28 13:59:09
【问题描述】:

我正在使用文本区域来获取用户的输入并将其显示在屏幕上。如果他们放入类似

的内容,我如何确定
<h1>YAY, I hacked in</h1>

我只按原样显示它,它不显示为&lt;h1&gt;。必须有一个功能。帮助? :D

【问题讨论】:

  • 在您的服务器上使用XML Parser 并剥离/验证输入。 你不使用 RegEx,是吗!?
  • 创建一个文本节点,将其值设置为用户输入,然后追加到页面中
  • 小心:如果有人想破解你,浏览器中的清理/验证可以很容易地绕过。您还必须在服务器端代码中进行类似的检查。

标签: javascript html web


【解决方案1】:

正如我所评论的,如果您要将该数据发送到服务器,您应该使用各种可用的 XML 解析器 之一,然后剥离 + 验证输入。

但是,如果您需要纯粹在客户端进行验证,我建议您使用document.implementation.createHTMLDocument,它会在堆栈上创建一个完全成熟的 DOM 对象。然后您可以在那里操作并return 验证数据。

例子:

function validate( input ) {
    var doc   = document.implementation.createHTMLDocument( "validate" );

    doc.body.innerHTML = input;

    return [].map.call( doc.body.querySelectorAll( '*' ), function( node ) {
        return node.textContent;
    }).join('') || doc.body.textContent;
}

这样称呼

validate( "<script>EVIL!</script>" );

【讨论】:

  • 使用document.implementation.createHTMLDocument 比使用普通 DOM 元素或文档片段更好吗?
  • @FlorianMargaine 实际上与文档片段非常相似。但是,您可以在此处使用您在默认文档中执行的任何操作。您可以从字面上将整个 HTML 文档加载到这个东西中并对其进行操作。至少应该比&lt;iframe&gt; 更轻量级。
【解决方案2】:

您需要在服务器端解决这个问题。如果您在表单提交时使用 JavaScript 进行过滤,用户可以通过创建自己的页面、使用 telnet、禁用 JavaScript、使用 Chrome/FF/IE 控制台等来颠覆您的过滤器。如果您在显示时进行过滤,您就没有没有减轻任何影响,您只是在页面上移动了断点。

例如,在 PHP 中,如果您只想将原始字符转储出去,而无需任何用户格式,您可以使用:

print htmlentities($user_submitted_data, ENT_NOQUOTES, 'utf-8');

在 .NET 中:

someControl.innerHTML = Server.HtmlEncode(userSubmittedData);

如果您尝试清理内容客户端以便立即/预览显示,这应该足够了:

out.innerHTML = user_data.replace(/</g, "&lt;").replace(/>/g, "&gt;");

【讨论】:

  • 请记住,最后一个建议不会清理文本以发送给其他访问者。它的唯一合法目的是为文本输入用户提供准确的提交前预览他们的条目。
  • 好的。如果您使用 PHP 表单并通过 GET 提交信息,mysql_real_escape_string 将是清理字符串的合法方式,对吧?
  • 这是一种在 [My]SQL 查询中清理用于插值的字符串的合法方法。在将插入的值发送到客户端之前,您仍然需要对它们执行 HTML/JavaScript 清理。
猜你喜欢
  • 2011-06-02
  • 1970-01-01
  • 1970-01-01
  • 2019-02-01
  • 2012-12-11
  • 1970-01-01
  • 1970-01-01
  • 2017-02-12
  • 1970-01-01
相关资源
最近更新 更多