в стандартных Ajax, where
и order by
SQL-предложения предоставляются программой (не пользователем), например,
var url = ".select?dd=emp&where="+escape("emp_tp='abc' and hire_dt<current_date-'2 years' and super_emp_id is distinct from emp_id")
на сервере отвечает
$where = (isset($_GET['where'])) ? pureClause($_GET['where']) : null;
$order = (isset($_GET['order'])) ? pureClause($_GET['order']) : null;
...
$query = $query.(($where)?" where $where":'').(($order)?" order by $order":'');
вопрос в том, как должна выглядеть функция pureClause
?
прямо сейчас pureClause
просто вызывает ошибку, если существует любое из следующего:
; select insert update delete drop create truncate
, если другое внедрение вызывает сбой запроса, этохорошо, пока данные не повреждены .
мне это кажется адекватным, но в глубине души я знаю, что ошибаюсь.
Уточнения:
- подготовленные операторы в Postgres, хотя и очень быстрые, но их сложно настроить и поддерживать - они подходят для хорошо используемых запросов, но не для пользовательских запросов.
- создание подготовленного оператора для каждой транзакции огромный дБ хит.гораздо предпочтительнее, если безопасность может быть достигнута на уровне приложения.
Наконец, рассмотрим предложение where
emp_tp='abc' and hire_dt=current_dt-'2 years' and super_emp_id is distinct from emp_id
Сколько здесь заполнителей?это нужно правильно проанализировать, прежде чем вводить в подготовленное утверждение с заполнителями, верно?или я полностью скучаю по лодке?
Основные факты:
- не практично для написания парсера SQL-предложения для параметризованных подготовленных операторов
- не практично для написанияОбеззараживающее средство SQL, гарантирующее отсутствие вреда
Решение:
для SELECTS, где случайный SQL может быть проблемой: поскольку слишком сложно защитить базу данных, пусть база данных защищает себя!у разных пользователей разные роли / разрешения.использовать пользователя только для чтения для выбора.для нормального SQL это гарантирует отсутствие DML из этих операторов.
лучшие практики: четыре доступа пользователя в дБ
developer
, делать все (никогда использовать в качестве соединения в веб-приложении) dml
- можно выбрать / dml почти для всего (необходимо использовать для dml) read
- можно выбрать (использовать для всехвыбирает, подготовленный или текстовый) login
- может выполнять только функции входа в систему / пароль (используется в процессе входа в систему)
защита паролем:
dml
и read
могут не иметь доступа к данным пароля, ни через select, либо через dml login
должны получать доступ к данным пароля только через защищенные функции, например,
function login( username, password ) - returns user_id
function set_password( usr_id, password ) - sets password
- только
login
может запускать функции login()
и set_password()
- в зависимости от вашей базы данных,
login
может нужен доступ к SQLстолбцы пароля - в зависимости от вашей базы данных, столбец
password
может быть защищен сам;если нет, то следует переместить из таблицы user
в свою собственную защищенную таблицу
Настройка этого параметра в mysql
с использованием инструмента администратора заняла около 30 минут, включая время записи.функции входа в систему и разделить столбец пароля.