我担心sql注入,所以我如何防止它? 我正在使用这个脚本,但有几个人告诉我它非常不安全,如果有人可以通过告诉我它会如何变得很有帮助:)。
源代码:
if(isset($_POST['lastmsg']))
{
$lastmsg=$_POST['lastmsg'];
$result=mysql_query("SELECT * FROM updates WHERE item_id<'$lastmsg' ORDER BY item_id DESC LIMIT 16");
$count=mysql_num_rows($result);
while($row=mysql_fetch_array($result))
{
$msg_id=$row['item_id'];
$message=$row['item_content'];
答案 0 :(得分:6)
永远不要将用户($_POST
或$_GET
)的信息直接放入查询中。如果它们是数字,请始终先使用(int)$var
或intval($var)
将它们转换为整数;如果它们是字符串,则始终使用mysql_real_escape_string()
转义它们。
答案 1 :(得分:2)
$lastmsg = intval($_POST['lastmsg']);
答案 2 :(得分:1)
最佳解决方案是迁移到mysqli_或PDO并使用预准备语句进行查询。
答案 3 :(得分:0)
您可以简单地添加:
$lastmsg=addslashes($_POST['lastmsg']);
对于更大规模,您可以使用更强大的解决方案,这是您可以使用的功能
function escape_value($value) {
$magic_quotes_active = get_magic_quotes_gpc();
$new_php = function_exists("mysql_real_escape_string");
if ($new_php){
if ($magic_quotes_active){
$value = stripslashes($value);
}
$value = mysql_real_escape_string($value);
} else {
if(!$magic_quotes_active) { $value = addslashes($value); }
}
return trim($value);
}
mysql_real_escape_string并不总是可用,所以这里有一个解决方法
答案 4 :(得分:0)
确保在PHP配置(PHP.ini)中禁用magic_quotes_gpc
指令。
如果lastmsg是一个字符串并且您使用的是mysql,请执行以下操作:
$lastmsg = mysql_real_escape_string($_POST['lastmsg']);
如果lastmsg是一个字符串,并且您的DBMS没有本机转义函数,请执行以下操作:
$lastmsg = addslashes($_POST['lastmsg']);
如果lastmsg应该是一个数字,请检查它,不要进行任何转义。您可以使用函数is_numeric(),然后使用intval()将数字字符串转换为整数。