首页 » 安全知识库 » WEB安全原理 » SQL 注入 » 正文

PHP SQL注入基本防御

1,参数转义

1.1 数字型参数强

SQL语句中需要拼接一个数字型参数的时候,使用intval() 将参数强制转换为整形。

$id = intval($_GET['id']);
$getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'";
$result = mysql_query($getid) or die('<pre>' . mysql_error() . '</pre>' );

1.2 字符型参数转义

数据库字符集为UTF-8时,使用mysql_escape_string()进行转义

mysql_query('SET NAMES utf-8')
$id = $_GET['id'];
$id = mysql_escape_string($id);
$getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'";
$result = mysql_query($getid) or die('<pre>' . mysql_error() . '</pre>' );

数据库字符集为GBK时,使用mysql_real_escape_string()进行转义,或者使用SET character_set_client=binary

mysql_query('SET NAMES GBK')
$id = $_GET['id'];
$id = mysql_real_escape_string($id);
$getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'";
$result = mysql_query($getid) or die('<pre>' . mysql_error() . '</pre>' );

mysql_query('SET character_set_client=binary')
$id = $_GET['id'];
$getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'";
$result = mysql_query($getid) or die('<pre>' . mysql_error() . '</pre>' );

2,参数绑定

使用参数绑定来处理SQL语句,类似的方法还有很多,下图的样例供参考。

3,二阶注入

场景:

接收用户数据 –> 加密或者转义后存入数据库 –> 其他功能在获取该数据后解密并带入SQL语句中 –> 触发SQL注入漏洞 

建议:

在无论数据从哪一个地方获取得到的,在拼接SQL语句的时候都要进行安全处理(强转或字符转义)。

发表评论