Bermuda
Новичок
Оцените идеи валидации данных поступающих от пользователя.
Класс валидации данных
Есть метод класса
$erName - имя параметра
$check - тип проверки
Доступные типы проверки (думаю из названия непонятно только FECHA - дата по испански)
NONE, INTEGER, NUMERIC, STRING, MINLENGTH, MAXLENGTH, GREATERTHAN, PRIMARYKEY, KEYWORD, TELEFONO, CP, FECHAб EMAIL, ARRAY, HTML, XML, LOGIN, PASSW, PAGINAWEB, CIF
$escapar - экранирует кавычки (учитывается magic_quotes)
$escaparhtml - удаляет html форматирование
$method - метод передачи параметра (POST/GET/BOTH)
Метод проверяет переменную с именем $erName согласно требуемому типу данных $check и методу передачи $method. Если переменная не соотетствует своему типу и методу передачи, то метод возвращает пустое значение.
Т. е. чтобы получить переменную $_POST["id"] (предполагается, что это индекс записи в базе данных, скажем, MySQL), нужно сделать
Недостаток: метод не возвращает причину почему параметр не прошел валидацию, то ли он был пустой, то ли передан неверным методом, то ли не соответствует типу данных, то ли после очистки html от данных ничего не осталось. В большинстве случаев данный недостаток некритичен. Просто можно говорить пользователю, что данные неверны, а уж почему -- не его дело.
Но хочется пойти дальше. Лично я не вижу никакой надобности в том, чтобы в коде указывать тип передаваемых данных. Тип передаваемых данных можно указывать прямо при передаче данных. Имя параметра можно конструировать следующим образом
типданных_имяпараметра
Например:
<input type="text" name="login_user">
В данном случае
login - тип данных
user - имя параметра
Таким образом можно можно фильтровать весь массив POST на предмет соответствия данных их типу. Отднако у пользователя остается возможность самому манипулировать этими данными используя фокус вроде этого
<input type="text" name="array_user[]">
и послать вместо ожидаемого имени пользователя массив. Для предотвращения таких фокусов можно подписывать параметры сдедующим образом
типданных_имяпараметра_подпись(типданных + имяпараметра + секретныйключ)
секретныйключ пользователю известен быть не может
В итоге выйдет что-то похожее на
<input type="text" name="login_user_6be920966072470cb659cb74478888dd">
где
login - тип данных
user - имя параметра
6be920966072470cb659cb74478888dd - подпись
Идея всего этого не указывать в коде тип передаваемых данных, а передавать тип данных вместе с самими данными.
Имеет ли смысл подписывать данные? Использует ли кто-нибудь что-либо подобное? Есть какие-либо минусы у данного метода?
Класс валидации данных
Есть метод класса
PHP:
getParamER($erName, $check, $escapar = true, $escaparhtml = true, $method = "BOTH")
$check - тип проверки
Доступные типы проверки (думаю из названия непонятно только FECHA - дата по испански)
NONE, INTEGER, NUMERIC, STRING, MINLENGTH, MAXLENGTH, GREATERTHAN, PRIMARYKEY, KEYWORD, TELEFONO, CP, FECHAб EMAIL, ARRAY, HTML, XML, LOGIN, PASSW, PAGINAWEB, CIF
$escapar - экранирует кавычки (учитывается magic_quotes)
$escaparhtml - удаляет html форматирование
$method - метод передачи параметра (POST/GET/BOTH)
Метод проверяет переменную с именем $erName согласно требуемому типу данных $check и методу передачи $method. Если переменная не соотетствует своему типу и методу передачи, то метод возвращает пустое значение.
Т. е. чтобы получить переменную $_POST["id"] (предполагается, что это индекс записи в базе данных, скажем, MySQL), нужно сделать
PHP:
$id = $this->pet->getParam("id", "PRIMARYKEY", true, true, "POST");
Но хочется пойти дальше. Лично я не вижу никакой надобности в том, чтобы в коде указывать тип передаваемых данных. Тип передаваемых данных можно указывать прямо при передаче данных. Имя параметра можно конструировать следующим образом
типданных_имяпараметра
Например:
<input type="text" name="login_user">
В данном случае
login - тип данных
user - имя параметра
Таким образом можно можно фильтровать весь массив POST на предмет соответствия данных их типу. Отднако у пользователя остается возможность самому манипулировать этими данными используя фокус вроде этого
<input type="text" name="array_user[]">
и послать вместо ожидаемого имени пользователя массив. Для предотвращения таких фокусов можно подписывать параметры сдедующим образом
типданных_имяпараметра_подпись(типданных + имяпараметра + секретныйключ)
секретныйключ пользователю известен быть не может
В итоге выйдет что-то похожее на
<input type="text" name="login_user_6be920966072470cb659cb74478888dd">
где
login - тип данных
user - имя параметра
6be920966072470cb659cb74478888dd - подпись
Идея всего этого не указывать в коде тип передаваемых данных, а передавать тип данных вместе с самими данными.
Имеет ли смысл подписывать данные? Использует ли кто-нибудь что-либо подобное? Есть какие-либо минусы у данного метода?