2013-05-29 20 views
0

我正在確定並修復SQL注入漏洞。我已經在許多地方轉換爲pdo/prepared語句。htaccess中的mod_rewrite是否有助於防止注入?

但是,我們有一個頁面,看起來像這樣:

www.site.com/domain/products/12345/description-of-the-product 

在htaccess的,這是改寫爲:

www.site.com/domain/product.php?id=12345 

的htacess看起來是這樣的:

RewriteRule ^(.*)/products/([0-9]+)/([^/\.]+)/?$ /$1/product.php?id=$2 [L] 

所以,這裏是我的問題:由於url正在用mod_rewrite重寫,而mod_rewrite只能匹配ingtegers,所以我這有一些保護,防止SQL注入?如果你嘗試除了整數之外的其他URL,用戶只會得到一個404錯誤,因爲該頁面不存在,並且mod_rewrite沒有被激活?

在此先感謝。

+0

你確定你是在談論SQL注入和XSS不打針?除非你註冊全局變量(我認爲這是來自另一個千年),否則uri和sql引擎之間沒有直接關係。你是否直接在php中解析id? – Sebas

+1

如果我輸入地址欄www.site.com/domain/product.php?id=12345'; DROP TABLE成員; - ? – claustrofob

+0

@claustrofob它不會觸發重寫規則? –

回答

0

沒有不會因爲惡意用戶可能只需到URL

www.site.com/domain/product.php?id=123'; DROP TABLE products; 

和完全繞過你的mod_rewrite。雖然只有整數將被重寫,但它們正在被重寫以使用的URL仍然存在且可訪問。任何你正在一個SQL查詢,你應該用消毒等PDO

0

。嗯,事實上,也許,但你應該依靠功能,以防止注射應正確轉義代碼,如果我們談論的SQL注入,將通過預處理語句來完成。即使這可能還不夠,因爲注入%字符可能會導致問題。

您可以用您想用驗證什麼,URL的重寫可能會很不錯,但是這並不以任何方式讓你離開了逃避查詢參數(希望通過適當的參數準備的步驟語句)。

0

號這讓您的網址清潔每個輸入進入查詢在這一點上,但它仍然發送文本信息,在你的PHP代碼的一些時間點可以發送到數據庫。所以它需要被保護。

您可以使用mysqli_real_scape_string($_GET['id')或使用How can I prevent SQL injection in PHP?中提到的其他方法。

+0

mysqli_real_scape_string與注入或任何安全問題無關 –

+0

它防止數據阻止SQL注入(如果我沒有錯,通過轉義字符串中的字符) – zurfyx

0

不要混淆輸入數據驗證和SQL格式!

這兩個問題不應混爲一談。

正確的SQL格式化所需要的不是任何保護,而是純粹的SQL語法規則。準備好的語句是一個可以保證語法上正確的查詢的工具。然而,只有一貫且無條件地使用它才能做到任何好處。