这种查询方法的安全性如何

时间:2013-01-10 11:32:48

标签: php mysql

如果我们不能使用PDO或mysqli(出于任何原因),这种方法对于INSERT和SELECT是否安全?

<?php

  if (!empty($_POST[id]) && !empty($_POST[name])) {
    require_once ( 'config.php' );

    // SAFE INTVAL ID
    $id = intval($_POST[id]);

    $connect = mysql_connect("$server", "$user", "$password")
    OR die(mysql_error());
    mysql_select_db("$database", $connect);

    // ESCAPING NAME
    $name = mysql_real_escape_string($_POST[name]);

    $query = "INSERT INTO table (id, name) VALUES ('$id', '$name')";
    $result = mysql_query($query, $connect);

    if (!$result) { echo 'success'; } else { echo 'fail'; }
  }

?>

因为我多次读过永远不会使用mysql_query, 即使我们小心并且及时逃脱,这是危险的吗?

3 个答案:

答案 0 :(得分:3)

据我所知,您的查询完全没问题。 您正在使用

转义SQL
mysql_real_escape_string($_POST[name])

这为您的代码增加了额外的安全性。 唯一的建议是使用:

$_POST['name']

而不是

$_POST[name]

因为它会生成PHP警告。

感谢。

答案 1 :(得分:1)

要添加到其他答案,它是“安全的”,因为查询无法被利用。但要注意的一件事是,您信任您的用户为您提供ID(我假设这是您的主要密钥)。当然,这意味着您的用户可以覆盖其他记录。

更好的方法是从查询中省略id列(及其值),并在创建表时将列标记为AUTO_INCREMENT。查询中任何省略的值都将成为其默认值,在这种情况下,通常id + 1的最后一个值。

答案 2 :(得分:1)

即使你说你不能使用它们,可能是因为它们太复杂了(?),你真的应该做一些研究并理解如何使用它们。我保证,一旦你这样做,你甚至不想回去! :)我建议使用PDO / MySQLi,因为PHP 5.5正在贬值MySQL,你会得到E_DEPRECIATED通知。

使用MySQLi或PDO编写的语句意味着您不必转义任何字符串,只需用?引用每个变量,然后稍后说明哪种数据类型?例如,s是字符串。

然后您不需要使用mysql_real_escape_string()。未来证明您的代码! :)