Php中有许多数据是从页面用户输入的,后台处理的时候要先进行必要的过滤,过滤用filter函数。
函数 | 描述 | PHP |
检查是否存在指定输入类型的变量。 | 5 | |
返回指定过滤器的 ID 号。 | 5 | |
从脚本外部获取输入,并进行过滤。 | 5 | |
从脚本外部获取多项输入,并进行过滤。 | 5 | |
返回包含所有得到支持的过滤器的一个数组。 | 5 | |
获取多项变量,并进行过滤。 | 5 | |
获取一个变量,并进行过滤。 | 5 |
PHP Filters
ID 名称 | 描述 |
调用用户自定义函数来过滤数据。 | |
去除标签,去除或编码特殊字符。 | |
"string" 过滤器的别名。 | |
URL-encode 字符串,去除或编码特殊字符。 | |
HTML 转义字符 '"<>& 以及 ASCII 值小于 32 的字符。 | |
删除所有字符,除了字母、数字以及 !#$%&'*+-/=?^_`{|}~@.[] | |
删除所有字符,除了字母、数字以及 $-_.+!*'(),{}|\\^~[]`<>#%";/?:@&= | |
删除所有字符,除了数字和 +- | |
删除所有字符,除了数字、+- 以及 .,eE。 | |
应用 addslashes()。 | |
不进行任何过滤,去除或编码特殊字符。 | |
在指定的范围以整数验证值。 | |
如果是 "1", "true", "on" 以及 "yes",则返回 true,如果是 "0", "false", "off", "no" 以及 "",则返回 false。否则返回 NULL。 | |
以浮点数验证值。 | |
根据 regexp,兼容 Perl 的正则表达式来验证值。 | |
把值作为 URL 来验证。 | |
把值作为 e-mail 来验证。 | |
FILTER_VALIDATE_IP | 把值作为 IP 地址来验证。 |
1、filter_has_var()
判断页面上是否存在指定类型的变量(html表单中name的值)
如下例:
Login.html
<input type="type" name="names">
Filter.php
$cont = $_GET[names];
if (filter_has_var(INPUT_GET, names)) {
echo "<BR>has names var";
}else{
echo "<BR>hasn't names var!";
}
2、filter_var()
Login.html
<form action="filter.php" method="get">
输入内容:<input type="type" name="input">
<input type="submit" name="submit">
</form>
Filter.php
$cont = $_GET['input'];
if (filter_var($cont, FILTER_VALIDATE_INT)) {
<span style="white-space:pre"> </span>echo "<BR>input value is integer!";
}else{
<span style="white-space:pre"> </span>echo "<BR>input value is not integer!";<pre name="code" class="html"><span style="font-family: Arial, Helvetica, sans-serif;">}</span>
$cont变量的值如果是int类型的数据就进入if里面,否则进入到else里面。
3、选项和标志用于指定的过滤器添加额外的过滤选项:
Login.html
$cont = $_GET['myfile'];
<span style="white-space:pre"> </span>$int_options = array(
<span style="white-space:pre"> </span>"options"=>array(
<span style="white-space:pre"> </span>"min_range"=>0,
<span style="white-space:pre"> </span>"max_range"=>300
<span style="white-space:pre"> </span>)
);
Filter.php
if (filter_has_var(INPUT_GET, 'myfile')) {
<span style="white-space:pre"> </span>echo "<BR>has myfile var";
<span style="white-space:pre"> </span>if (filter_var($cont, FILTER_VALIDATE_INT, $int_options)) {
<span style="white-space:pre"> </span>echo "<BR>Integer is valid!";
<span style="white-space:pre"> </span>}else{
<span style="white-space:pre"> </span>echo "<BR>Integer is not valid!";
<span style="white-space:pre"> </span>}
}else{
<span style="white-space:pre"> </span>echo "<BR>hasn't myfile var!";
}
4、邮件类型判断:
一般filter_has_var和filter_var结合起来使用,先判断指定类型的变量是否存在,然后再判断变量的类型,如判断是否是邮件类型:
$cont = $_GET['myfile'];
if (filter_has_var(INPUT_GET, 'myfile')) {
<span style="white-space:pre"> </span>echo "<BR>has myfile var";
<span style="white-space:pre"> </span>if (filter_var($cont, FILTER_VALIDATE_EMAIL)) {
<span style="white-space:pre"> </span>echo "<BR>myfile value is email type!";
<span style="white-space:pre"> </span>}else{
<span style="white-space:pre"> </span>echo "<BR>input value is not email type!";
<span style="white-space:pre"> </span>}
}else{
<span style="white-space:pre"> </span>echo "<BR>hasn't myfile var!";
}
5、Url地址净化:
try {
<span style="white-space:pre"> </span>if (filter_has_var(INPUT_GET, 'url')) {
<span style="white-space:pre"> </span>$url = $_GET['url'];
<span style="white-space:pre"> </span>echo "<BR>url 字段在表单中存在!";
<span style="white-space:pre"> </span>echo filter_input(INPUT_GET, 'url',FILTER_SANITIZE_URL);
<span style="white-space:pre"> </span>}else{
<span style="white-space:pre"> </span>throw new Exception("<BR>url 字段在表单中不存在!");
<span style="white-space:pre"> </span>}
} catch (Exception $e) {
<span style="white-space:pre"> </span>echo "<BR>Message :".$e->getMessage();
}
6、过滤多个输入:
$filters = array(
"name"=>array("filter"=>FILTER_SANITIZE_STRING),
"age"=>array(
"filter"=>FILTER_VALIDATE_INT,
"option"=>array(
"min_range"=>1,
"max_range"=>120
)
),
"email"=>FILTER_SANITIZE_EMAIL
);
$result = filter_input_array(INPUT_GET, $filters);
if (!$result['age']) {
echo "<BR>Age must be a number between 1 and 120.<br />";
}elseif (!$result['email']){
echo "E-Mail is not valid.<br />";
}else{
echo "User input is valid";
}
上面的这个例子有三个通过“get”方法传送的输入变量(name,age,email)
(1)设置一个数组,其中包含了输入变量的名称,以及用于指定的输入变量的过滤器
(2)调用filter_input_array函数,参数包括GET输入变量及刚才设置的数组
(3)检测$result变量中的“age”和“email”变量是否有非法的输入。(如果存在非法输入,)filter_input_array()函数的第二个参数可以使数组或单一过滤器的ID。
如果该参数是单一过滤器的ID,那么这个指定的过滤器会过滤输入数组中所有的值。
如果该参数是一个数组,那么次数组必须遵循下面的规则:
必须是一个关联数组,其中包含的输入变量是数组的键(比如“age”输入变量)
次数组的值必须是过滤器的ID,或者是规定了过滤器、标志以及选项的数组
7、Filter Callback
通过使用FILTER_CALLBACK过滤器,可以调用自定义的函数,把它作为一个过滤器来使用。这样就拥有了数据过滤的完全控制权。
function convertSpace($string){
return str_replace("_", " ", $string);
}
function callbackLee(){
$string = "Peter_is_a_great_guy!";
echo filter_var($string,FILTER_CALLBACK, array("options"=>"convertSpace"));
}//end func callbackLee
echo "<BR><BR>";
callbackLee();
这个例子把所有的“_”转换为空格:
首先创建一个把“_”替换为空格的函数;
然后调用filter_var()函数,它的参数是FILTER_CALLBACK过滤器以及包含我们的函数的数组