|
|
|
| Ребят всем привет. У меня чисто теоретический вопрос. Когда то давно я кодил на ПХП и соответственно использовал MySQL для хранения данных. Для выборки я использовал динамически составленные SQL запросы, данные в которых приходилось всеми возможными способами фильтровать обрабатывать и т.д. дабы избежать инъекций. Сейчас я перешел на ASP.NET и MSSQL в котором для доступа к данным использую хранимые процедуры. Как только начал их использовать сразу понял их преимущество (может лично для меня) перед обычным SQL запросом:
1. Код запроса полностью отделен от кода приложения
2. При передаче данных в хранимую процедуру в MSSQL сервере нет необходимости проверять передаваемые данные на запрещенные знаки - то есть я на 100% защищен от инъекций.
Вот хотелось бы узнать если использовать такую же технику и с MySQL - то защита будет такой же? Или же в любом случае прижется ручками фильтровать данные? Спасибо. | |
|
|
|
|
|
|
|
для: malish
(14.03.2008 в 08:27)
| | Завист от того, что находится внутри хранимой процедуры, теоретически и под неё можно попытаться подобрать запрос, правда это на порядок сложнее и не всегда возможно. В любом случае данные лучше обрабатывать на предмет кавычек - так как если вы их не обработаете - получите ошибку, хоть под MySQL, хоть под MS SQL. | |
|
|
|
|
|
|
|
для: cheops
(14.03.2008 в 11:19)
| | то бишь обрабатывать addslashes() а при выборке наоборот убирать экранированные кавычки? Так? | |
|
|
|
|
|
|
|
для: malish
(14.03.2008 в 11:28)
| | Нет, если при выборке вы убираете кавычки - добавлять их при помощи addslashes() не имеет смысла - делается двойная работа, которая к защите не имеет отношения. Если у вас включен режим магических кавычек, сервер для внешних переменных так и так добавит слеши перед спец-символами, если он у вас отключён, нужно экранировать строки самостоятельно. В PHP для этого используется следующая конструкция
<?php
if (!get_magic_quotes_gpc())
{
// Магические кавычки отключены
// экранируем спец-символы
$text = mysql_escape_string($text);
}
?>
|
После этого переменную $text можно без опаски вставлять в качестве строкового элемента в SQL-запрос. Если необходимо вставить число (т.е. использутся другой вид SQL-инъекции), то его лучше пропустить через функцию intval(), которая преобразует число
<?php
$number = intval($number);
?>
|
Если выполнить эти несложные преобразования - SQL-инъекция вам не будет грозить, а при выборке убирать лишние кавычки не потребуется - их просто не будет. | |
|
|
|
|
|
|
|
для: cheops
(14.03.2008 в 12:16)
| | Спасибо | |
|
|
|