2013-08-03 62 views
2

我想知道如果我的查詢是從SQL注入安全的。我的PHP SQL查詢安全嗎SQL注入?

下面是PHP代碼

$orderid = mysql_real_escape_string($orderid); 
mysql_query("SELECT * FROM orders WHERE id =\"".$orderid."\""); 

而且

如果最終用戶可以更改訂單ID,以他們想要的東西,有什麼事情他們做這裏最糟糕的情況?

+0

如果你的$的OrderID canot由終端用戶來改變你的要求是安全的。否則,此外,請確保$ orderid是整數(如果此建議有效)由simple(int)$ orderid; 編輯:jsut發現你正在使用DEPRECATED mysql_。改用PDO! –

+0

SQL字符串應該用單引號括起來,順便說一句。如果在ANSI模式下,雙引號用於標識符。 – mario

+0

如果他們能夠使orderid成爲他們想要的東西,那麼如何在這裏進行SQL注入? – VXSix

回答

2

是的,你展示的例子是從SQL注入安全。

在$ orderid中沒有可以引入SQL注入的內容,假設您沒有使用具有bug #8378的古老版本的MySQL客戶端。如果您使用的是MySQL 4.1.20,5.0.22或5.1.11或更高版本,那麼您沒問題。

您收到的意見是關於樣式和最佳實踐。因爲你不用擔心你的backslashing報價和字符串連接等

  • 查詢參數可以更容易使用。但是對於這個例子來說,查詢參數本質上並不安全。轉義和參數化都要求您保持一致地使用它們。

  • PHP的mysql擴展現已正式棄用,並且將在PHP的未來版本中刪除。這與編寫更安全的代碼有關,因爲mysql擴展不支持參數,而其他擴展mysqli和PDO確實支持參數。鼓勵

    開發者開始使用或者和mysqli或PDO擴展現在,讓這種情況發生的時候,你不覺得自己無法無需重寫代碼升級PHP版本。

    這可能會幫助您:http://phpmaster.com/migrate-from-the-mysql-extension-to-pdo/

  • 標準SQL使用單引號來分隔字符串和日期文字。 MySQL也爲此支持雙引號,但這取決於SQL_MODE的設置。如果你希望你的代碼更加穩定和標準,那麼在字符串/日期文字中使用單引號。

    此外,它更容易爲你,因爲你沒有反斜槓一個PHP的雙引號字符串中的單引號。

    mysql_query("SELECT * FROM orders WHERE id = '".$orderid."'"); 
    
  • 如果您id列是一個整數,它也很容易和簡單的投$訂單ID爲一個整數,這也將是一種安全,使你的代碼更清潔和更簡單:

    $orderid = (int) $orderid; 
    mysql_query("SELECT * FROM orders WHERE id = $orderid");