- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
https://habrahabr.ru/company/mailru/blog/344696/
Долбоёбы из "Mail.Ru", приобрётшие авторитет только благодаря тому, что их сайтик случайно стал одним из самых популярных, учат жизни:
>>> НЕ ДЕЛАЙТЕ ТАК:
>>>
>>> /* Небезопасный код: */
>>> $query = $pdo->query("SELECT * FROM users WHERE username = '" . $_GET['username'] . "'");
>>>
>>> Делайте так:
>>>
>>> /* Защищено от SQL-внедрений: */
>>> $results = $easydb->row("SELECT * FROM users WHERE username = ?", $_GET['username']);
Будто переменную в первом варианте запроса нельзя пропустить через "mysql_real_escape_string" или иную экранирующую функцию.
Зато в итоге запрос остаётся очевидным, без даунских высчитываний вида "каким по счёту является значение поля и какой по счёту вопросительный знак ему соответствует". Тьфу, блядь...
Fike 16.12.2017 16:05 # 0
g0cTb 16.12.2017 20:06 # −2
Fike 16.12.2017 23:39 # +1
bormand 17.12.2017 00:28 # −1
Тогда уж орм. Всё проще, чем говно из кусков клеить, да ещё и с параметрами отдельно от запроса...
Fike 17.12.2017 13:22 # −1
g0cTb 17.12.2017 01:09 # −1
> переиспользование
Типа перфоманс? Это не всегда актуально, но при этом усложняет логику (подготавливать запросы, держать открытую сессию с базой и переиспользовать ее).
В общем, не абсолютное превосходство конечно.
defecate-plusplus 17.12.2017 01:32 # +2
но в нормальной субд подготовленный запрос - это кеш, это уже экономия на этапе парсинга, это посчитанный план один раз
из-за мудаков, которые не научились в параметры запроса, оракл начиная с какой-то версии ВСЕ константы выносит в бинд параметры уже на своей стороне (даже where foo = 0 and bar is null) и твой неподготовленный запрос все равно будет подготовленным (т.е. для него также поищут в кеше уже план и т.д.)
> держать открытую сессию с базой
пыхобляди даже в 2017 году несут какой-то адовый пиздец, что пул сессий с базой - это сложно
roman-kashitsyn 17.12.2017 01:45 # +1
Пыхоскрипты выполняются ≤ 30 секунд и умирают, на этом вся пыхоиндустрия держится. Какой толк от пула, если контекст потеряется, когда страничка отрендерится?
defecate-plusplus 17.12.2017 01:55 # 0
для пыхоиндустрии так-то куча мидлвари есть типа pgpool
когда страничка отрендерится для одного хттп клиента, для другого параллельно потребуется ровно такой же дб юзер, с тем же окружением (правами и т.д.) и теми же запросами (ага, привет кеш подготовленных запросов!)
g0cTb 17.12.2017 01:59 # −1
Dummy00001 18.12.2017 19:23 # 0
кэш там в ж не надо.
я бенчи с оракакла видел. кэш там только мешает и является ярым боттлнеком: он один на тучи клиентов, и его надо лочить для апдейта. поэтому и подготовленые запросы там это must. и лок контеншн они уменьшают, и размер кэша не раздувают.
с другой стороны, парсинг сукля это мелочи - меньше процента в общем случае - по сравнению с хождением на диск или даже передаче данных по сети.
с еще более другой стороны, кэш он только и помогает что бы избежать пересчёта плана оптимизации запроса. на больших базах это грабли потому что кэш надо сбрасывать в ручную, иначе запросы будут делать с устаревшим планом. на мелкой веб питушне - там ни запросов ни размеров нет, когда планы сложно считать.
из того что слышал, тот же некро-сукль этими проблемами не страдает. и ему просто по барабану - подготовленые или неподготовленые запросы - разница в производительности маргинальная. и кэш там тоже как лучше чем в оракакле мэнеджится, и проблем с ним нет.
defecate-plusplus 19.12.2017 11:22 # +1
wrong
Если база большая, то ситуация минуту назад или даже час назад ничем не отличается от текущей, с чего бы план поменялся?
План вообще строится такой хуйней, как "оптимизатор", задача оптимизатора собирать статистику по таблицам, индексам и даже по коэффициенту разнообразия хранящихся в колонках данных, это в любой вменяемой субд так.
Если ты индекс добавишь, партиций набьешь или матвьюху вместо одноименной вьюхи присунешь, то оракл (я вижу у тебя отдельная любовь к нему, ну пусть) и так старый план запроса инвалидирует сам, будь он хоть 100 раз закеширован + там тоже не для дураков сделано, есть соответствующие трешолды если таблица была на 1К записей, а стала на 10М - оптимизатор об этом вспомнит и без тебя
> кэш надо сбрасывать в ручную
Расскажи поподробнее, как часто ты это делаешь? Я вот кучу лет жил без этого, пришлось поискать, нагуглил только alter system flush shared_pool (который сбрасывает не только кеш запросов), нагуглил, что он нихуя не нужен даже в отладочных целях (когда разработчик бд отлаживает основные сценарии продакшен обращений к бд). Тем более непонятно, как это должен делать ынтерпрайзный бек через хибернейт, и, главное, когда.
> на мелкой веб питушне - там ни запросов ни размеров нет, когда планы сложно считать
В любой, даже самой мелкой питушне, как только она становится порталом (с личным кабинетом, срезами по подмножеству контента, зависящими от текущего user-id, в т.ч. права на доступ и зависимости от менструального цикла текущего юзера) начинаются многоэтажные запросы, которые для получения 5 строк должны сходить в 10 таблиц. Если для пыхомакаки "с большими проектами с кучей бизнеслогики" даже нет разницы биндить значения или получать O\\\\\\\\\\'Hara, то чего уж тут про кеш рассусоливать
Dummy00001 19.12.2017 14:06 # 0
> > кэш надо сбрасывать в ручную
> Расскажи поподробнее, как часто ты это делаешь?
лично не делаю.
на больших базах, для бэкапов некоторые оссобенно безразмерно растущие таблицы периодически пересоздаются (например под новым именем, с таймстемпом в имени таблицы, приложение автоматом льёт данные в "актуальную" таблицу).
иначе их просто не забэкапить, ни удалить надёжно в будущем не удастся. (да, и простые бэкапы тут тоже не катят: народ редиректит часто это в выделенную ДБ на выделенном серваке. тормозит - но выбора мало.)
т.е. у тебя таблица часто каждую день/неделю/месяц новая.
> ... есть соответствующие трешолды если таблица была на 1К записей, а стала на 10М - оптимизатор об этом вспомнит и без тебя
очевидно что - по крайней мере оракаклы 10 и раннее - этого не делают.
сам видел, сам по этим граблям ходил. после сброса кэша запрос резко делался в минуты, а не в часы. (сколько там данных было - не спрашивай, потому что "select 1 from xxx" там тормозило прилично, почему очень сильно не рекомендовалось, и я даже не пробовал. и работало на тех данных много людей - поэтому когда твой запрос тормозит час, значит что и всего остального тима будет тоже подтормаживать.)
к ораклу у меня нет любви, просто на телекомах на нем все сидят, и опыт с настоящими базами у меня почти исплючительно оракакловый.
3.14159265 26.12.2017 03:38 # −1
Есть еще такой забавный способ, который почти не используют. Делаем один prepared statement и туда в цикле суём сотни разных параметров.
Типа
Dummy00001 26.12.2017 03:48 # −1
не спорю. но по крайней мере на оракакале, этот профит по большей части из-за того что не надо апдейтить кэш.
потому что если не делать препареды, то у тебя мнгновенно появляется боттлнек на кэше стэйтментов.
> Есть еще такой забавный способ, который почти не используют.
я такое как раз для батчей на оракле и делал.
так же читал про фанатов которые делали еще один шаг глубже: создавали временную строред процедуру для выборки. это даёт 100% производительность на оракле, без боттлнеков/этц.
3.14159265 26.12.2017 03:44 # −1
Статистику надо апдейтить, если оптимизатор планы негодные суёт.
Еще есть всякие with recompile.
3.14159265 26.12.2017 03:33 # −1
Люто плюсую.
Fike 17.12.2017 13:21 # +1
хуета, без знания текущей кодировки, режима экранирования сервера и всех нюансов можно наглотаться хуев по самое небалуйся
https://stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql-real-escape-string
В то время как можно слать параметры отдельно от запроса и тупо не волноваться. Но это, блядь, не наш путь, потому что видите ли лишком сложно писать.
> но при этом усложняет логику
вы там в четвертом классе что ли, что вам всё сложнааааа?
g0cTb 17.12.2017 13:27 # −4
Fike 17.12.2017 13:49 # 0
g0cTb 17.12.2017 14:00 # −1
Fike 17.12.2017 14:13 # −1
zenn 21.12.2017 09:14 # −1
Все крупные ORM запиленные для php под капотом билдят запросы именно на основе PDO.
Stallman 21.12.2017 13:41 # −1
Ровные пацаны пишут в каждом скрипте: $BD = mysql_connect() or die('Osheebka bazy dannyh :(');
vistefan 21.12.2017 17:31 # −1
inkanus-gray 21.12.2017 23:19 # +1
bormand 22.12.2017 06:19 # +2
inkanus-gray 22.12.2017 06:54 # −1
bormand 21.12.2017 18:18 # +2
Мой скрипт идеален, во всех проблемах виновата база данных.
inkanus-gray 17.12.2017 15:41 # −1
— Ко-ко-ко, используйте PDO! При использовании PDO ваши проекты будут безопасными, куд-кудах!
— Ба-бах! Пример кода с PDO, подверженного инъекции.
bormand 17.12.2017 15:47 # −1
Весь запрос засунули в запрос?
inkanus-gray 17.12.2017 16:06 # −1
В той же статье указаны способы решения проблемы:
0. Не полагаться на mysql_real_escape_string. Есть куча примеров, когда эта функция ничего не делает со строкой, оставляя инъекцию.
1. Не использовать «плохие» кодировки. utf8 и utf8mb4 для большинства случаев хорошие.
2. Явно указывать серверу кодировку (после подключения к БД), не полагаясь на то, что она уже инициализирована.
3. Выключать эмуляцию подготовленных запросов:
Как вариант, для MySQL автор предлагает использовать mysqli::prepare вместо PDO, потому что mysqli никогда не эмулирует подготовленные запросы. Неожиданно, да?
Ещё можно отказаться от MySQL в пользу другой СУБД, но что-то мне подсказывает, что изобретательные программисты и туда протащат инъекцию.
bormand 17.12.2017 16:41 # −1
inkanus-gray 17.12.2017 18:08 # −1
http://php.net/manual/ru/pdo.drivers.php
Вот Zend Framework и прочие фреймворки со своими собственными уровнями абстракции могут использовать хоть mysqli, хоть PDO, хоть ещё какой-нибудь драйвер.
COWuTEJIbTBOEuMAMKu 17.12.2017 19:14 # 0
inkanus-gray 17.12.2017 21:46 # 0
COWuTEJIbTBOEuMAMKu 17.12.2017 22:26 # +2
inkanus-gray 16.12.2017 19:08 # −1
*****
В каких языках программирования, кроме "PHP", сложилась традиция собирать запрос тупой конкатенацией вместо использования готовых функций для подстановки параметров?
bormand 16.12.2017 19:23 # −1
В теории, можно было бы сделать безопасный и удобный сахарок:
1024-- 16.12.2017 20:08 # 0
bormand 16.12.2017 20:14 # −1
roman-kashitsyn 17.12.2017 01:26 # 0
всю жизнь был волшебный объект arguments
bormand 17.12.2017 08:18 # −1
Там же всё подряд, включая фиксированные аргументы. Неудобно.
3.14159265 26.12.2017 03:53 # −1
3.14159265 26.12.2017 03:58 # −1
https://www.youtube.com/watch?v=MGxAtO5n9SY
Что за новомодная дрочь? Это разве js? [вставил в консоль] OMFG
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals