转义以防止 XSS 的快捷方式


shortcut to escaping to prevent XSS

我刚刚发现我的网站(html/php)容易受到XSS攻击。
除了手动向我发送到网页的每个变量添加htmlspecialchars之外,还有什么方法可以清理我的数据(并且可能缺少一些,从而使它仍然容易受到攻击)?

不,没有捷径。数据转义始终需要根据具体情况进行;不仅关于HTML,而且关于任何其他文本格式(SQL,JSON,CSV,whathaveyou)。"诀窍"是使用不需要您考虑太多的工具,因此可能会让您"错过"某些东西。如果您只是将字符串echo到其他字符串中,那么您是在裸机级别工作,并且确实需要大量有意识的努力来逃避一切。普遍接受的替代方案是使用隐式转义所有内容的模板语言。

例如,树枝:

PHP语言很冗长,当它变得非常冗长时 来到输出转义:

<?php echo $var ?>
<?php echo htmlspecialchars($var, ENT_QUOTES, 'UTF-8') ?>

相比之下,Twig 有一个非常简洁的语法,这使得 模板更具可读性:

{{ var }}
{{ var|escape }}
{{ var|e }}         {# shortcut to escape a variable #}

为了安全起见,您可以全局或为代码块启用自动输出转义:

{% autoescape true %}
    {{ var }}
    {{ var|raw }}     {# var won't be escaped #}
    {{ var|escape }}  {# var won't be doubled-escaped #}
{% endautoescape %}

这仍然让你在脚上开枪,但要好得多。

更进一步的是PHPTAL:

<div class="item" tal:repeat="value values">
  <div class="title">
    <span tal:condition="value/hasDate" tal:replace="value/getDate"/>
    <a tal:attributes="href value/getUrl" tal:content="value/getTitle"/>
  </div>
  <div id="content" tal:content="value/getContent"/>
</div>

它要求你编写有效的 HTML 来编译模板,模板引擎完全了解 HTML 语法,并将在 DOM 级别处理所有用户数据,而不是字符串汤。这将HTML降级为纯序列化格式(无论如何都应该如此),该格式由序列化器生成,其唯一工作是将面向对象的数据结构转换为文本。没有办法通过错误的转义来弄乱语法。