Вопросы по переходу на PDO из mysql_query - PullRequest
3 голосов
/ 22 апреля 2011

Я переключаюсь на PDO с традиционных mysql_query() параметризованных запросов, чтобы использовать преимущества безопасности, и у меня есть несколько вопросов.Во-первых, нужно ли что-то делать, если это magic_quotes?Это веб-приложение будет установлено в системах с различными конфигурациями, и некоторые из них (к сожалению) будут включены, а другие отключены.Ранее я делал весь оператор if для addslashes(), когда он отключен для ввода данных ... что нужно сделать с помощью запросов 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;

Кроме того, насколько необходимо закрытьобработчик базы данных в конце?В чем вред не делать этого?Является ли PDO хорошей опцией для CMS, которая будет установлена ​​на разных серверах?Достаточно ли распространен PDO там, где он будет включен на большинстве серверов?

Заранее спасибо!

Ответы [ 2 ]

4 голосов
/ 22 апреля 2011

Это веб-приложение будет установлено в системах с различными конфигурациями, и в некоторых из них (к сожалению) будут включены [магические кавычки], а в других отключены.

Как я заметил в комментарии к другому ответу, в руководстве по PHP есть целый раздел , посвященный борьбе с ужасом - магическими кавычками. Обычно вы можете либо отключить его локально в .htaccess, либо исправить данные по мере их поступления. Лично я бы не имел дела с хостинг-провайдером, у которого он включен по умолчанию.

Ранее я делал целое выражение if для addslashes(), когда оно отключено для ввода данных

Хлоп! addslashes является , а не адекватной защитой. При использовании старого расширения MySQL вам нужно , чтобы использовать mysql_real_escape_string после установки набора символов. Невыполнение этого требования может привести к огромной уязвимости .

... что нужно сделать с запросами PDO, подобными этим:

Кроме установки набора символов подключения, ничего! ЗОП будет использовать реально подготовленные заявления, когда сможет. Это означает, что сначала он отправит запрос с заполнителями на сервер, чтобы он мог его обработать, а затем отдельно отправит аргументы. Это делает запрос невосприимчивым к SQL-инъекции.

(Некоторые базы данных не поддерживают подготовленные операторы с PDO. Для них PDO обрабатывает запрос, заменяя заполнители на кавычки, экранированные значения. Результат тот же - защищенность от внедрения SQL.)

Кроме того, насколько необходимо в конце закрыть обработчик базы данных? В чем вред не делать этого?

Как и в других обработчиках базы данных PHP, нет необходимости закрывать соединение - когда скрипт завершится, соединение закроется. ( Даже не думайте о постоянных соединениях .)

Является ли PDO хорошей опцией для CMS, которая будет установлена ​​на многих серверах? Достаточно ли распространен PDO там, где он будет включен на большинстве серверов?

PDO стал стандартом в PHP 5.1, но это не значит, что он всегда доступен. Большинство дистрибутивов Linux разделяют все опций доступа к базе данных PHP, поэтому при их установке также устанавливаются обязательные библиотеки. Иногда некомпетентные или неопытные хостинг-провайдеры не будут устанавливать пакеты PDO, чтобы согласиться с другими вариантами доступа к базе данных, не понимая, что они делают. Обычно это можно исправить, просто попросив их включить PDO и переключившись на другой хост, если они не хотят или не могут.

Многие современные фреймворки предпочитают строить поверх PDO, но делают доступными другие варианты. Например, Zend Framework Zend_Db имеет адаптеры для PDO, mysqli и некоторых других. Если вы боитесь, что PDO не всегда будет доступен, использование слоя адаптера может вам помочь. (Как и большинство компонентов ZF, Zend_Db не сильно зависит от других компонентов ZF, что означает, что вы можете легко связать его с вашим кодом.)

3 голосов
/ 22 апреля 2011

Я бы не стал слишком беспокоиться о magic_quotes.PDO был введен в PHP 5.1, когда magic_quotes было отключено по умолчанию на некоторое время.Должно быть очень и очень мало хостов, которые поддерживают PDO, но с включенными magic_quotes.

Если вы все еще хотите иметь дело с таким небольшим процентом, я предлагаю вам просто изменить глобальные переменные $ _GET, $ _POST и $ _COOKIE.и удалите косые черты, которые добавляет magic_quotes.Или, если вы не хотите изменять их напрямую, оберните их в какой-либо объект Request.

...