Добрый день, имеется небольшая самописная CRM система, работа с базой происходит через mysql, я задумался над тем, чтобы перейти на mysqli или PDO, в связи с этим мне интересно получить ваш совет и ответы на мои вопросы: 1. Знаю, что PDO предпочтительней потому что можно использовать 12 типов баз данных и при переходе на другой тип бд, не надо переписывать все запросы, но если я знаю, что с вероятностью 90% эта база вряд ли когда будет заменена на другую, стоит ли оно того, ведь mySqli пусть и совсем на чуть чуть, но быстрее вроде как? (Скорость для меня важна) 2. Касаемо защиты от инъекций, как я понял mysqli_real_escape_string() считается дурным тоном, только не понял почему? Потому что он хуже защищает, чем подготовленные выражения в PDO и mySqli или просто потому что стиль написания не удобен? Я правильно понимаю, если к примеру в PDO я использую: <? $pdo->prepare('SELECT * FROM users WHERE username = :username AND fio = :fio'); $arInfo[':username'] = $_GET['username']; $arInfo[':fio'] = $_GET['fio']; $pdo->execute($arInfo); ?> То это меня защищает от всех возможных инъекций? 3. Интересно было бы узнать, что вы используете в своих проектах и почему?
Моё IMHO: в 10-х годах XXI века уже нет выбора. PDO давно победил и не только потому, что он более универсален. mysqli имеет неудачную реализацию плейсхолдеров, вот прям очень неудобно с ней работать. скорость исполнения скрипта не так важна, как удобство разработки. потому что вообще-то он не является защитой от инъекции. он для экранирования особых символов внутри строковых литералов. когда девелопер не понимает этого, он может таки допустить инъекцию. а плейсхолдеры такого не допустят. от sql-инъекций — да. а не от всех когда дело касается безопасности, не бывает ничего абсолютного PDO, обёрнутый во что-нибудь ради дополнительного удобства, типа Laravel Eloquent или Doctrine DBAL.
Спасибо за ответ) Я понимаю, что в плане безопасности никогда не может быть 100% гарантии, но мне все же интересно, надо ли как-то серьезней с заморачиваться с безопасностью при работе с бд ну к примеру не знаю проверка там на тип данных, которые я вставляю в бд, может еще, что-нибудь чего я не знаю или это все паранойя и при работе с бд достаточно защиты от sql инъекций?
1. Можно MySQLi. 2. Экранирование значений (особенно объемных) и их обработка сервером требуют доп. времени, но нужно, естественно, также учитывать большую сложность самих подготовленных запросов (их повторное использование в расчет не беру). От дурака ничто не защитит. Если пихать куда попало что попало, будет ой-ой-ой. 3. И то, и др. Больших неудобств при использовании плэйсхолдеров в MySQLi в отличие от пред. постера не испытываю.