Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: защита от подмены формы через post

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (5): [1] 2 3 4 5 »   

> Описание: безопасность
Vaio
Отправлено: 12 Января, 2013 - 01:00:17
Post Id


Гость


Покинул форум
Сообщений всего: 116
Дата рег-ции: Дек. 2012  


Помог: 0 раз(а)




Уважаемые знатоки, написал вот такой код для защиты формы от подмены:

PHP:
скопировать код в буфер обмена
  1. //форма
  2. <form method="post" action="test_form.php">
  3.  
  4. <?PHP
  5. $_SESSION['userid']['profile']=rand(0,999999999);
  6. ?>
  7.  
  8. <input type="hidden" name="<?PHP echo $_SESSION['userid']['profile'] ?>" value="1">
  9. <input type="submit" value="Save Changes">
  10.  
  11. </form>
  12.  
  13.  
  14.  
  15. //файл test_form.php
  16. <?PHP
  17.  
  18. if($_SERVER['HTTP_REFERER'] != "http://mysite.com/ttest.php")
  19.         die('<b>Access Denied</b>');
  20.        
  21. if(empty($_POST[$_SESSION['userid']['profile']]))
  22.         die('Вы не правильно ввели имя');
  23.        
  24. unset ($_SESSION['userid']['profile']);
  25.  
  26. ?>
  27.        


Подскажите будет ли безопасна такая форма, если нет дайте какие-то советы по оптимизации.

(Отредактировано автором: 12 Января, 2013 - 01:03:46)

 
 Top
spsu
Отправлено: 12 Января, 2013 - 01:16:16
Post Id



Частый гость


Покинул форум
Сообщений всего: 176
Дата рег-ции: Нояб. 2012  


Помог: 3 раз(а)




Цитата:
Подскажите будет ли безопасна такая форма, если нет дайте какие-то советы по оптимизации.

Реферер подменить вроде проблематично, но точно можно избавиться(средствами js),
надо проверять на соответсвие тому что пришло в POST запросе.
 
 Top
DlTA
Отправлено: 12 Января, 2013 - 01:16:46
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




непонятно от чего она должна быть безопастна
и на самом деле это все выглядит как попытка обезопасить путем отсылки о запроса 2 значений
мол если хоть какое то скопировали и прислали обратно не так же то ошибка

но значения/ключи то принципиально мало чем отличаются

почему два? потому что первый ключ это кука сессии. от то саоме 32 символьное значение, второе это то что пытаетесь передать в скрытом поле, и то и второе можно подделать

как быть? вам надо было в сессии хранить не какое то абстрактное значение а вполне конкретные, те которые подделать сложнее,
а именно IP адрес, причем передавать его в скрытом поле совсем не обязательно, он и так передается
ну а чтоб жизнь некоторым совсем "подгадить" попутно можно хранить и иные присланные данные: о браузере, о системе, ...
(Добавление)
о еще и реф смотрите, ну это проверка из иного
и прежде надо определиться для чего и что проверяется
 
 Top
spsu
Отправлено: 12 Января, 2013 - 01:21:06
Post Id



Частый гость


Покинул форум
Сообщений всего: 176
Дата рег-ции: Нояб. 2012  


Помог: 3 раз(а)




Цитата:
непонятно от чего она должна быть безопастна

Думаю от CSRF, от него такая проверка если чекается соответсвие хайден поля и значения в сессии вполне спасет.
 
 Top
Vaio
Отправлено: 12 Января, 2013 - 01:28:47
Post Id


Гость


Покинул форум
Сообщений всего: 116
Дата рег-ции: Дек. 2012  


Помог: 0 раз(а)




DlTA, не знаю возможно я уже туплю, но не понял ни одного вашего слова. Или покажите в моем коде что я не так сделал, или сделайте пример.

Относительно HTTP_REFERER подменить его не будет проблемой и защититься им можно только от детей (чтобы их сразу обломать я его и написал).
 
 Top
DelphinPRO
Отправлено: 12 Января, 2013 - 01:29:44
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




это делается немного по другому
CODE (htmlphp):
скопировать код в буфер обмена
  1. <?
  2.  
  3. function getToken(){
  4.  $_SESSION['token'] = md5(uniqid()); // случайное значение
  5.  return $_SESSION['token'];
  6. }
  7.  
  8.  
  9. // кнопка сабмит не нажата — выводим форму
  10. if (!isset($_POST['send'])) {
  11. ?>
  12.   <form ... >
  13.     <input type=text ... />
  14.     // генерируем уникальный токен, пишем его в сессию и скрытое поле формы
  15.     <input type=hidden name=token value=<?= getToken() ?> />
  16.     <input type=submit name=send />
  17.   </form>
  18. <?
  19. // кнопка сабмит нажата — обрабатываем данные с формы
  20. } else {
  21.  // Проверяем наличие уникального токена в сессии
  22.  // и сравниваем его со значением из формы
  23.  if (!isset($_SESSION['token'] || $_SESSION['token'] != $_POST['token'])){
  24.    // не совпало — значит форму пытаются подменить
  25.    // удалаяем токен
  26.    unset($_SESSION['token']);
  27.    // завершаем скрипт
  28.    die('Invalid token.');
  29.  }
  30.  // все в порядке — удаляем из сессии старый токен
  31.  unset($_SESSION['token']);
  32.  // проверяем реферера, если надо
  33.  // и делаем дальнейшую обработку данных
  34.  // ...
  35. }
  36. ?>


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
Vaio
Отправлено: 12 Января, 2013 - 01:37:12
Post Id


Гость


Покинул форум
Сообщений всего: 116
Дата рег-ции: Дек. 2012  


