PDO имеет метод PDO::Quote()
, который выполняет ту же работу, что и mysql_real_escape_string()
. Это обеспечивает в основном ту же функциональность и уровень безопасности sme.
Лучшим вариантом является функция «Подготовленные операторы», когда вы помещаете в запрос маркеры, а не переменные, используя PDO::prepare()
, а затем используете PDO::execute()
для передачи переменных в запрос.
Это более безопасно, поскольку использует внутренние механизмы ядра базы данных для передачи переменных в запрос. Существует нулевая вероятность атаки SQL-инъекцией через подготовленный оператор (если только в самом механизме базы данных нет ошибки, но это то, что вы могли бы смягчить, обновив версию MySQL; ничего общего с вашим собственным кодом).
Подготовленные операторы также имеют то преимущество, что они могут кэшироваться механизмом базы данных. Это означает, что если вы делаете несколько вызовов, используя один и тот же запрос, но с разными значениями переменных, вы получите прирост производительности по сравнению с теми же запросами, используя старый механизм на основе строк.
Примечание. Некоторые БД могут изначально не поддерживать подготовленные операторы, и в этом случае PHP будет их эмулировать. В этом случае это в основном то же самое, что и при использовании PDO::Quote
, и вы не получаете перечисленных выше преимуществ. Большинство баз данных поддерживают их, но даже в этом случае их можно отключить, поэтому убедитесь, что вы отключили ATTR_EMULATE_PREPARES
.
Наконец, использование PDO более безопасно, поскольку в основе старого расширения mysql лежали некоторые фундаментальные проблемы безопасности. Например, старый API не шифрует обмен данными между PHP и базой данных MySQL. Это означает, что существует теоретический риск атаки перехватчика, особенно если БД не находится на том же сервере, что и PHP. PDO использует более новую версию протокола связи MySQL и, таким образом, может шифровать этот трафик и, как следствие, более безопасен (а также почему PDO не поддерживает действительно старые версии MySQL). Есть несколько других подобных скрытых рисков со старым API, которые настолько глубоко укоренились в коде, что их нельзя было удалить. Вот почему расширение mysqli
было написано как его прямая замена.
person
SDC
schedule
29.01.2013
$db->query("select * from users where userid=$something_from_the_user")
, вы делаете это неправильно. Суть в том, чтобы не использовать какие-либо данные при построении ваших операторов SQL. - person Andy Lester   schedule 29.01.2013