我刚刚发现我的网站(html / php)容易受到XSS攻击
有没有办法清理我的数据,除了手动将htmlspecialchars
添加到我发送到网页的每个变量(并且可能会丢失一些因此使其仍然可以进行攻击)?
答案 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降级为纯序列化格式(无论如何应该是这样),它是由序列化程序生成的,它的唯一工作就是将面向对象的数据结构转换为文本。通过糟糕的转义,没有办法搞砸那种语法。