如何以及何时使用filter_xss()和check_plain()?


11

views-view-fields--magazine--magazine.tpl.php我的网站上有很多这样的模板文件。我应该如何以及何时使用filter_xss()和check_plain()来提高安全性?例如,这是代码:

<div>
    <div class="bf-header bf-article-header"><?php print $fields['title']->content; ?></div>
    <div class="bf-article-body"><?php print $fields['field_magazine_body']->content;?></div>
    <div class="bf-article-image"><?php print $fields['field_magazine_image']->content;?></div>
</div>
<div class="separator article-view-separator"></div>

如何在其中应用这些功能?


使用filter_xss()时要XSS过滤器从潜在危险的内容(即不受信任的用户内容),并且check_plain()当你想从一个字符串HTML特殊字符转义
克莱夫

Answers:


13

首先,在Drupal API中阅读这些内容:

因此,check_plain()将在HTML中具有特殊含义的特殊字符(例如<&)编码为纯文本实体(即&lt;&amp;),当该字符串作为页面的一部分与HTML标记。该函数filter_xss()过滤HTML字符串以防止跨站点脚本(XSS)漏洞。它做四件事:

  • 删除可能欺骗浏览器的字符和构造
  • 确保所有HTML实体格式正确
  • 确保所有HTML标记和属性格式正确
  • 确保没有HTML标签包含带有不允许的协议的网址(例如javascript :)

这两个功能都用于清除用户的数据,以确保在将数据呈现到您的站点之前消除了任何用户注入。

你永远传递相同的字符串通过两种

如果使用check_plain(),则应将传递给函数的字符串用作纯文本(而非HTML)。然后filter_xss()就不需要了,因为check_plain()它将始终使字符串为纯文本。

如果使用filter_xss(),则传递给该函数的字符串应该是HTML,check_plain()并将其弄乱。

当我查看用作示例的模板时,在我看来,传递给这三个字段的所有字段print()都来自已经经过消毒的内容,并且不再需要进行消毒。

但是,如果创建自己的模块来收集用户输入而不通过“安全的”文本过滤器(例如“过滤的HTML”或“纯文本”)传递用户输入,则必须将这些功能用于卫生目的。


在哪里可以检查用户输入?例如,存在一种内容类型,并且允许匿名用户创建此类节点。
妈妈D 2014年

@Drupalist,您永远不应允许匿名用户使用“不安全”文本格式。导航对管理»配置»内容创作»文本格式。Drupal随附的“安全”文本格式是“过滤的HTML”和“纯文本”。如果这些是匿名用户唯一允许的格式,Drupal将为您执行所有内置节点类型和使用核心字段功能创建的任何节点类型的必需检查。如果您的用例与此不同,请提出一个新问题以阐明用例。
自由基2014年

仅允许匿名用户使用plain text
M ama D 2014年

@Drupalist,很好。无需使用这些功能来清理纯文本。
自由基2014年

3
@ARUN,不。Drupal的标准做法是始终准确保存用户在数据库中键入的内容,并在渲染之前清理文本。
自由基
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.