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