【问题标题】:Not all eligible encoding using htmlentities并非所有符合条件的编码都使用 htmlentities
【发布时间】:2013-05-22 08:17:27
【问题描述】:

我正在使用 PHP 5.3.6 并使用 HTML 实体对一些 POST 数据进行编码。但是,括号和 % 不编码为它们的等效实体。

网络安全团队告诉我们,必须对这些字符进行编码,因为它们可能被用于 XSS 攻击。

正在发布的数据:

paren ( ) & % won't encode

htmlentities($_POST['first_name'], ENT_QUOTES, "UTF-8");

输出:

paren ( ) & % won't encode

如您所见, ( ) % 未受影响。

提前致谢。

-编辑- 这就是我最终使用的完成这项工作的东西。谢谢。

function stripcustomchars($encode_chars) {  
    $searches = array('%','(',')');  
    $replacements = array("%","(",")");  
    $encoded = str_replace($searches, $replacements,$encode_chars);  
    return $encoded;
}

【问题讨论】:

    标签: php xss html-entities


    【解决方案1】:

    网络安全团队告诉我们,必须对这些字符进行编码,因为它们可能被用于 XSS 攻击。

    如果您将数据插入 HTML(例如,与 JavaScript 相对),那么除了 <>&" 和 @987654325 之外的任何内容都不是这样@ (尽管这些都可能是矫枉过正,这取决于上下文)。 htmlspecialchars 对于大多数情况来说已经足够了(尽管要注意旧的 IE 及其 UTF-7 漏洞)。

    如果您要将数据插入 HTML 以外的其他内容(例如 URI 或 JavaScript),那么您需要为目标语言使用编码例程,而不是为 HTML 使用编码例程。 (尽管如果您随后将 HTML 编码插入 HTML(例如,将用户数据插入 JavaScript 到 HTML 脚本元素中),则可能需要使用 HTML 编码)。

    【讨论】:

    • 我在使用htmlspecialchars 时尝试与他们争论这一点。如果表单验证失败,数据将被回显到表单字段中。
    【解决方案2】:

    括号和百分号是不是 HTML 中的特殊字符,它们没有特殊含义。因此,htmlentities 不会碰它们。如果您仍然想对它们进行编码,则需要手动str_replace 它们。但同样,在纯 HTML 上下文中这样做是没有意义的。

    【讨论】:

    • 感谢 deceze。您为我指出了正确的方向,以下对我有用,已添加上面的代码。
    猜你喜欢
    • 1970-01-01
    • 2021-02-09
    • 2014-10-29
    • 2014-07-04
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多