2011-05-12 48 views
1

這是使用mysql_real_escape_string的正確方法嗎?我用$GET但一個朋友告訴我,使之與real_escape_string更安全:我正在使用mysql_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); { 
+0

忘記mysql_real_escape_string並只使用參數化查詢。 – Kibbee 2011-05-12 23:38:44

回答

6

不,您通常使用mysql_real_escape_string準備在查詢中使用的變量,但在你的情況:

  1. 你已經使用intval;
  2. 你在錯誤的地方使用它。

在你的例子中你不需要它。

+0

好吧,mysql_real_escape_string是完全不必要的,除非它是一個字符串?當id是數字時,intval是否有竅門? – MstrQKN 2011-05-12 23:36:14

+0

@Jaoza Media正好。 – jeroen 2011-05-12 23:36:44

1

NO,你需要quering之前轉義

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

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

if(!$result) { 
} 
1

用途:

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

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

您使用mysql_real_escape_string之前值在查詢中使用,否則你無法處理SQL注入攻擊。

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注入中是安全的。

+0

mysql_real_escape_string的目的是爲了使輸入符合MySQL DB特殊字符,並且有人可以通過注入準備好的語句來調整查詢的事實是'邪惡的頭腦')+1注意到這一點的結果。 – Igor 2011-05-12 23:47:55

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'; 
+0

什麼是36字節的浪費。 – 2013-03-29 21:04:39