0x00 关闭错误提示
PHP配置文档中php.ini的 display_errors=off 即关闭错误提示
0x01 魔术引号
当php.ini里的magic_quotes_gpc=On时。提交的变量中所有的单引号(’)、双引号(”)、反斜线()与 NUL(NULL 字符)会自动转为含有反斜线的转义字符。
魔术引号(Magic Quote)是一个自动将进入 PHP 脚本的数据进行转义的过程。(对所有的 GET、POST 和 COOKIE 数据自动运行转义)
PHP 5.4 之前 PHP 命令 magic_quotes_gpc 默认是 on。
本特性已自PHP 5.3.0 起废弃并将自 PHP 5.4.0 起移除,在PHP 5.4.O 起将始终返回 FALSE。
magic_quotes_gpc与addslashes的区别用法:对于magic_quotes_gpc=on的情况:
我们可以不对输入和输出数据库的字符数据作 addslashes()和stripslashes()的操作,数据也会正常显示。
如果此时对输入的数据作了addslashes()处理,那么在输出的时候就必须使用stripslashes()去掉多余的反斜杠。
对于magic_quotes_gpc=off的情况
必须使用addslashes()对输入数据进行处理,但并不需要使用stripslashes()格式化输出。因为addslashes()并未将反斜杠一起写入数据库,只是帮助mysql完成了sql语句的执行。
参考:
《magic_quotes_gpc相关说明》:
0x02 addslashes()
作用: 返回在预定义字符之前添加反斜杠的字符串。这个函数的作用和magic_quotes_gpc一样。所以一般用addslashes前会检查是否开了magic_quotes_gpc。
预定义字符:单引号(')
双引号(")
反斜杠()
NULL
tips: 该函数可用于为存储在数据库中的字符串以及数据库查询语句准备字符串。
注意: php默认地对所有get、post和cookie数据自动运行addlashes()。所以不应对已转义过的字符串使用addslashes(), 因为这样会导致双层转义。遇到这种情况时可以使用get_magic_quotes_gpc()进行检测。
语法:addslashes(string)参数描述string必需。规定要转义的字符串。
返回值:返回已转义的字符串。
PHP 版本:4+
0x03 mysql_real_escape_string()
作用:转义SQL 语句中使用的字符串中的特殊字符。
下列字符受影响:x00
n
r
'
"
x1a
如果成功,则该函数返回被转义的字符串。如果失败,则返回false。
语法:mysql_real_escape_string(string,connection)参数描述string必须,规定要转义的字符
connection可选,规定mysql的连接,如果未给,则使用上一个连接
本扩展自 PHP5.5.0 起已废弃,并在自 PHP 7.0.0 开始被移除。
因为完全性问题,建议使用拥有Prepared Statement机制的PDO和MYSQLi来代替mysql_query,使用的是mysqli_real_escape_string
0x04 htmlspecialchars()
作用: 把预定义的字符转换为HTML实体
预定义字符:
& --> &
" --> "
' --> '
< --> <
> --> >
0x05 用正则匹配替换来过滤指定的字符
preg_match
preg_match_all()
preg_replace
0x06 转换数据类型
说明:
根据“检查数据类型”的原则,查询之前要将输入数据转换为相应类型,如uid都应该经过intval函数格式为int型
0x07 使用预编译语句
说明:
绑定变量使用预编译语句是预防SQL注入的最佳方式,因为使用预编译的SQL语句语义不会发生改变,在SQL语句中,变量用问号?表示,攻击者无法改变SQL语句的结构,从根本上杜绝了SQL注入攻击的发生。