【问题标题】:shortcut to escaping to prevent XSS逃避XSS的捷径
【发布时间】:2015-05-12 21:56:33
【问题描述】:

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

【问题讨论】:

标签: php html xss


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    • 2011-03-10
    • 2012-03-25
    • 2018-06-14
    • 2011-06-01
    • 1970-01-01
    相关资源
    最近更新 更多