转义的快捷方式以防止XSS

时间:2015-03-11 07:44:49

标签: php html xss

我刚刚发现我的网站(html / php)容易受到XSS攻击 有没有办法清理我的数据,除了手动将htmlspecialchars添加到我发送到网页的每个变量(并且可能会丢失一些因此使其仍然可以进行攻击)?

1 个答案:

答案 0 :(得分:2)

不,没有捷径。数据转发总是需要根据具体情况进行;不仅涉及HTML,还涉及任何其他文本格式(SQL,JSON,CSV,whathaveyou)。 “技巧”是使用工具,不需要你考虑这么多,因此可能让你“错过”一些东西。如果你只是将echo字符串转换成其他字符串,那么你就是在裸机上工作,你需要有很多有意识的努力来逃避一切。普遍接受的替代方案是使用模板语言隐含地逃避一切。

例如,Twig

  

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降级为纯序列化格式(无论如何应该是这样),它是由序列化程序生成的,它的唯一工作就是将面向对象的数据结构转换为文本。通过糟糕的转义,没有办法搞砸那种语法。