如果用户输入未经修改就插入到SQL查询中,则应用程序很容易受到SQL注入的攻击,如下例所示:
$unsafe_variable = $_POST['user_input'];
mysql_query("INSERT INTO `table` (`column`) VALUES ('$unsafe_variable')");
这是因为用户可以输入类似值的内容);DROP TABLE表;--,并且查询变为:
INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')
可以采取什么措施防止这种情况发生?
安全警告:此答案不符合安全最佳实践。转义不足以防止SQL注入,请改用准备好的语句。使用以下概述的策略,风险自负。(此外,在PHP7中删除了mysql_real_ascape_string()。)不推荐使用警告:mysql扩展目前不推荐使用。我们建议使用PDO扩展
我使用三种不同的方法来防止我的web应用程序容易受到SQL注入的攻击。
使用mysql_real_aescape_string(),这是PHP中的一个预定义函数,此代码为以下字符添加反斜杠:\x00、\n、\r、\、'、“和\x1a。将输入值作为参数传递,以最大限度地减少SQL注入的机会。最先进的方法是使用PDO。
我希望这对你有帮助。
考虑以下查询:
$iId=mysql_real_ascape_string(“1或1=1”);$sSql=“SELECT*FROM table WHERE id=$iId”;
mysql_real_aescape_string()在这里不起保护作用。如果在查询中的变量周围使用单引号(“”),则可以防止这种情况发生。下面是一个解决方案:
$iId=(int)mysql_real_aescape_string(“1或1=1”);$sSql=“SELECT*FROM table WHERE id=$iId”;
这个问题有一些很好的答案。
我建议,使用PDO是最好的选择。
编辑:
自PHP 5.5.0起,mysql_real_aescape_string()已被弃用。使用mysqli或PDO。
mysql_real_aescape_string()的替代方法是
string mysqli_real_escape_string ( mysqli $link , string $escapestr )
例子:
$iId = $mysqli->real_escape_string("1 OR 1=1");
$mysqli->query("SELECT * FROM table WHERE id = $iId");
不推荐的警告:这个答案的示例代码(与问题的示例代码一样)使用了PHP的MySQL扩展,该扩展在PHP 5.5.0中被弃用,在PHP 7.0.0中被完全删除。安全警告:此答案不符合安全最佳实践。转义不足以防止SQL注入,请改用准备好的语句。使用以下概述的策略,风险自负。(此外,在PHP7中删除了mysql_real_ascape_string()。)
使用PDO和MYSQLi是防止SQL注入的好方法,但如果您真的想使用MySQL函数和查询,最好使用
mysql_real_reape_string
$unsafe_variable = mysql_real_escape_string($_POST['user_input']);
还有更多的功能可以防止这种情况:比如识别-如果输入是字符串、数字、字符或数组,那么有很多内置函数可以检测这种情况。此外,最好使用这些函数来检查输入数据。
is_string(is_string)
$unsafe_variable = (is_string($_POST['user_input']) ? $_POST['user_input'] : '');
是数字(_N)
$unsafe_variable = (is_numeric($_POST['user_input']) ? $_POST['user_input'] : '');
使用这些函数来检查mysql_real_aescape_string中的输入数据要好得多。
有许多方法可以防止SQL注入和其他SQL攻击。你可以很容易地在互联网上找到它(谷歌搜索)。当然,PDO是一个很好的解决方案。但我想建议您一些防止SQL注入的良好链接。
什么是SQL注入以及如何防止
SQL注入PHP手册
Microsoft对PHP中SQL注入和预防的解释
还有一些类似于防止MySQL和PHP的SQL注入。
现在,为什么需要防止SQL注入查询?
我想告诉您:为什么我们要通过下面的一个简短示例来防止SQL注入:
查询登录身份验证匹配:
$query="select * from users where email='".$_POST['email']."' and password='".$_POST['password']."' ";
现在,如果有人(黑客)
$_POST['email']= admin@emali.com' OR '1=1
和密码。。。。
查询将被解析到系统中,直到:
$query="select * from users where email='admin@emali.com' OR '1=1';
另一部分将被丢弃。那么,会发生什么?未经授权的用户(黑客)可以以管理员身份登录,而无需密码。现在,他/她可以做管理员/电子邮件管理员可以做的任何事情。看,如果不阻止SQL注入,这是非常危险的。
安全警告:此答案不符合安全最佳实践。转义不足以防止SQL注入,请改用准备好的语句。使用以下概述的策略,风险自负。(此外,在PHP7中删除了mysql_real_ascape_string()。)
警告:mysql扩展名此时被删除。我们建议使用PDO扩展
使用此PHP函数mysql_escape_string(),您可以快速获得良好的预防效果。
例如:
SELECT * FROM users WHERE name = '".mysql_escape_string($name_from_html_form)."'
mysql_escape_string-转义用于mysql_query的字符串
为了更好地预防,您可以在末尾添加。。。
wHERE 1=1 or LIMIT 1
最后你得到:
SELECT * FROM users WHERE name = '".mysql_escape_string($name_from_html_form)."' LIMIT 1
安全警告:此答案不符合安全最佳实践。转义不足以防止SQL注入,请改用准备好的语句。使用以下概述的策略,风险自负。(此外,在PHP7中删除了mysql_real_ascape_string()。)不推荐使用警告:mysql扩展目前不推荐使用。我们建议使用PDO扩展
我使用三种不同的方法来防止我的web应用程序容易受到SQL注入的攻击。
使用mysql_real_aescape_string(),这是PHP中的一个预定义函数,此代码为以下字符添加反斜杠:\x00、\n、\r、\、'、“和\x1a。将输入值作为参数传递,以最大限度地减少SQL注入的机会。最先进的方法是使用PDO。
我希望这对你有帮助。
考虑以下查询:
$iId=mysql_real_ascape_string(“1或1=1”);$sSql=“SELECT*FROM table WHERE id=$iId”;
mysql_real_aescape_string()在这里不起保护作用。如果在查询中的变量周围使用单引号(“”),则可以防止这种情况发生。下面是一个解决方案:
$iId=(int)mysql_real_aescape_string(“1或1=1”);$sSql=“SELECT*FROM table WHERE id=$iId”;
这个问题有一些很好的答案。
我建议,使用PDO是最好的选择。
编辑:
自PHP 5.5.0起,mysql_real_aescape_string()已被弃用。使用mysqli或PDO。
mysql_real_aescape_string()的替代方法是
string mysqli_real_escape_string ( mysqli $link , string $escapestr )
例子:
$iId = $mysqli->real_escape_string("1 OR 1=1");
$mysqli->query("SELECT * FROM table WHERE id = $iId");