2011-01-12 103 views
1

我有這樣的代碼:

ORDER BY $order 

其中「$爲了」從URL採取這樣的:

http://mywebsite.com/page.php?order=Bananas DESC

可能有人用錯誤的意向,在末尾加上自己的代碼的URL,從而做他們喜歡的任何事情?

+0

這個問題問得好。在這裏你可以找到一個白名單示例代碼http://stackoverflow.com/questions/2993027/in-php-when-submitting-strings-to-the-db-should-i-take-care-of-illegal-characters/ 2995163#2995163 – 2011-01-12 12:26:56

回答

2

如果您不檢查$order變量上的內容,那麼您的代碼肯定會暴露給潛在的SQL注入攻擊。

因此,您需要確保從GET命令得到的內容實際上是有效的order by子句(可以使用正則表達式)來清理輸入變量。

或者你可以爲你的應用程序做一些編碼以形成按子句的順序。喜歡的東西製作:

http://mywebsite.com/page.php?orderField=1&orderType=DESC 

然後映射在你的代碼1BananasorderField參數,ASCDESCorderType參數。

+0

我正在做的唯一檢查是查看訂單字段是否爲空來分配默認訂單。除此之外我什麼都沒有。 我將如何去檢查和預防攻擊?我有9個可能的'命令'應該被允許。 – Brian 2011-01-12 12:09:22

+0

@Michael - 因此您有一個「白名單」,這是驗證輸入的正確方法。只需在9個允許的字段中檢查最後的變量即可。任務完成! – Jamiec 2011-01-12 12:13:26

2

可能是的。根據您的配置,攻擊者可以插入這樣的事情:

「香蕉;刪除表生」

子查詢,而不是多條語句可能可以過

我想無論是建立秩序條款自己,或將其與白名單進行比較。

0

例子:

SELECT * FROM bugs ORDER BY $column $direction 

你必須定義可能的選項:

$column =array('id','name',....); 
$direction = array('ASC','DESC'); 

則:

if(array_key_exists ($_REQUEST['column'],$column){ 
    $column = $column[ $_REQUEST['column'] ]; 
}else{ 
...defaults.... 
}