ModernPHP 过滤、验证和转义

php自带有验证过滤方法,可以满足大部分的使用场景,不用再自己写正则了。

html

使用htmlentities()函数过滤html输入,它会将字符转换成html实体。但是在默认情况下,htmlentities()函数不会转义单引号,也检测不出输入字符串的字符集。所以正确的使用方式是额外传入2个参数,即第一个参数是输入的字符串,第二个参数设为ENT_QUOTES常量,转义单引号,第三个参数设为输入字符串的字符集。

1
2
3
4
5
6
7
8
<?php
$str = "A 'quote' is <b>bold</b>";

// Outputs: A 'quote' is &lt;b&gt;bold&lt;/b&gt;
echo htmlentities($str);

// Outputs: A &#039;quote&#039; is &lt;b&gt;bold&lt;/b&gt;
echo htmlentities($str, ENT_QUOTES);

SQL查询

一个低级而常见的错误即是将原始输入数据直接拼接成SQL查询语句,这将导致程序产生SQL注入漏洞。下面将描述一个错误的例子:

1
2
3
4
5
<?php 
$sql = sprintf(
'UPDATE users SET passwd='%s' WHERE id=%s',
$_POST['passwd'],
$_GET['id'] );

这时,假如用户构造恶意的输入数据,例如passwd=abc";--,所有用户的密码都将会被设置为abc,很多数据库把--当做注释符。使用PDO预处理语句可以防止这种情况的发生,关于PDO预处理在后面的文章中将讲到。

用户资料信息

PHP提供了filter_var()filter_input()函数来过滤不同类型的输入:电子邮件地址,URL编码字符串,整数,浮点数,HTML字符,URL和特定范围内的ASCII字符。

1
2
3
4
5
<?php 
// Outputs: string(15) &quot;bob@example.com&quot;
var_dump(filter_var('bob@example.com', FILTER_VALIDATE_EMAIL));
// Outputs: bool(false)
var_dump(filter_var('http://example.com', FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED));

filter_var()函数如果验证成功,会返回验证的值,如果验证失败,返回false。

ModernPHP 系列全集:传送门

0%