--begin by itlife365
thinkphp php中的反斜杠函数magic_quotes_gpc是否开启,自动添加反斜杠
php中的反斜杠是开启好还是关闭好?如果开启的话,那每次从数据库中取出的数据不是都要stripslashes?会不会很麻烦?
昨天用thinkphp做了个cms的小程序,本地测试正常但是传到网站后发现,提交内容保存的时候会自动在双引号前面增加一个反斜杠“\”,而且每保存一次增加一个反斜杠,很是郁闷。
原来PHP程序为了防止注入或者溢出,通过PHP 指令 magic_quotes_gpc自动在双引号、单引号、反斜杠、NULL前面添加反斜杠“\”。
但是我们日常输入的信息免不了有很多引号和双引号,这时候就要去掉添加的反斜杠。
默认PHP 指令 magic_quotes_gpc是on的,也就是打开的。这时候就可以用stripslashes() 函数删除自动添加的反斜杠。用法就是:比如包含字符串的变量是$str,那么就用stripslashes() 函数处理一下这个字符串:stripslashes($str),输出的结果就是去掉反斜杠的。
由于thinkphp在数据入库时未判断 magic_quotes_gpc是否开启,而直接进行了转义。
解决办法就是可以使用函数 get_magic_quotes_gpc() 进行检测,如果是打开的状态,那么就去除反斜杠,如果是关闭的状态,则不去除反斜杠。
1、平常php的处理程序代码如下:
$str=$_POST["str"];//读取str的内容赋值给$str变量
if(get_magic_quotes_gpc())//如果get_magic_quotes_gpc()是打开的
{
$str=stripslashes($str);//将字符串进行处理
}
2、如果服务器是自己的,自己可以修改php.ini的话,自己关闭即可。
3、thinkphp
ThinkPHP自动转义的解决方法
办法1:在baseAction中自动执行
public function _initialize()
{
//去除转义 不用系统的自动转义
if (get_magic_quotes_gpc()) {
$this->mystrip(&$_POST);
$this->mystrip(&$_GET);
}
//去除转义方法
public function mystrip($data){
if (is_array($data)){
foreach ($data as &$v){
$this->mystrip(&$v);
}
}else{
$data = stripslashes($data);
}
}
h或者在每次接收数据的时候处理,比如:
$data['content'] = stripslashes(htmlspecialchars_decode($_POST['content']))
办法2:是在入口文件增加如下代码则可:(该方法未测试,供参考)
if (!get_magic_quotes_gpc()) {
function addslashes_deep($value) {
$value = is_array($value) ?
array_map('addslashes_deep', $value) :
addslashes($value);
return $value;
}
$_POST = array_map('addslashes_deep', $_POST);
$_GET = array_map('addslashes_deep', $_GET);
$_COOKIE = array_map('addslashes_deep', $_COOKIE);
$_REQUEST = array_map('addslashes_deep', $_REQUEST);
}
在 PHP 5.4 中,magic_quotes 的相关配置项已经被剔除!这就意味着如果需要,我们必须手动对数据添加魔术引号。
这就告诉我们,这个 magic_quotes 的作用其实多余的,官方不再建议使用,如果有需要,手动添加即可。
----end by itlife365