2011-04-22 91 views
3

我從傳統的mysql_query()參數化查詢切換到PDO,以利用它的安全優勢,我有幾個問題。首先,是否需要做magic_quotes的任何事情?這個網絡應用程序將安裝在不同配置的系統上,有些會(不幸地)讓它們啓動,而另一些則會關閉。以前我在做整個if語句addslashes()當它關閉輸入數據...需要與PDO查詢這樣的做的事情:從mysql_query切換到PDO的問題

$dbh = new PDO("mysql:host=$db_server;dbname=$db_database", $db_username, $db_password); 
$sth = $dbh->prepare("SELECT * FROM `users` WHERE `username` = :username "); 
$sth->bindParam(':username', $_POST['username']); 
$sth->execute(); 
if($row = $sth->fetch()){ 
    // Yup 
} 
$dbh = null; 

而且,是多麼必要,關閉在數據庫處理程序結束?不這樣做的不利之處是什麼?對於將安裝在許多不同服務器設置中的CMS,PDO是一個很好的選擇嗎? PDO在大多數服務器上啓用的地方足夠普及了嗎?

提前致謝!

回答

4

這個網絡應用程序將安裝在不同配置的系統上,有些會(不幸地)有[魔術引號],而其他的將會關閉。

正如我在另一個答案評論指出的那樣,PHP手冊上處理處理是魔術引號恐怖了an entire section。您通常可以在.htaccess中本地禁用它,也可以在數據進入時對其進行更正。我個人不會與託管提供商進行業務往來,默認情況下它已啓用。

以前我在做整個if語句addslashes()當它關閉輸入數據

哎呀! addslashes而不是足夠的保護。當使用舊的MySQL擴展時,您需要需要使用mysql_real_escape_string設置字符集。 Failing to do this can leave you open to a huge vulnerability

...什麼需要用PDO查詢像這樣做:

比設置連接字符集,沒有什麼

其他! PDO將盡可能使用真實準備的語句。這意味着它將首先發送帶有佔位符的查詢到服務器,以便它可以處理它,然後它將稍後分別發送參數。這使查詢免受SQL注入的影響。

(某些數據庫不支持PDO預準備語句,對於這些PDO將處理查詢,用帶引號的轉義值替換佔位符,結果相同 - 免受SQL注入攻擊。)

另外,它最終需要關閉數據庫處理程序嗎?不這樣做的不利之處是什麼?

就像其他PHP數據庫處理程序一樣,不需要關閉連接 - 當腳本結束時,連接將關閉。 (Don't even think about persistent connections。)

對於將安裝在許多不同服務器設置中的CMS,PDO是一個不錯的選擇嗎? PDO在大多數服務器上啓用的地方足夠普及了嗎?

PDO在PHP 5.1中成爲標準,但這並不意味着它始終可用。大多數Linux發行版將PHP的數據庫訪問選項全部拆分爲全部,因此安裝它們也會安裝必需的庫。有時,無能力或經驗不足的託管服務提供商不會安裝PDO包來與其他數據庫訪問選項一起使用,而不會意識到他們正在做什麼。這通常通過簡單地要求他們啓用PDO並在不願意或無法切換到另一個主機時更正。

許多現代框架都傾向於在PDO基礎上構建,但可以使用其他選項。例如,Zend Framework's Zend_Db適用於PDO,mysqli和其他一些適配器。如果擔心PDO不會始終可用,那麼使用適配器層可能對您有用。 (和大多數ZF組件一樣,Zend_Db不會嚴重依賴其他ZF組件,這意味着您可以輕鬆地將其與您的代碼捆綁在一起。)

+0

謝謝,這非常有幫助。我一直使用'mysql_real_escape_string'而不是'addslashes'到現在爲止,但現在我開始適應所有的代碼來使用參數化的PDO ......所以我們會看到遇到了多少問題!再次感謝! – RANGER 2011-04-25 00:38:34

3

我不會過多擔心magic_quotes。 PDO是在PHP 5.1中引入的,當時magic_quotes默認關閉了一段時間。應該有非常少的主機支持PDO,但啓用了magic_quotes。

如果你仍然想要處理那麼小的百分比,我建議你簡單地使用$ _GET,$ _POST和$ _COOKIE全局變量,並去掉magic_quotes增加的斜槓。或者,如果您不想直接更改它們,請將它們包裝在某種請求對象中。

+0

我同意絕大多數主機都應該關閉魔術引號,但我處於mediatemple我認爲它是一個相當顯着的主機),並且它們處於打開狀態並且無法關閉(共享服務器)。 'if(magic_quotes)(stripslashes($ _ REQUEST)}'可以在全局完成還是會混淆非用戶提交的GET和POST? – RANGER 2011-04-22 17:52:40

+0

@cbh,你應該能夠[使用.htaccess禁用魔術引號](http://php.net/manual/en/security.magicquotes.disabling.php)另外,如果你的主機不允許你在.htaccess中這樣做,請讓你的主機爲你禁用它們。 – Charles 2011-04-22 18:07:02

+0

@Charles - 由於Web應用程序將被安裝在其他用戶服務器上(所以要求我的主機改變將無濟於事),這可能是CGI而不是Apache我不認爲我可以依賴'.htaccess',但我將使用PHP Manual解決方案進行反向。謝謝! – RANGER 2011-04-22 18:16:58