我使用的是mysql_real_escape_string吗?

时间:2011-05-12 23:30:54

标签: php mysql sql sql-injection

这是使用mysql_real_escape_string的正确方法吗?我正在使用$GET但有一位朋友告诉我用real_escape_string让它更安全:

$id = intval($_GET['id']);

$result = mysql_query("SELECT * 
                         FROM products 
                        WHERE id = $id") or die("err0r");

if(!$result) mysql_real_escape_string($id); {

5 个答案:

答案 0 :(得分:6)

不,您通常使用mysql_real_escape_string来准备要在查询中使用的变量,但在您的情况下:

  1. 您已使用intval;
  2. 你在错误的地方使用它。
  3. 您的示例中不需要它。

答案 1 :(得分:2)

没有。这是完全错误的,我不太明白你打算做什么。

mysql_real_escape_string的目的是避免SQL injection,这是网站中最大的安全风险之一。它会阻止用户提供以恶意方式操纵SQL的输入。例如:

$sql = "SELECT FROM users WHERE username = '" . $_GET['username'] . "'";

如果我将lonesomeday' or 'a' = 'a放入$_GET['username'],您的查询将变为

SELECT FROM users WHERE username = 'lonesomeday' or 'a' = 'a'

然后显然可以执行任意SQL。 mysql_real_escape_string转义不安全的字符(例如该示例中的'),因此无法以这种方式使用它们。

$sql = "SELECT FROM users WHERE username = '" . mysql_real_escape_string($_GET['username']) . "'";
// SELECT FROM users WHERE username = 'lonesomeday\' or \'a\' = \'a'

报价现已转义。所以查询不能被操纵成做恶事。

尽管如此,在这种情况下,intval可以满足您的所有需求。它还确保不是整数的任何东西都可以在$id中,因此您的代码在SQL注入时是安全的。

答案 2 :(得分:1)

不,你需要在离场前逃跑

$id = intval($_GET['id']);

$result = mysql_query("SELECT * 
                         FROM products 
                        WHERE id = '" . mysql_real_escape_string($id) . "'") or die("err0r");

if(!$result) {
}

答案 3 :(得分:1)

使用:

$query = sprintf("SELECT * 
                    FROM products 
                   WHERE id = %d",
                  intval($_GET['id']));

$result = mysql_query($query) or die("err0r");

您在 之前使用mysql_real_escape_string 在查询中使用该值,否则您将无法处理SQL注入攻击。

答案 4 :(得分:1)

你想在将它贴在查询中之前将其转义(在它与数据库交互之前你不进行注射)。

// check if your $_GET is not empty otherwise you 
// will run into "undefined variable"
if(!empty($_GET['id'])){
    $id = intval($_GET['id']);

    // to simplify you can escape here, 
    // or to be a bit more complex, you can escape in the query line.
    $id = mysql_real_escape_string($id); 

    $result = mysql_query("SELECT * 
                         FROM products 
                        WHERE id = '$id'") or die("err0r");
}
else
    print 'No ID';