总结3:PHP中的魔术引号

阅读PHP框架源码时发现很多框架都对魔术引号做了兼容处理,总结如下:


1、魔术引号的作用是什么?

        魔术引号设计的初衷是为了让从数据库或文件中读取数据和从请求中接收参数时,对单引号、双引号、反斜线、NULL加上一个一个反斜线进行转义,这个的作用跟addslashes()的作用完全相同。


2、转义的作用?

        正确地接收和读取数据,从而正确地执行SQL语句,防止恶意的SQL注入。

        简单的SQL注入示例,假设有一个数据库user,我们要传一个参数查询某个用户的信息,我们会调用某个接口,传一个参数给接口,类似于http://域名/?c=xxx&a=xxx&user=xxx,现在我们想查询一个叫codeman的人的信息,那么user=codeman,后台接收到参数之后,执行类似于下面的SQL语句。

    SELECT * FROM `user` WHERE `user` = 'codeman';

        如果在接收数据时后台不进行转义,那么久可能让恶意的SQL注入攻击发生,假设我们现在传递一个user=codeman'or'1'='1,传到后台执行的SQL语句变成:

    SELECT * FROM `user` WHERE `user` = 'codeman' or '1' or '1';

        这时返回的数据不只是user=codeman的用户的数据了,而是整个表中的所有数据,你的用户数据就暴露给攻击者了。如果有对单引号、双引号、反斜线等特殊字符进行转义,则大大减少SQL攻击的可能性。


3、为什么在PHP5.4.0之后取消了魔术引号特性?

        既然魔术引号这么方便,为什么在PHP5.4.0及其之后PHP版本中被取消了呢?有以下几个原因:

(1)可移植性

        编程时认为其打开或并闭都会影响到移植性。可以用 get_magic_quotes_gpc() 来检查是否打开,并据此编程。 


(2)性能

        由于并不是每一段被转义的数据都要插入数据库的,如果所有进入 PHP 的数据都被转义的话,那么会对程序的执行效率产生一定的影响。在运行时调用转义函数(如 addslashes())更有效率。 尽管 php.ini-dist 默认打开了这个选项,但是 php.ini-recommended 默认却关闭了它,主要是出于性能的考虑。 


(3)方便


        由于不是所有数据都需要转义,在不需要转义的地方看到转义的数据就很烦。比如说通过表单发送邮件,结果看到一大堆的 '。针对这个问题,可以使用 stripslashes() 函数处理。 


4、php.ini相关配置

魔术引号配置选项 描述 运行时改变 PHP中的默认值
magic_quotes_gpc

如果打开的话,影响 到 HTTP 请求数据(GET,POST 和 COOKIE)。

no on
magic_quotes_runtime 如果打开的话,大部 份从外部来源取得数据并返回的函数,包括从数据库和文本文件,所返回的数据都会被反斜线转义。(前提是magic_quotes_gpc = On no off
magic_quotes_g

当关闭时,所有的 (单引号),"(双引号),(反斜线)和 NULL 字符都会被自动加上一个反斜线进行转义。这和 addslashes() 作用完全相同。

如果打开的话,将会使用单引号对单引号进行转义而非反斜线。此选项会完全覆盖 magic_quotes_gpc。如果同时打开两个选项的话,单引号将会被转义成 。而双引号、反斜线 和 NULL 字符将不会进行转义。

(前提是magic_quotes_gpc = On)

yes off

set_magic_quotes_runtime(),设置当前magic_quotes_runtime 配置选项的激活状态,0为关闭,1为开启。啥意思呢?这样理解,如是set_magic_quotes_runtime(1)或是配置文件中magic_quotes_runtime为true(这个在php.ini中配置),那么php脚本读取文件或是从数据库中读取数据,遇到反斜线(\)、单引号(')、双引号(")、NULL时,会在前面自动加上转义字符,变成\\、\'、\”、\NULL;若是关闭的话,也就是set_magic_quotes_runtime(0)magic_quotes_runtime为false,那么便会转义,此时可以借助addslashes进行转义。


magic_quotes_gpc(),当此值为1时,会对HTTP请求中的G($_GET)、P($_POST)、C($_COOKIE)单双引号和反斜线进行转义;反之则不会。该操作一般见于表单提交的数据库操作,若是值为0时,便用addslashes进行转义存入数据库中,取出时再用stripslashes函数把反斜线给去掉。

PS.在PHP 5.4版本时,魔术引号被移除了,因此转义都需要加上addslashes函数。



这里是华农人的编程社区,欢迎关注SCAU-码农之家!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值