普通数据过滤
PHP 内置过滤函数:
addsclashes 函数和 stripcslashes 函数
addcslashes($input, $charlist): 使用反斜线转义字符串 input 中的指定字符串. charlist 由指定字符组成的字符串.
stripcslashes($input): 反转义由 addcslashes 转义的字符串.
示例:
// 需要执行SQL语句 $id = $_GET['id']; $sql = "select * from user where id =\"{$id}\""; // 如果用户输入: 123"; delete from user where 1="1 // 未经过滤直接执行的SQL语句为: echo $sql; // 输出: select * from user where id ="123";delete from user where 1="1", 实际执行了查询和删除两条语句. // 过滤用户输入 $id = addcslashes($id, "'\".*?;%"); // 将'、"、.、*、?、;、%都转义 echo $sql; // 输出: select * from user where id ="123\"\;delete from user where 1=\"1", 最终只能执行一条查询语句
htmlspecialchars 函数和 htmlspecialchars_decode
htmlspecialchars($input): 将指定字符串中的指定字符串转换为 HTML 实体. 具体的转换范围可以通过函数的第二个参数指定.
htmlspecialchars_decode($input): 将字符串中的 HTML 实体转换为普通字符串. 具体的转换范围可以通过函数的第二个参数指定.
与此类似的函数还有htmlentities和html_entity_decode函数, 这两个函数的转换范围更大.
strip_tags 函数
strip_tags($input): 去除字符串中的空字符、HTML 和 PHP 标记. 可以通过第二个参数指定需要保留的 HTML 和 PHP 标记.
$text = '<p>Test paragraph.</p><!-- Comment --> <a href="#fragment">Other text</a>'; echo strip_tags($text); echo "\n"; // 允许 <p> 和 <a> echo strip_tags($text, '<p><a>');
富文本过滤
在使用普通方式过滤富文本数据无法达到目的时, 可以通过第三方插件过滤富文本数据. 如 HTMLPurifier 富文本过滤器, 官网: http://htmlpurifier.org/
header('Content-type: text/plain; charset=utf-8'); require_once './htmlpurifier/library/HTMLPurifier.auto.php'; $html = "<div> <h1>标题</h1> <p>段落</p> <hr/> <span>行内文本</span> <a href='path/img.jpg'>a标签</a> <br/> <script>alert('js代码')</script> </div>"; // 白名单模式, 只保留HTML中的指定标签: p标签和带href属性的a标签 $config = HTMLPurifier_Config::createDefault(); $config->set('HTML.Allowed', 'p, a[href]'); // 第二个参数设置为null即允许所有HTML标签, 设置为空字符串即禁止所有HTML标签 $config->set('AutoFormat.RemoveEmpty', true); // 移除空标签 $purifier = new HTMLPurifier($config); $cleanHtml = $purifier->purify($html); echo $cleanHtml;
HTMLPurifier 支持多种过滤规则, 这些规则都是通过设置 config 对象实现. config 支持的设置具体参考: http://htmlpurifier.org/live/configdoc/plain.html