Контроль данных из формы

Статус
В этой теме нельзя размещать новые ответы.

lbv

Guest
Контроль данных из формы

Как вы контролируете данные из формы?
Как уже писали проверка HTTP_REFERER не дает гарантий...
Лично я написал функцию, которая проверяет целостность данных из формы.

PHP:
function data_form_control($var)
{
$error=0;

if(!is_array($var))  return false; 

$arr=func_get_args();

foreach($arr as $k=>$name) 
{
if($k===0) continue;
if(!isset($var[$name])) $error=1; 
}

if(count($var)!==(count($arr)-1) || $error==1) return false; 
else return true; 

}
Первым параметром ей надо передать массив формы, т.е. $_POST или $_GET, а остальными параметрами поля формы.
Например так:

PHP:
if(data_form_control($_POST,"login","pass", "button")) echo "Целые данные ";
else echo "Не наша форма ";
Стоит ли применять подобные функции?
 

Фанат

oncle terrible
Команда форума
в этой функции нет смысла.
во-первых, слово целостность тут не при чем.
во-вторых, тебя никто не заставляет использовать в скрипте поля, которые тебе не нужны
 

SiMM

Новичок
Re: Контроль данных из формы

Автор оригинала: lbv
Как вы контролируете данные из формы?
Как уже писали проверка HTTP_REFERER не дает гарантий...
...целостность данных из формы
HTTP_REFERER вообще не имеет никакого отношения к контролю данных из формы.
 

ForJest

- свежая кровь
HTTP_REFERER стоит проверять. Потому что возможна ситуация хака скриптов:
1. Человек авторизован на каком-нибудь сервисе service.com
2. Он нажимает ссылку, которую ему дали и уходит на другой хост hack.net
3. Страница hack.net формирует POST запрос согласно логике приложения service.com (с помощью hidden полей и JS самбита формы) и отправляет его на service.com. Это может быть допустим смена пароля. Или очистка всех сообщений. Или мало ли ещё что.
4. Запрос приходит на service.com из браузера авторизованного пользователя. Соответственно система принимает его и обрабатывает, если не обработан HTTP_REFERER/
 

SiMM

Новичок
Автор оригинала: ForJest
HTTP_REFERER стоит проверять. Потому что возможна ситуация хака скриптов
А смысл? Если уж говорить о хаке - то HTTP_REFERER подделывается в лёгкую.
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Автор оригинала: ForJest
3. Страница hack.net формирует POST запрос согласно логике приложения service.com (с помощью hidden полей и JS самбита формы) и отправляет его на service.com. Это может быть допустим смена пароля. Или очистка всех сообщений. Или мало ли ещё что.
Страница hack.net формирует и отправляет POST запрос на стороне сервера, подставляя туда произвольный REFERRER, ага?
 

fixxxer

К.О.
Партнер клуба
Проверка реферера имеет смысл только для защиты от установки прямых ссылок с других сайтов (или, например, использования контента в виде фреймов или <img>), и всегда должен допускаться пустой реферер, на случай прямого ввода урла или реферерорезки.
 

ForJest

- свежая кровь
Sad Spirit
Нет. REFERRER остаётся от страницы hack.net. В том то и дело, что если он не проверяется, скрипт об этом не узнает. Или ты что-то другое имел ввиду?
SiMM
Я об этом прекрасно знаю. Какой смысл в твоём высказывании, применительно к моему посту? Я хочу услышать объяснения.
 

crocodile2u

http://vbolshov.org.ru
И все-таки, проверка реферера в этом случае, по-моему, дело гиблое. Если перед обработкой формы есть проверка, авторизован ли пользователь, то ни с какого реферера неавторизованный пользователь ничего не сделает. А если нет проверки, то такой скрипт ничего более-менее серьезного делать не должен (стирать какие-то данные и т. д.). Соответственно, если мой скрипт - какая-нить гостевуха. куда все кому не лень пишут свои мессаги, то мне по большому счету по***у, откуда эти данные ко мне пришли. И тем более, проверка на реферера может привести к тому, что "валидный" пользователь не сможет послать данные из-за того, что его браузер не отправляет реферера.

ЗЫ: что-то многовато вышло слов "реферер" и "проверка" - но думаю, смысл ясен...
 

ForJest

- свежая кровь
crocodile2u
:)))
В ЖЖ бытовала такая игра - змейка. Кликаешь на ссылочку и у тебя в жж пишется развесёлый пост, без твоего участия. Эта дырка была доступна именно потому, что умные люди, которые разрабатывали скрипт предположили, что реферер проверять без толку.
Проверка копеечная, а разговоров много.
Дальше - я как и ты читал эту статью. Реферер - это дополнительная мера безопасности. Безопасности от чего - смотри мой первый пост, чтобы понять сценарий.
--------------------
Ладно. Я уже устал повторять. Я скажу просто - HTTP_REFERER проверять нужно.
 

ForJest