Помог: 0 раз(а)




DelphinPRO, спасибо за ваш пример. По такой схеме у меня может быть несколько форм я получу $ _SESSION ['token'] в одной и отправлю данные в другую. Не есть хорошо.

Я уже сделал привязку $ _SESSION ['userid'] ['profile'] (profile - название формы), также взгляните на эту функцию как на меня она на столько же надежна как и ваша:

PHP:
скопировать код в буфер обмена
  1. if(empty($_POST[$_SESSION['userid']['profile']]))
  2.         die('Вы не правильно ввели имя');
 
 Top
DelphinPRO
Отправлено: 12 Января, 2013 - 01:43:04
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




Vaio пишет:
По такой схеме у меня может быть несколько форм я получу $ _SESSION ['token'] в одной и отправлю данные в другую. Не есть хорошо.
ну я же всего лишь пример показал. делайте как у вас $_SESSION['token']['formname']. делов то.

Vaio пишет:
также взгляните на эту функцию как на меня она на столько же надежна как и ваша:

if(empty($_POST[$_SESSION['userid']['profile']]))
die('Вы не правильно ввели имя');

да, действительно, невнимательно посмотрел в первый раз. надежность такая же. да и логика в общем-то та же. Улыбка пора мне спать идти.


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
Vaio
Отправлено: 12 Января, 2013 - 20:35:14
Post Id


Гость


Покинул форум
Сообщений всего: 116
Дата рег-ции: Дек. 2012  


Помог: 0 раз(а)




То можно считать мою форму защищенной ли кто-то может еще что-то подсказать?
 
 Top
spsu
Отправлено: 12 Января, 2013 - 21:11:06
Post Id



Частый гость


Покинул форум
Сообщений всего: 176
Дата рег-ции: Нояб. 2012  


Помог: 3 раз(а)




[quote=Vaio][/quote]
Да, если не будет на сайте xss но это уже другое..
 
 Top
DlTA
Отправлено: 13 Января, 2013 - 00:21:53
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




Vaio пишет:
не понял ни одного вашего слова. Или покажите в моем коде что я не так сделал, или сделайте пример.

похоже до конца не дочитали
храните в сесси IP адрес клиента которому вы выдате свою форму, и от которго потом получаете рез. по форме, если адрес не сходится ил вообще сессия левая, значит злоумышленник.

PHP:
скопировать код в буфер обмена
  1. // инициализацие всего чего надо + стартуем сессию
  2. ...
  3. $_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
  4. ..
  5. // тут у нас выдается форма
  6. ...
  7.  
  8. // теперь проверка юзверя
  9. if($_SESSION['ip'] != $_SERVER['REMOTE_ADDR']){
  10. // адрес в сесси и адрес в клиента не равны значит злоумышленник
  11. }
  12. else{
  13. // все ок, обрабатываем форму
  14. }
  15.  
 
 Top
Vaio
Отправлено: 13 Января, 2013 - 01:28:28
Post Id


Гость


Покинул форум
Сообщений всего: 116
Дата рег-ции: Дек. 2012  


Помог: 0 раз(а)




DlTA, и какой смысл в этом?

если робот сам получает форму или злоумышленник получает форму и запускает работа на 1 пк - это не поможет.

к тому же REMOTE_ADDR как и HTTP_REFERER можно без проблем подделать ..
 
 Top
LIME
Отправлено: 13 Января, 2013 - 01:30:20
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




подделай))
 
 Top
Vaio
Отправлено: 13 Января, 2013 - 13:53:58
Post Id


Гость


Покинул форум
Сообщений всего: 116
Дата рег-ции: Дек. 2012  


Помог: 0 раз(а)





InetCrack и отправляю любой REMOTE_ADDR
 
 Top
Hitalik
Отправлено: 04 Марта, 2013 - 15:55:42
Post Id


Новичок


Покинул форум
Сообщений всего: 13
Дата рег-ции: Март 2013  


Помог: 0 раз(а)




Не хотелось оставлять без внимания, Не когда так не делайте, пример как обойти все три зашиты не напрягаясь
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $socket = fsockopen('127.0.0.1', 200);
  3. $data = "".urlencode("970214843")."=".urlencode("1");///970214843  type="hidden"
  4. fwrite($socket, "POST /test_form.php HTTP/1.1\r\n");//Без коминтареев//////////////////////////////////////////////////////////
  5. fwrite($socket, "Host: 127.0.0.1\r\n");
  6. fwrite($socket,"Content-type: application/x-www-form-urlencoded\r\n");
  7. fwrite($socket,"Content-length:".strlen($data)."\r\n");
  8. fwrite($socket,"Accept:*/*\r\n");
  9. fwrite($socket,"Origin:http://mysite.com\r\n");
  10. fwrite($socket,"Referer: http://mysite.com/ttest.php\r\n");//Без коминтареев////////////////////////////////////////
  11. fwrite($socket,"User-agent:Opera 11.00\r\n");
  12. fwrite($socket,"Connection:Close\r\n");
  13. fwrite($socket,"Cookie: PHPSESSID=9jtte2lbjgks3th5866ju6qqv5\r\n");//берём с браузера текушии куки/////////////////////////////////////////////
  14. fwrite($socket,"\r\n");
  15. fwrite($socket,"$data\r\n");
  16. fwrite($socket,"\r\n");
  17. $answer = '';
  18. while(!feof($socket))
  19. {
  20. $answer.= fgets($socket, 4096);
  21. }
  22. echo $answer;
  23. fclose($socket);
  24. //Как вы сами понимаете достать программно все эти данные не составляет труда
  25. ?>
 
 Top
Страниц (5): [1] 2 3 4 5 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB