За последние 24 часа нас посетили 17038 программистов и 1511 роботов. Сейчас ищет 1391 программист ...

Безопасная обработка полученных данных POST

Тема в разделе "Сделайте за меня", создана пользователем Serege555, 7 сен 2015.

  1. Serege555

    Serege555 Новичок

    С нами с:
    14 фев 2015
    Сообщения:
    25
    Симпатии:
    0
    Подскажите какую защиту необходимо сделать, чтобы пользователь не мог отправить форму с другого сайта?

    У плагина uploadify например стоит такая защита:
    HTML
    Код (PHP):
    1. <?php $timestamp = time(); ?>
    2. <form method="post">
    3.     <input type="hidden" name="timestamp" value="<?php echo $timestamp; ?>" />
    4.     <input type="hidden" name="token" value="<?php echo md5('unique_salt' . $timestamp); ?>" />
    5. </form>
    PHP обработчик
    Код (PHP):
    1. $verifyToken = md5('unique_salt' . $_POST['timestamp']);
    2. if ($_POST['token'] === $verifyToken) {
    3.     // Что-то делаем...
    4. }
    Суть этой ерунды я так и не понял. Пользователь может скопировать из уже загруженной HTML страницы значения полей name="timestamp" и name="token" в "свою" форму и все отлично пройдет.

    Что вместо этого применяется для подобной защиты?
     
  2. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    смотри на реферер
     
  3. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.114
    Симпатии:
    1.244
    Адрес:
    там-сям
    Referrer считается ненадежным признаком. Он может отстутствовать в настоящих запросах и легко может быть подделан ботом.

    Что можно реально улучшить, так это
    1. включить в функцию расчета токена доп. данные: адрес обработчика формы, айди пользователя, его айпи и т.п.
    2. проверять метку времени на просроченность
    либо использовать какую-нибудь реализацию nonce, чтобы токен мог использоваться только один раз.
     
  4. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    не знаю как работает та хрень, надо делать так:
    1. запускаешь сессию - session_start
    2. при заходе на страницу с формой должна создаваться переменная из случайных цифр и символов и записываться в сессию
    3. потом это случайное значение должно выводиться в форме в виде скрытого поля:
    Код (PHP):
    1. <input type="hidden" name="form_controller" value="<?php echo $_SESSION['form_controller']; ?>" />
    4. при получении формы ты должен проверять было ли получено значение $_POST['form_controller'] и равно ли оно $_SESSION['form_controller'], если не получали или оно не равно, значит оно пришло не из твоей формы.

    тут правда будет косяк если кто то откроет 2 раза форму отправки, значение $_SESSION['form_controller'] перезапишется и одна из форм будет уже считаться как левая, но как это решить думай сам, там ни чего сложного нет.
     
  5. Serege555

    Serege555 Новичок

    С нами с:
    14 фев 2015
    Сообщения:
    25
    Симпатии:
    0
    Он отправляется браузером и может быть изменен. Также может и не отправляться браузером, вообщем все зависит от браузера.

    Это не поможет, если "злоумышленник" будет авторизован на сайте и будет отправлять форму с этого же браузера.

    Не очень понял смысл... Это защита если вдруг "злоумышленник" решит отправить форму скажем через год что-ли?

    Так одного раза "злоумышленнику" будет более чем достаточно.

    Это не поможет, если "злоумышленник" будет авторизован на сайте и будет отправлять форму с этого же браузера.
     
  6. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    чё это? он сможет отправить форму только в том случае, если зайдет на нее, в таком случает откуда в сессии у него возьмется $_SESSION['form_controller'] и откуда он узнает что именно тут надо отправлять:
    Код (PHP):
    1. <input type="hidden" name="form_controller" value="<?php echo $_SESSION['form_controller']; ?>" />
     
  7. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    надо просто больше верить людям
     
  8. Serege555

    Serege555 Новичок

    С нами с:
    14 фев 2015
    Сообщения:
    25
    Симпатии:
    0
    Я захожу на страницу формы вашего сайта.
    Копирую значение value из инпута name="form_controller".
    Открываю новую вкладку в браузере (в этом же браузере), например свой сайт какой нибудь.
    Пишу форму какую хочу и вставляю <input type="hidden" name="form_controller" value="скопированное значение с вашего сайта" />
    Нажимаю отправить и ваш обработчик прекрасно все пропустит.

    Да, было бы здорово, если бы все было именно так...
     
  9. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Ну из браузера другого человека ты ничего не скопируешь без доступа.
     
  10. Serege555

    Serege555 Новичок

    С нами с:
    14 фев 2015
    Сообщения:
    25
    Симпатии:
    0
    А зачем копировать из браузера другого, когда есть свой?
    Я же в прошлом сообщении описал все подробно (как я думаю).
     
  11. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.114
    Симпатии:
    1.244
    Адрес:
    там-сям
    Если у "злоумышленника" твой IP и он вошел под твоим аккаунтом. Короче если это ты. Тогда да, однозначно не поможет. )))

    Прежде чем возражать, попробуй осмыслить что тебе пишут. Если что непонятно — попроси уточнить.
     
  12. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    слух, а что ему мешает просто отправить с самой страницы, без копирования, открывания новых окон и т.д.
    и что значит что они пишет форму какую хочет, важно то, что ты же на том конце принимаешь что то конкретное (и соответственно проверяешь и фильтруешь), а что он отправит в добавок не важно.

    или в чем юмор?
    просто я так понимаю это какое то извращение, не нужно причем.
     
  13. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.114
    Симпатии:
    1.244
    Адрес:
    там-сям
    Рекомендую почитать теоретический материал по защите от меж-сайтовой подделки запросов, так это называется.
    Как обычно, русская страничка вики недотягивает по качеству до англоязычной.Так что глянь обе.
     
  14. Serege555

    Serege555 Новичок

    С нами с:
    14 фев 2015
    Сообщения:
    25
    Симпатии:
    0
    Да, именно "если это ты". Ну захотелось мне "побаловаться", всякое бывает.
    Я же точно описал:

    Есть у тебя форма редакции товара например, в ней есть инпут скрытый с ID товара.
    Вот возьму я и поменяю его на другой (скажем 5 на 15) и обновится другой товар.
    Ну и так по циклу. В итоге у тебя все товары будут одинаковые.

    Добавлено спустя 1 минуту 21 секунду:
    Ок, спасибо, почитаю.
     
  15. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    ну так это надо проверять внутри, в смысле на сервере, а на стороне клиента это безумие.
    если мне не изменяет память мне и не надо открывать другое окно, я просто могу нажать ctrl + shift + i откоются инструменты разработчика и я там принудительно могу поменять все что хочу, без всяких новых страниц.
     
  16. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ну токены это защита от того, чтобы кто-то другой смог действовать тобой. =) Если ты решил что-то удалить, то начерта тебе что-то копировать из формы в другую форму, если это уже вставлено в первую форму.
     
  17. Serege555

    Serege555 Новичок

    С нами с:
    14 фев 2015
    Сообщения:
    25
    Симпатии:
    0
    Вот смотри, реальный пример.
    Я сейчас зашел на доску объявлений в новости своей организации.
    Записал ID новости о молоке (к примеру).
    Открыл редакцию новости о кефире и подставил туда ID молока, нажал сохранить.
    Теперь у меня 2 новости про молоко:)))

    Т.е. при желании я могу сделать все новости этой доски про свое молоко, просто перебирая ID с первого до последнего.

    Как мне обезопасить сайт от этого?
     
  18. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    ну так это уязвимость сайта, так быть не должно.

    производить проверку на стороне сервера, может ли данный пользователь редактировать объявление с данным ID.
     
  19. Serege555

    Serege555 Новичок

    С нами с:
    14 фев 2015
    Сообщения:
    25
    Симпатии:
    0
    Да, это подойдет, спасибо. Никто не станет "портить" свои объявления например.

    А сессии тут мало чем помогут. Если форма должна заполняться авторизованным пользователем, то прислав эту форму "со стороны" его и так "не пустят" к этой странице.
     
  20. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    знания получены, направление задано - скоро всё уляжется в голове. =)