用户输入过滤

普通数据过滤
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 实体转换为普通字符串. 具体的转换范围可以通过函数的第二个参数指定.
与此类似的函数还有htmlentitieshtml_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
posted @ 2019-08-20 17:34  有风来  阅读(620)  评论(0编辑  收藏  举报