PHP防SQL注入

PHP应用程序和数据库进行交互必然要通过SQL,当SQL查询的参数来源于外部传输的时候,拼接SQL则会有被注入的风险。通常手段就是通过单引号或者双引号,使得SQL判定参数值到此结束,后面的输入即可作为SQL子句解析执行,我们称之为引号出逃。既然可以把输入的字串作为SQL执行那危害就大了,不仅可以绕过用户登录,更严重的可以扒窃数据,删除数据。

以下总结一些防御方法:

一、验证数据

根据相关业务场景判断参数是否合法,如判断ID是否为正整数,订单号是否符合相关正则,枚举值是否in_array。这种方法受限于业务场景,但是是最简单有效的防御方法,也是必要的步骤,由业务开发人员负责编写。

二、特殊字符转义

对单引号()、双引号()、反斜线(\)与 NUL(NULL 字符)等特殊字符添加反斜线转义。addslashes()、mysqli_real_escape_string()、配置魔术引号(magic_quotes_gpc,自 PHP 5.3.0 起废弃并将自 PHP 5.4.0 起移除)。

addslashes:转义字符:\x00,\,’,”。 当数据库服务端、客户端和服务端传输使用GBK编码时会有注入风险(参见:【PHP防SQL注入不要再用addslashes和mysql_real_escape_string了】)。统一使用UTF-8的情况下不用考虑,而且效率较其他方法高。

mysqli_real_escape_string:转义字符:\x00,\n,\r,\,’,” 和 \x1a,同时计及连接的当前字符集。

magic_quotes_gpc配置:废弃原因:1、服务器配置,只能在系统级关闭,不能在运行时,影响整个应用的逻辑代码,使得程序移植性较差;2、所有Get/Post/Cookie参数统统转义,性能较差;3、有时候需要疯狂的stripslashes。

三、预处理语句和参数化查询

使用PDO或mysqli的prepared statements。

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注