Синтаксис составления запросов, гарантирующий от взлома
Решил я тут попробовать систематизировать это дело в виде двух пар правил.
Поскольку одна голова всяко хуже, чем миллион леммингов, то прошу высказываться.
Всё ли понятно написано, а - главное - все ли случаи учтены.
Основная задача - формализовать правила так, чтобы при их соблюдении достигалась 100%-я гарантия безопасности.
К примеру, для пхп скриптов такие правила написать довольно затруднительно - они получатся слишком длинными и конкретными, для каждого случая. Для SQL(MySQL) же, как мне кажется, возможно составить набор ПРОСТЫХ правил, соблюдая которые можно гарантировать безопасность.
Правила эти делятся на две группы.
1. Все значения полей, которые используются в запросе, дожны быть
- заключены в кавычки
- к ним должна быть применена функция mysql_real_escape_string()
2. Все остальные части запроса, которые меняются в зависимости от выбора пользователя, ни в коем случае не должны подставляться напрямую, а только в виде результатов вычислений.
То есть:
- Если параметр имеет строковый тип, то все возможные значения должны быть прописаны в скрипте заранее. И уже из них выбирается нужное на основании выбора пользователя.
- если параметр является числом, то обязан получаться в результате арифметического выражения.
К примеру, все поля, по которым производится сортировка, должны быть прописаны в массиве, индексами которого являются значения, которые выбирает пользователь.
Цифры для лимита должны быть результатом арифметического выражения, и так далее.
То есть, повторюсь - операторы SQL не должны ни в коем случае попадать в запрос напрямую, а могут только служить исходными данными для выражения, которое и вернёт нужный параметр. То есть, скрипт не должен их ПРОВЕРЯТЬ, и после проверки подставлять. В этом подходе изначально заложена ошибка. а должно быть именно только так, чтобы строка, переданная от пользователя, ни в каком виде не попадала в запрос ввиде оператора.
Речь во второй части, повторюсь, идёт об ОПЕРАТОРАХ, т.е. о любых частях запроса, которые не являются значениями полей.
Вторая часть правил получилась длинноватой, и это настораживает.
Решил я тут попробовать систематизировать это дело в виде двух пар правил.
Поскольку одна голова всяко хуже, чем миллион леммингов, то прошу высказываться.
Всё ли понятно написано, а - главное - все ли случаи учтены.
Основная задача - формализовать правила так, чтобы при их соблюдении достигалась 100%-я гарантия безопасности.
К примеру, для пхп скриптов такие правила написать довольно затруднительно - они получатся слишком длинными и конкретными, для каждого случая. Для SQL(MySQL) же, как мне кажется, возможно составить набор ПРОСТЫХ правил, соблюдая которые можно гарантировать безопасность.
Правила эти делятся на две группы.
1. Все значения полей, которые используются в запросе, дожны быть
- заключены в кавычки
- к ним должна быть применена функция mysql_real_escape_string()
2. Все остальные части запроса, которые меняются в зависимости от выбора пользователя, ни в коем случае не должны подставляться напрямую, а только в виде результатов вычислений.
То есть:
- Если параметр имеет строковый тип, то все возможные значения должны быть прописаны в скрипте заранее. И уже из них выбирается нужное на основании выбора пользователя.
- если параметр является числом, то обязан получаться в результате арифметического выражения.
К примеру, все поля, по которым производится сортировка, должны быть прописаны в массиве, индексами которого являются значения, которые выбирает пользователь.
Цифры для лимита должны быть результатом арифметического выражения, и так далее.
То есть, повторюсь - операторы SQL не должны ни в коем случае попадать в запрос напрямую, а могут только служить исходными данными для выражения, которое и вернёт нужный параметр. То есть, скрипт не должен их ПРОВЕРЯТЬ, и после проверки подставлять. В этом подходе изначально заложена ошибка. а должно быть именно только так, чтобы строка, переданная от пользователя, ни в каком виде не попадала в запрос ввиде оператора.
Речь во второй части, повторюсь, идёт об ОПЕРАТОРАХ, т.е. о любых частях запроса, которые не являются значениями полей.
Вторая часть правил получилась длинноватой, и это настораживает.