2012-05-11 107 views
1

我有這樣一行:SQL注入:這行是否安全?

$sql = "UPDATE votes SET up=up+1 WHERE id='{$p}'"; 

現在從我讀過的SQL注入的一種方式是通過不「收」的SQL查詢正確,它允許黑客添加額外的信息造成的。

所以我的問題是,這條線對我來說是安全的up=up+1還沒有「封閉」,但如果我把它設置爲這樣up='up+1'這讓我「關閉」它不起作用。

排隊類型是int(11)如果這有什麼區別。

更新:

$p被消毒與函數

function sanitize($foo) { 
if(get_magic_quotes_gpc() == true) { 
$foo = stripslashes($foo); 
} 
return mysql_real_escape_string(htmlspecialchars($foo)); 
} 
+1

這個聲明對我來說看起來很安全,除非你只需要確保$ p在這個聲明之前總是數字。 –

+2

千萬不要消毒。逃逸。消毒取決於你是否知道每一種可能的攻擊途徑和專門針對它的過濾。任何時候發現新的攻擊途徑,你的功能都是沒用的。轉義處理所有攻擊。 –

+1

如果您擔心SQL注入攻擊,那麼您應該通過存儲過程和視圖來限制數據庫訪問。也就是說,特定的查詢看起來非常安全,特別是因爲$ p被函數檢查。 –

回答

4

up=up+1不容易,因爲它不通過可變接受用戶輸入。它只是增加數據庫中已有的INT值。

WHERE id='{$p}'可以,是脆弱的,但如果變量$p沒有正確過濾和轉義,但是您在上面添加,它已經被函數消毒。希望sanitize函數能夠檢查變量的適當類型(無論是int還是string),並檢查適當的邊界。

一如既往,最安全的方法是使用預準備語句和參數化查詢,而不是直接將任何變量傳遞給SQL字符串。大多數數據庫API都可以在PHP中用於各種RDBMS的支持準備語句。 (然而,不是mysql_*()功能)。

+0

謝謝,就像我在op $ p中所說的,已經使用函數sanitize $(foo){ if(get_magic_quotes_gpc()== true) { $ foo = stripslashes($ foo); } return mysql_real_escape_string(htmlspecialchars($ foo)); }' –

1

這是不安全的,除非$p正確逃脫。否則想象......

$ P =「富 '; DROP TABLE票;選擇' 1"

那麼你最終執行類似:

UPDATE votes SET up=up+1 WHERE id='foo'; DROP TABLE votes; SELECT '1'; 

那會不會很漂亮......