最近做一个文章发布系统,突然发现我的PHP基础只是很薄弱,尤其是保存文章content部分的时候经常出现转义问题。
首先我们需要对POST和GET数据做自动转义过滤,那么我们需要判断服务器是否开启了自动转义,否则我们可能出现重复转义。
if ( ! get_magic_quotes_gpc() ) {
function clean($data) {
if (empty($data))
return $data;
else
return is_array($data) ? array_map('clean', $data) : addslashes($data);
}
if (!empty($_GET)) {
$_GET = clean($_GET);
}
if (!empty($_POST)) {
$_POST = clean($_POST);
}
$_COOKIE = clean($_COOKIE);
$_REQUEST = clean($_REQUEST);
}
情况1:
通过上面的操作我们得到的数据就已经自动转义的
比如POST的text数据: this” is a test
那么$_POST[‘text’]: this\” is a test
在入库时候后mysql值会自动去掉转义的符号,而显示 this” is a test
入库的时候如果再做了一次mysql_real_escape_string 则会显示 this\” is a test
也就是说mysql_real_escape_string和addslashes只要选择一种使用
据说mysql_real_escape_string会更加安全一些,但是这个函数必须在mysql连接以后才使用。所以大部分源码都采用addslashes。
情况2:
如果这个时候我们需要保存的是文章关键词,或者文章标题。
假若填写的POST使用的title为: 为什么1 + 2 > 2 “一种证明方案”
这里出现了大于号和引号,那么我们就应该在入库的时候将大于号转化成> 双引号转化成"这样读取以后才不会出现html代码。这时候我们就需要使用htmlspecailchars()这个函数。
function escape($data, $quotestyle=ENT_COMPAT) {
if (is_array($data)) {
foreach ($data as $key => $value) {
unset($data[$key]);
$data[escape($key)] = escape($value);
}
} else {
$data = htmlspecialchars($data, $quotestyle, 'UTF-8');
}
return $data;
}
入库后则显示:为什么1 + 2 > 2 "一种证明方案"