parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

проверка правильности полей формы

mashi 11.11.2005 16:32 / 12.11.2005 22:15

Иногда приходят не желательные поля , с нежелательным значением и в нежелательном месте.

Предлагаю метод, который проверяет допустимость полей.

Допустимость полей описывается таблицей, которую я храню в файле. Вот пример такого файла:
________________________________________________________________
name	ending	field_match

# name		:имя поля
# ending	:окончание ($request:uri без ?$request:query) для задания контекста
# field_match	:шаблон, которому должно соответствовать значение поля (regexp)

# глобальные поля
mode	/	xml|debug
lang	/	ru|ua|en
print	/	yes|no

# поля новостей
year	news/	2005|2006
month	news/	1|2|3|4|5|6|7|8|9|10|11|12
id	news/

# поля публикаций
year	publication/	2005|2006
month	publication/	1|2|3|4|5|6|7|8|9|10|11|12
id	publication/
_________________________________________________________________



А вот сам метод:
@_form_filds_is_ok[permition_file][permited_filds;path;name_is_ok;context_is_ok;value_is_ok]

# Если существует файл разрешений и REQUEST_METHOD = GET
^if(-f "$MAIN:DATA/$permition_file" && $env:REQUEST_METHOD eq "GET" && def $form:fields){
#	загружаем таблицу разрешений для полей
	$permited_filds[^table::load[$MAIN:DATA/$permition_file]]
#	и переводим ее в хеш таблиц если она не пустая
	^if(def $permited_filds){
		$permited_filds[^permited_filds.hash[name][$.distinct[tables]]]
#		записываем в $path значение request:uri взятое до знака вопроса
		$path[^request:uri.split[?;lh]]
		$path[$path.0]
	^try{
		^form:fields.foreach[field;value]{
#			есил имя поля разрешено, то определяем разрешение для контекста и значения
			^if(def $permited_filds.[$field]){
				$name_is_ok(1)
				$context_is_ok(^permited_filds.[$field].locate($permited_filds.[$field].ending eq '^path.right(^permited_filds.[$field].ending.length[])'))
#				если контекст впорядке и задан шаблон для значения поля, то применяем его, иначе -- все значения подходят
				^if($context_is_ok && def $permited_filds.[$field].field_match){
					$value_is_ok(^value.match[$permited_filds.[$field].field_match])
				}{
					$value_is_ok(1)
				}
			}{
#				обнуляем все признаки -- пришло не разрешенное имя поля
				$name_is_ok(0)
				$value_is_ok(0)
				$context_is_ok(0) 
			}
#			если с имененм поля, его значением и его контекстом использования всё в порядке, то выдаем (1)
			^if($name_is_ok && $context_is_ok && $value_is_ok){$result(1)}{^throw[field_name;bad field name]}
		}
	}{
		^if($exception.type eq "field_name"){
			$exception.handled(1)
			$result(0)
		}		
	}
		
	}{$result(1)}
}{$result(1)}
##### End of @_form_filds_is_ok
Если этот метод отдает мне "0", то я посылаю пользователья на страницу №404.

Например
@main[]
^if(!^_form_filds_is_ok[permited_fields.cfg]){
	^MAIN:location[http://mysite.ua/error404/]
}