PHP过滤器filter

本文详细介绍了PHP中过滤用户输入数据的方法,包括filter_has_var、filter_var等函数的使用,以及如何过滤变量类型、邮件类型和URL地址,确保网站安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Php中有许多数据是从页面用户输入的,后台处理的时候要先进行必要的过滤,过滤用filter函数。

 

函数

描述

PHP

filter_has_var()

检查是否存在指定输入类型的变量。

5

filter_id()

返回指定过滤器的 ID 号。

5

filter_input()

从脚本外部获取输入,并进行过滤。

5

filter_input_array()

从脚本外部获取多项输入,并进行过滤。

5

filter_list()

返回包含所有得到支持的过滤器的一个数组。

5

filter_var_array()

获取多项变量,并进行过滤。

5

filter_var()

获取一个变量,并进行过滤。

5

 

PHP Filters

ID 名称

描述

FILTER_CALLBACK

调用用户自定义函数来过滤数据。

FILTER_SANITIZE_STRING

去除标签,去除或编码特殊字符。

FILTER_SANITIZE_STRIPPED

"string" 过滤器的别名。

FILTER_SANITIZE_ENCODED

URL-encode 字符串,去除或编码特殊字符。

FILTER_SANITIZE_SPECIAL_CHARS

HTML 转义字符 '"<>& 以及 ASCII 值小于 32 的字符。

FILTER_SANITIZE_EMAIL

删除所有字符,除了字母、数字以及 !#$%&'*+-/=?^_`{|}~@.[]

FILTER_SANITIZE_URL

删除所有字符,除了字母、数字以及 $-_.+!*'(),{}|\\^~[]`<>#%";/?:@&=

FILTER_SANITIZE_NUMBER_INT

删除所有字符,除了数字和 +-

FILTER_SANITIZE_NUMBER_FLOAT

删除所有字符,除了数字、+- 以及 .,eE

FILTER_SANITIZE_MAGIC_QUOTES

应用 addslashes()

FILTER_UNSAFE_RAW

不进行任何过滤,去除或编码特殊字符。

FILTER_VALIDATE_INT

在指定的范围以整数验证值。

FILTER_VALIDATE_BOOLEAN

如果是 "1", "true", "on" 以及 "yes",则返回 true,如果是 "0", "false", "off", "no" 以及 "",则返回 false。否则返回 NULL

FILTER_VALIDATE_FLOAT

以浮点数验证值。

FILTER_VALIDATE_REGEXP

根据 regexp,兼容 Perl 的正则表达式来验证值。

FILTER_VALIDATE_URL

把值作为 URL 来验证。

FILTER_VALIDATE_EMAIL

把值作为 e-mail 来验证。

FILTER_VALIDATE_IP

把值作为 IP 地址来验证。

 

1filter_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!";
}

2filter_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,或者是规定了过滤器、标志以及选项的数组

 

7Filter 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过滤器以及包含我们的函数的数组

 

 

 

 Login.html
Filter.php 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值