PHP的addslashes 函数详解

一、前言

      博主在接受新代码的时候,发现代码中频繁使用addslashes 这个函数,说实话,博主在之前还真没怎么用过这个函数,所以这里总结一下它的大致用法。这类安全性的函数某种意义上也代表了咱们的水平吧,能考虑到这点,并且会用就可以。

二、函数的解释

1、概念

概念请参考该博客:https://www.cnblogs.com/yingww/p/4290849.html

2、引申

========================= 旧的博客 ==============================================

      对PHP程序来说,还有个魔术引号的概念(自php5.40之后被移除),这个属于php.ini的配置,意义是:

当 magic_quotes_gpc 打开时,所有的 ‘ (单引号), ” (双引号), (反斜线) and 空字符会自动转为含有反斜线的溢出字符。

magic_quotes_gpc设置是否自动为GPC(get,post,cookie)传来的数据中的’”加上反斜线。可以用get_magic_quotes_gpc()检测系统设置。它的功能就是给数据库查询语句等的需要在某些字符前加上了反斜线。

链接:https://www.jb51.net/article/104699.htm

=============================== 2019年3月11日补充 ==================================
关于魔术引号:

      PHP 5.4.0 起移除魔术引号,由于魔术引号的存在,会影响我们程序的可移植性,对于有些在该配置开启下的代码,当移植到该配置没有开启的服务器环境下的话,就会引发很多问题。由于并不是每一段被转义的数据都要插入数据库的,如果所有进入 PHP 的数据都被转义的话,那么会对程序的执行效率产生一定的影响。

      目前来说,使用addslashes()函数更加的灵活一些,对于程序的性能来说也比开启魔术引号要好很多。

      这部分多谢热心网友的提醒,我自己写的时候,也不够认真,后面又查询了一些资料,才发现这个魔术引号的概念早就取消了。。好吧,这里再次拜谢shanksred同学的提醒,一起进步!

三、一般在哪里用

        (1)输出数据的时候  (结合使用,输出的时候用htmlspecialchars()函数输出,可以转换html代码为实体,尽量安全一些)
		(2)查出数据,要继续使用并存储的时候 (存储一些带特殊字符的字符串时)
		(3)接收用户传过来的参数的时候  (这部分是防止用户输入特殊字符或者html代码等。最好是前端做好正则匹配,从开始就限制好)
		(4)https://zhidao.baidu.com/question/446575573.html (存数据库,不转义就存不进去)
		(5)就是防止sql注入(防止用户输出的sql语句直接操作数据库)

四、需要注意的地方

            (1)现在使用addslashes 函数已经不能完全防止sql注入了。   http://www.php.cn/php-weizijiaocheng-362949.html   
			(2)在使用之前,先确定php配置文件那个是否是关着的。防止双层转义。  http://blog.51cto.com/5iwww/516981	
			(3)mysql_real_escape_string 这个函数也是php提供的专门用户防止数据库攻击的过滤函数,比addslashes 更加严格一些。:文档地址:http://www.w3school.com.cn/php/func_mysql_real_escape_string.asp
			(4)目前来讲,addslashes 是可以被黑客绕过去的,所以在防止sql注入方面的效果不尽人意,建议尽量使用PDO的prepare方式

这部分后面都带的有链接,大家可以看一看,了解下这个函数的一些特点以及目前的不足。

五、关于pdo预防sql注入

1、关于pdo防止sql注入的原理

这部分有一篇博客写的很好,这里推荐给大家:https://my.oschina.net/zxu/blog/148432

2、我们目前使用的主流框架是否自带了过滤

      目前我们主流使用的框架,包括laravel,Yii,TP等,这些框架是否都自带了过滤方法呢?比如我们在接收参数或者输出参数的时候,是否框架已经帮我们做好了转义?还是说我们必须自己再多加一层转义呢?

(1)关于TP框架

TP框架使用htmlspecialchars函数默认过滤,比如TP的"I"函数
参考:https://blog.csdn.net/china1223/article/details/51953668
(2)关于Yii框架和laravel框架

      YII框架确实在输入中没有过滤,但是在输出中过滤了,用Html::encode()和HtmlPurifier::process方法,同样的类似laravel等框架也都是在输出时过滤,而不是在输入时过滤(在模板{}中过滤),目前主流的方法都是在输出时过滤,因为输入时就是普通的文本,存入数据库时没有任何影响,而输出时才能展示破坏的威力。TP框架在输入时采用了htmlspecialchars过滤函数。 框架比较好的地方在于在操作数据库使用的PDO的prepare方式,更加的安全

      也就是说,目前用主流的框架,比如laravel或者yii等,基本在操作数据库那一步是安全的(已经对PDO进行了封装)。在正式操作数据库之前,我们也可以自己对数据进行过滤,争取达到 安全的目的。如果是逻辑非常复杂,必须要用原生的sql的话,那么请在过滤字符和转义上面多下点功夫吧。

end

你可能感兴趣的:(php日常bug)