3

如果我们不能使用 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,即使我们小心并及时逃跑是否危险?

4

3 回答 3

3

据我所知,您的查询非常好。您正在逃避 SQL

mysql_real_escape_string($_POST[name])

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

$_POST['name']

代替

$_POST[name]

因为它会生成 PHP 警告。

谢谢。

于 2013-01-10T11:36:05.743 回答
1

要添加到其他答案,它是“安全的”,因为在查询中不能被利用。不过要注意的一件事是,您相信您的用户会为您提供一个 ID(我假设这里是您的主键)。当然,这意味着您的用户可以覆盖其他记录。

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

于 2013-01-10T11:46:49.400 回答
1

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

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

那时你就不需要使用了mysql_real_escape_string()。未来证明您的代码!:)

于 2013-01-10T14:07:47.643 回答