Skip to content

输入过滤/反XSS

filter

我们提供了专用于输入过滤的 filter 全局公共函数。
应用请求对象类 app/Request 已经配置好了过滤规则,像这样:

php
// app/Request.php 文件
class Request extends \think\Request
{
    /**
     * 全局过滤规则
     * app/common.php 的 filter 函数
     */
    protected $filter = 'filter';

    // ...
}
  • 如果需要改变过滤规则,只需调用 $this->request->filter('strip_tags'); 重新设置过滤规则即可。
  • 默认的 filter 函数的定义如下:
php
function filter(string $string): string
{
    // 去除字符串两端空格(对防代码注入有一定作用)
    $string = trim($string);

    // 过滤html和php标签
    $string = strip_tags($string);

    // 特殊字符转实体,您可以使用公共函数 htmlspecialchars_decode_improve 还原这些特殊字符
    return htmlspecialchars($string, ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401, 'UTF-8');
}
  • filter 的返回值为 string,若需接受输入为其他类型,可以使用修饰符,比如 $this->request->get('id/d');,详见 TP文档
  • 我们使用了 strip_tags 过滤标签,这是为了更好(看)的输出,它的存在可能会造成 <、<=、未闭合标签 也被意外的过滤掉,您也可以考虑使用下方的 clean_xss 来过滤。
  • 经过全局公共函数 filter 过滤后的数据,可使用全局公共函数 htmlspecialchars_decode_improve 还原。

clean_xss

我们内置了一个反XSS公共函数,以便您随时使用。

使用示例

php
<?php

$harm_string = "Hello, i try to <script>alert('Hack');</script> your site";
$harmless_string = clean_xss($harm_string);
// string(26) "Hello, i try to your site"


$harm_string = "<IMG SRC=&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72&#x74&#x28&#x27&#x58&#x53&#x53&#x27&#x29>";
$harmless_string = clean_xss($harm_string);
// <IMG >


$harm_string = "<a href='&#x2000;javascript:alert(1)'>CLICK</a>";
$harmless_string = clean_xss($harm_string);
// <a >CLICK</a>

请求输入反XSS

设置之后,再接受的请求输入,就会使用它进行过滤了

php

$this->request->filter('clean_xss');

// 过滤了 XSS 的 $data
$data = $this->request->post();

clean_xss 通常用于富文本数据的过滤,使用可视化 CRUD 生成的富文本,默认已于控制器中配置使用本函数过滤,无需额外设置。

voku/anti-xss 依赖

框架内置了 voku/anti-xssclean_xss() 正是依赖它实现的,您也可以去它的主页查阅更多使用技巧。