- свежая кровь
Фанат
Может быть прольёшь свет на эту тёмную историю? Хотя это уже оффтопик будет...
 

crocodile2u

http://vbolshov.org.ru
2 ForJest

При всем к тебе уважении, твои аргументы в этом посте пока что напоминают мне слова моего брата-хирурга:
- Как говорят врачи, пиво по утрам не только вредно, но и полезно.

-~{}~ 09.08.04 12:47:

forjest, без обид, ок ? :)

Я только хочу сказать, что лично для меня твои аргументы в этом посте не убедительны (пока что)
 

ForJest

- свежая кровь
crocodile2u
У меня создалось впечатление, что ты не в состоянии понять идею изложенную в
http://phpclub.ru/talk/showthread.php?postid=366315#post366315
Создалось у меня оно согласно твоему посту
http://phpclub.ru/talk/showthread.php?postid=366579#post366579
-------------------
Вероятно я не достаточно развёрнуто выразился. Из уважения к собсвенному уже проделанному труду по донесению ин-ции в массы я попытаюсь довести эту идею до тебя.
-------------------
И все-таки, проверка реферера в этом случае, по-моему, дело гиблое. Если перед обработкой формы есть проверка, авторизован ли пользователь, то ни с какого реферера неавторизованный пользователь ничего не сделает
1. Человек авторизован на каком-нибудь сервисе service.com
Разберёмся по порядку. Я ещё раз повторю. Сценарий подразумевает, что человек уже авторизован. Авторизация допустим хранится в браузере в качестве сессионной куки. Пусть эта кука называется session_kuk.

Это подразумевает (хотя я могу конечно ошибаться, но меня тогда поправят, надеюсь) что при любом запросе из этого конкретного экземпляра браузера (который как мы помним хранит куку) на хост service.com эта кука будет отослана.

Значение этой отосланной куки трудно переоценить. Она явно и недвусмысленно говорит, о том, что пользователь _авторизован_ в системе.
--------------------
Дальше - больше.
3. Страница hack.net формирует POST запрос согласно логике приложения service.com (с помощью hidden полей и JS самбита формы) и отправляет его на service.com.
Сабмит формы выполняется автоматически, понимаешь? С помощью допустим JavaScript.

Теперь возвращаемся к твоей чудестной гостевухе. Мальчик Петя читает гостевуху. Или нет. Пусть это будет лучше форум. Мальчик Петя читает форум. Он авторизован.
Хакер Вася хочет порезвиться. Он пишет ссылку на свой сайт
и там стоит что-нибудь типа
<form method='POST' action='http://service.com/phorum?thread=12345'>
<input type='hidden' name='new_message' value='Вы все тут [вырезано цезурой]!!!'>
</form>
<script language='Javascript'>
....
код автосабмита
....
</script>
Петя, нажав на эту ссылку получает бан. Почему? Потому что "все не думают, что" они [вырезано цензурой]. А сообщение было отправлено от его имени. И вот - Петя в шоке, Вася утробно хохочет, администрация форума получает письма, потому что в кузнице не было гвоздя, а именно - кто-то умный не проверил HTTP_REFERER.
-----------------------------------------------------------------------------------

Но это не аргументы. Это просто мои размышления по поводу.
Поэтому,
crocodile2u, если ты дочитал до этого места - имей себе ввиду, что проверка HTTP_REFFERER защищает не сервер от взлома, а пользователя этого сервера.
 

IL78

Guest
ForJest, а кто мешает хакеру Васе, вместо банальной подмены action формы, сформировать нужный POST-запрос на сервере - хотя бы с помощью PHP и CURL? И подставить туда абсолютно чистый перед любой проверкой REFERER, столь любезно предоставленный ему мальчиком Петей?
 

ForJest

- свежая кровь
Всем сомневающимся предлагается эта ссылка
Здесь описан аналогичный случай и довольно подробно :D
ForJest, а кто мешает хакеру Васе, вместо банальной подмены action формы, сформировать нужный POST-запрос на сервере - хотя бы с помощью PHP и CURL? И подставить туда абсолютно чистый перед любой проверкой REFERER, столь любезно предоставленный ему мальчиком Петей?
А вот об этом ты скажешь мне, когда нажмёшь на ссылку и немного подумаешь.
 

IBSN

Новичок
Я верю, что нужно проверять HTTP_REFERER и ставить себе Kerio Firewall, чтобы не подстрять на тех серверах, где этого не делают!

-~{}~ 09.08.04 13:50:

гыыыыыыы ForJest :))))))
 

ForJest

- свежая кровь
Ну же, товарищи! Я не вижу ваших рук!
P.S. Я надеюсь, что этот топик не прибъют. Из уважения к проделанной мной работе по.
 

azamat

Guest
Я верю, что нужно проверять HTTP_REFERER и ставить себе Kerio Firewall, чтобы не подстрять на тех серверах, где этого не делают!
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху