/ php

ModernPHP 过滤、验证和转义

html

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

<?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注入漏洞。下面将描述一个错误的例子:

<?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字符。

<?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 系列全集:传送门