check_login(email, password):
email_base64 = base64.b64encode(email).decode('ascii')
password_hash = bcrypt(password)
query = "select id, email from users where email = FROM_BASE64(email_base64) and password = password_hash"
```
Security through obscurity
защита от инъекций ведь. Base64 не содержит кавычек
1) Base64 это не защита,sqmap может энкодить пейлоды(это если на автомате) 2) кавычки во многих случаях не работают
Почему не защита если это сделано на сервере? Клиент передаёт запрос как есть, сервер перед тем как представить запрос кодирует в base64
Потому что ты кавычку воткнешь внутрь base64
все-равно же декодировать придется, нет?
Так это уже какой-то MySQL делать будет. А он уже поймёт что эта кавычка не часть запроса
это точно? подтверждение есть тому, что он "поймет"?
это защита, но через лишнее преобразование, которое может размыть смысл и понимание у применяющего. В основном практикуется использование прямых и простых описанных механизмов вроде параметризации драйвером, исключающие двуссмыслие и потенциальный фактор ошибки
Да, точно. По сути такой способ экранирования
Это да. Но видя какие тут велосипеды делают, возникает вопрос почему не сделать простой и надежный. С параметризацией кстати есть проблема на MySQL. Запросы с in (?,?,?) надо подготавливать n раз, по количеству разных значений в in. Т.е либо каждый раз два запроса вместо одного, либо утечка prepared statement’s (а из можно кешировать на сервере ограниченное количество)
вообще наличие sql инъекций говорит об отсутствии, либо нарушении стандартов безопасной разработки, которые лучше отрабатывать не велосипедами, а повышением качества разработки, ревью, анализаторами кода. Все давным давно описано и написано, проблема ж не в том, что не придумали механизмы, а в том, что не умеют, не хотят, торопятся, забыли
Не, ну так то да. Но всегда должно быть место велосипеду. Тот же телеграм - велосипед с т.з. крипты. Но работает ведь
Можно передавать одним параметром
В mysql? Покажи, лол.
Буквально зависит от языка и фреймворка
CREATE TEMPORARY TABLE myvalues.... SELECT ... in ( SELECT value FROM MYVALUES )
А в таблицу вы как вставлять данные будете? по одному с пакетом на запрос?
Через pdo и миграции
Выше решение было через подготовку времненой таблицы, а дальше select * where in (select from temptable). Но если изначально данные приходят от пользователя, то для вставки во временную таблицу (перед основным вызовом) все равно надо как-то защищать от инъекции при вставке в эту временную таблицу.
Пайплайнинг должны были завезти. Драйвер для мускула я писал лет 12 назад =)))
Обсуждают сегодня