Проблема в том, что в Mysql параметризованные запросы выполняются много медленнее обычных.
"мы думали, что достигли дна, но тут снизу постучали" (с)
Может, и есть субд, заточенная под быстрое выполнение параметризованных запросов. Вы такую знаете?
Любая другая СУБД
В частности, в оракле и в постгресе параметризованные запросы точно выполняются быстрее - их для того и придумали, вообще-то. Там СУБД работает следующим образом: планировщик запроса получает текст запроса, парсит его и составляет план выполнения. Параметры при этом передаются отдельно и подставляются в запрос уже после разбора и составления плана. Если параметров нет, а значение подставляется прямо в текст запроса, планировщик каждый раз парсит запрос и составляет план заново (потому что он не может его опознать - текст-то другой! Хотя в простых случаях оракл, кажется, версии с 12-й, научился распознавать простые случаи, когда можно в похожих запросах разделить текст на текст + параметр), а если используются параметры, то планировщик просто берет готовый план из кэша, и это получается быстрее. Так работает СУБД здорового человека. Как работает СУБД курильщика, я не знаю и знать не хочу.
Изучать Yii2 или Laravel ради простых СУБД типа "Отчет по науке" желания и сил нет
А ковыряться с тем, что у вас сейчас, силы и желание, стало быть, есть? Ну тогда в чем проблема?
Или возьмите M$ Access. Ну или почти то же самое, но для веба - Oracle APEX. Никогда не устану его нахваливать
ради простых СУБД типа "Отчет по науке"
Давайте называть вещи своими именами. СУБД - это система управления базами данных. Это Oracle, MySQL, PostgreSQL, MSSQL, DB2, Firebird и многие другие. Ваши данные, хранением и обработкой которых занимается СУБД, - это база данных, или БД.
добавлением шифрования от них не избавиться
Разве? Дык, шифрование позволит вместо запросов вида
Код:
mysite.com/script.php?id=3&color=red&ves=33&name=Ivan
отправлять запросы вида
Код:
mysite.com/script.php?query=r4ueu53b3hwdtb22rw723er3hqbq99urh3bwd
Инъекцию делать бесполезно, запрос при расшифровке испортится и не выполнится.
Да, я погуглил фразу "SQL инъекция" и нашел статью на Хабре и статью в Википедии (они первыми ссылками идут в гугле). Стало понятно, откуда ноги растут. Ну что я могу сказать - и там, и там феерическая чушь от начала и до конца. (Ура! Ура! Наконец-то и мне попалась статья в Википедии, которую я могу назвать бредом и обосновать это со 100% уверенностью!) Кстати, а у статьи на Хабре рейтинг -5 - в этом месте должен прозвенеть тревожный звонок. Хорошей статье там столько минусов не налепят.
Короче, SQL-инъекция выглядит так.
Допустим, мы пишем информационную систему, где у пользователя есть возможность делать поиск информации. Но часть информации может иметь ограниченный доступ, и не все пользователи могут ее видеть. У нас есть поле
user_status для проверки доступа и поле
text, в котором пользователь ищет информацию. Тогда запрос для поиска будет выглядеть примерно так:
SELECT * FROM my_table WHERE user_status = 1 AND text LIKE '%some text%'
Далее, у нас есть поле для ввода, куда пользователь может что-то ввести. Мы берем пользовательский ввод и конкатенируем его с остальными частями запроса:
sql_string = "select * from my_table where user_status = 1 and text like '%" + user_input + "%'"
Например, пользователь вводит
куку, запрос получается такой:
SELECT * FROM my_table WHERE user_status = 1 AND text LIKE '%куку%'
В результате пользователь видит все строки таблицы, в которых есть текст "куку".
А теперь пользователь вводит строку "
%' or '%'='". В результате получается такой запрос:
SELECT * FROM my_table WHERE user_status = 1 AND text LIKE '%%' OR '%'='%'
То есть пользователь видит вообще все строки, даже те, которые ему запрещено видеть (с
user_status не равным 1) - потому что
or '%'='%' всегда дает true!
Так вот: SQL-инъекция - это строка "
%' or '%'='", введенная пользователем. А POST и GET запросы - это всего лишь средства доставки инъекции до базы данных. Вы берете строку, введенную пользователем, и вставляете ее прямо в текст запроса, этого достаточно. Вся эта философия про шифрование - это второстепенные мелочи. Они могут избавить вас только от части проблем в самом лучшем случае.
Особо талантливые люди собирают SQL прямо в браузере, но о грустном мы не будем сегодня.
-- 02.06.2019, 23:42 --arseniivА, ну да. Так короче. Хотя там есть два момента. Во-первых, как они узнали, какое имя он ввел, если он дропнул таблицу учащихся? Они логируют отдельно все запросы? Логирование запросов они знают, а инъекции - не знают?
И второе. Касается выполнения нескольких запросов одним куском. Не знаю, к сожалению, на каком этапе это режется - кажется, обычно этим занимаются драйвера ODBС/JDBC. Через них пачку запросов выполнить нельзя, а с другими способами доступа к БД я дела не имел. Например, pgAdmin или любая IDE для оракла умеют выполнять запросы пачками, но я не знаю, как они это делают - то ли низкоуровневый доступ (легко может быть), то ли они парсят запросы и выполняют по одному (тоже легко может быть). Возможно, эта разновидность атаки имеет уже только историческую ценность.