【发布时间】:2015-05-12 21:56:33
【问题描述】:
我刚刚发现我的网站 (html/php) 容易受到 XSS 攻击。
除了手动将htmlspecialchars 添加到我发送到网页的每个单独变量之外,还有什么方法可以清理我的数据(并且可能会丢失一些变量,从而使其仍然容易受到攻击)?
【问题讨论】:
-
使用带有默认 htmlspecialchars 的模板引擎。
我刚刚发现我的网站 (html/php) 容易受到 XSS 攻击。
除了手动将htmlspecialchars 添加到我发送到网页的每个单独变量之外,还有什么方法可以清理我的数据(并且可能会丢失一些变量,从而使其仍然容易受到攻击)?
【问题讨论】:
不,没有捷径。数据转义总是需要根据具体情况进行;不仅针对 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 降级为纯序列化格式(无论如何都应该如此),它由序列化器生成,序列化器的唯一工作是将面向对象的数据结构转换为文本。没有办法通过错误的转义来搞乱这种语法。
【讨论】: