4.10 读取输入
在实际开发过程中,存在一条黄金守则“永远不要相信用户的输入”,需要经常读取系统变量或者用户提交的数据,这些数据是不受信任的,很容易引起安全隐患,如果利用好ThinkPHP提供的变量输入功能,就可以避免这种问题了。
传统的变量读取方式:
$id = $_GET['id']; $username = $_POST['username']; $uid = $_SESSION['user_id']; $cookie = $_COOKIE['cookie']; $host = $_SERVER['HTTP_HOST'];
ThinkPHP框架中使用“I”函数进行变量的获取和过滤,函数定义如下:
I(’变量来源.变量名/修饰符’, [’默认值’], [’过滤方法’], [’额外数据源’])
变量来源指变量的来源数组,如来源于$_GET、$_POST,完整来源定义如表4-2所示。
表4-2
变量来源不区分大小写,变量名区分大小写。
以POST为例,说明I函数的使用:
echo I('post.username'); //等效于echo $_POST['username'];
1.默认值
echo I('post.username', 'admin'); //如果$_POST['username']为空,则输出“admin”
2.过滤方法
echo I('post.username', '', 'htmlspecialchars'); //等效于echo htmlspecialchars(empty($_POST['username'])? '': $_POST['username'])
I函数支持获取整个变量数组,如:I(‘post.')等效于$_POST。
如果在调用I函数时没有指定过滤方法,系统会采用配置“DEFAULT_FILTER”的值(默认为htmlspecialchars)作为函数进行过滤,该参数支持多个过滤函数,例如:
“DEFAULT_FILTER”=>'strip_tags, htmlspecialchars'
I(‘post.username')等效于htmlspecialchars(strip_tags($_POST[‘username'])),请注意函数调用顺序。
I函数的第三个参数如果传入的是函数名,则使用该函数对变量进行操作并返回操作结果(如果变量是数组,则使用array_map进行处理),否则调用PHP内置的filter_var方法进行处理,例如:I(‘post.email', '', FILTER_VALIDATE_EMAIL)等效于filter_var($_POST[‘email'], FILTER_VALIDATE_EMAIL)。
3.正则过滤
I('post.username', '', '/^[A-Za-z0-9]+$/');
如果正则匹配失败,返回默认值。
4.不进行任何过滤
某些情况下,不希望开启过滤功能,比如CMS系统中的文章内容,该内容由富文本编辑器生成,带有HTML标记,如果不做任何处理,该值会被ThinkPHP进行htmlspecialchars处理。使用I('post.content', ", false)来关闭过滤方法处理。
5.变量修饰符
在需要指定变量值的格式时,可以使用变量修饰符,可用修饰符如表4-3所示。
表4-3
使用方法如下:
I('post.username/s'); //强制转换username为字符串 I('post.uid/d'); //强制转换uid为整型