我如何保护这个PHP脚本?

时间:2011-03-31 22:38:53

标签: php security sql-injection

我担心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'];

5 个答案:

答案 0 :(得分:6)

永远不要将用户($_POST$_GET)的信息直接放入查询中。如果它们是数字,请始终先使用(int)$varintval($var)将它们转换为整数;如果它们是字符串,则始终使用mysql_real_escape_string()转义它们。

阅读http://us2.php.net/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()将数字字符串转换为整数。