2017-08-21 35 views
0

我想從SQL注入中保護我的WordPress博客。防止SQL注入的Htaccess和Mysqli方法之間的區別

我有許多PHP自定義頁面查詢數據庫和自定義非wordpress表。

我知道我可以使用2種方法:

1)庫MySQLi或PDO準備語句和參數化查詢。

2)htaccess的規則如下所示:

RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=http:// [OR] 

RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=(\.\.//?)+ [OR] 

RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=/([a-z0-9_.]//?)+ [NC,OR] 

RewriteCond %{QUERY_STRING} \=PHP[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12} [NC,OR] 

RewriteCond %{QUERY_STRING} (\.\./|\.\.) [OR] 

RewriteCond %{QUERY_STRING} ftp\: [NC,OR] 

RewriteCond %{QUERY_STRING} http\: [NC,OR] 

RewriteCond %{QUERY_STRING} https\: [NC,OR] 

RewriteCond %{QUERY_STRING} \=\|w\| [NC,OR] 

RewriteCond %{QUERY_STRING} ^(.*)/self/(.*)$ [NC,OR] 

RewriteCond %{QUERY_STRING} ^(.*)cPath=http://(.*)$ [NC,OR] 

RewriteCond %{QUERY_STRING} (\<|%3C).*script.*(\>|%3E) [NC,OR] 

RewriteCond %{QUERY_STRING} (<|%3C)([^s]*s)+cript.*(>|%3E) [NC,OR] 

RewriteCond %{QUERY_STRING} (\<|%3C).*iframe.*(\>|%3E) [NC,OR] 

RewriteCond %{QUERY_STRING} (<|%3C)([^i]*i)+frame.*(>|%3E) [NC,OR] 

RewriteCond %{QUERY_STRING} base64_encode.*\(.*\) [NC,OR] 

RewriteCond %{QUERY_STRING} base64_(en|de)code[^(]*\([^)]*\) [NC,OR] 

RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR] 

RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2}) [OR] 

RewriteCond %{QUERY_STRING} ^.*(\[|\]|\(|\)|<|>).* [NC,OR] 

RewriteCond %{QUERY_STRING} (NULL|OUTFILE|LOAD_FILE) [OR] 

RewriteCond %{QUERY_STRING} (\./|\../|\.../)+(motd|etc|bin) [NC,OR] 

RewriteCond %{QUERY_STRING} (localhost|loopback|127\.0\.0\.1) [NC,OR] 

RewriteCond %{QUERY_STRING} (<|>|'|%0A|%0D|%27|%3C|%3E|%00) [NC,OR] 

RewriteCond %{QUERY_STRING} concat[^\(]*\([NC,OR] 

RewriteCond %{QUERY_STRING} union([^s]*s)+elect [NC,OR] 

RewriteCond %{QUERY_STRING} union([^a]*a)+ll([^s]*s)+elect [NC,OR] 

RewriteCond %{QUERY_STRING} (;|<|>|'|"|\)|%0A|%0D|%22|%27|%3C|%3E|%00).*(/\*|union|select|insert|drop|delete|update|cast|create|char|convert|alter|declare|order|script|set|md5|benchmark|encode) [NC,OR] 

RewriteCond %{QUERY_STRING} (sp_executesql) [NC] 

RewriteRule ^(.*)$ - [F,L] 

使用htaccess的方法是非常容易和快速。有沒有使用這個缺點?

+0

這絕對是實現特定的。 – catbadger

+3

使用準備好的語句。它更容易,適用於任何類型的數據。 ($ POST,$ GET等) – GrumpyCrouton

+2

@GrumpyCrouton看到有人高估了你的評論,'$ POST/$ GET'應該真正顯示真正的[superglobals](http://php.net/manual/en/language。 variables.superglobals.php)是'$ _POST/$ _ GET',正如有些人認爲(甚至是OP)'$ POST,$ GET'是正確的語法。評論應該被編輯。編輯:它現在不能編輯。請使用適當的語法,這對每個人都更有幫助,更清晰。 –

回答

0

正如我所看到的,你將黑名單列入黑名單,你認爲它是有害的。我不會相信這一點,因爲可能有些事情你可能會忘記或將來可能會開放的其他違規行爲,你不會記得將它添加到文件中。

一個更好的aproach是白名單,你知道它是好的,但我不知道是否有可能在htaccess中。

我認爲理想的方法就是在評論中提出的建議。使用PDO或mysqli_real_escape_string()和/或settype()的準備語句進行mysqli擴展。

3

使用預處理語句是爲了防止網站被SQL注入最好的解決辦法,你說的
的,因爲你可以使用htacess屬性,但它不是從SQL注入保護您的網站的最佳途徑。 htacess不僅有利於從基於URL注入,但通過使用預處理語句它會幫助您保護所有類型的SQL注入

,以防止這樣

還可以測試你的網站的安全性後或使用的漏洞pentesterking.com

0

您的htaccess可能會阻止某些可用於sql注入的查詢,但無法判斷它是否會在所有情況下都成功 - 並且很可能不會。

對於準備好的語句,您另一方面會知道使用的變量肯定會被轉義。

htaccess規則甚至可能阻止有效輸入,例如,如果您有一個維護SQL代碼的應用程序,並且您希望允許用戶搜索查詢,那麼查詢包含您在htaccess中過濾的字符串可能是完全有效的。

爲此目的使用htaccess規則很難維護,容易出錯,最糟糕的是,如果您查看代碼,則無法確定傳遞給查詢的變量是否無害。您將始終需要檢查所有可能的方法,以確定變量的使用位置,並檢查是否在此方式下進行了修改,從而導致任何惡意行爲。

準備好的語句和任何其他驗證方法的想法是,儘可能接近你使用它們的地方。這是你如何保持代碼可維護性的唯一方法,因爲你只需要查看代碼的一小部分來檢查它是否是vaild。