Appearance
输入过滤/反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=javascript:alert('XSS')>";
$harmless_string = clean_xss($harm_string);
// <IMG >
$harm_string = "<a href=' 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-xss,clean_xss()
正是依赖它实现的,您也可以去它的主页查阅更多使用技巧。