转义防止XSS的捷径

shortcut to escaping to prevent XSS

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

不,没有捷径。数据转义总是需要根据具体情况进行;不仅涉及 HTML,还涉及任何其他文本格式(SQL、JSON、CSV,等等)。 "trick" 是使用不需要您考虑这么多的工具,因此可能允许您 "miss" 一些东西。如果您只是 echo 将字符串转换成其他字符串,那么您是在裸机级别工作,您确实需要大量有意识的努力来逃避一切。普遍接受的替代方法是使用隐式转义所有内容的模板语言。

例如,Twig:

The PHP language is verbose and becomes ridiculously verbose when it comes to output escaping:

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

In comparison, Twig has a very concise syntax, which make templates more readable:

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

To be on the safe side, you can enable automatic output escaping globally or for a block of code:

{% 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-syntax并将在[=级别处理所有用户数据35=],而不是串汤。这将 HTML 降级为纯序列化格式(无论如何它应该是),它由序列化程序生成,其唯一工作是将面向对象的数据结构转换为文本。无法通过错误的转义来搞乱该语法。