За последние 24 часа нас посетили 22962 программиста и 1214 роботов. Сейчас ищут 724 программиста ...

Что можно сделать для скрытой передачи данных методом POST

Тема в разделе "PHP для новичков", создана пользователем eanautt, 30 июл 2017.

Метки:
  1. eanautt

    eanautt Новичок

    С нами с:
    10 июл 2017
    Сообщения:
    27
    Симпатии:
    0
    Задача такая: Пользователь нажимает на кнопку, которое имеет скрытое значение (e.g. 10), когда пользователь нажал (это конечно форма - все как надо), отображается соответствующий контент исходя из переданного значения, но дело в том, что пользователь через инспектор элементов может просто изменить это значение и тогда он получит то, что не должен был получить вопрос в том, как это вообще можно обойти, у меня не было ещё таких задач и даже не знаю с какой стороны подойти.
    Форма
    HTML:
    1. <form method="POST"><input type="text" hidden="hidden" name="id_user_card" value="<?php echo $cnt['id']; ?>"><button type="submit" name="do_open_contact" id="myActionButton" class="btn-phone">
    Обработчик
    PHP:
    1.   <?php
    2.     if(isset($_POST['do_open_contact']) ) {
    3.       echo $_POST['id_user_card'];
    4.     }
    5.     ?>
    (Этот пример кода отображает лишь главную суть, задачи конечно же глобальнее)
     
  2. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Хранить эти данные в сессии и не передавать вообще пользователю.
     
    Fell-x27 нравится это.
  3. eanautt

    eanautt Новичок

    С нами с:
    10 июл 2017
    Сообщения:
    27
    Симпатии:
    0
    А как их запихать в сессию подскажите, пожалуйста
     
  4. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    @eanautt Вот про сессии -> Основы использования. Там довольно понятно написано.
    Запихивается, как в ассоциативный массив. Так же и извлекается.
     
  5. eanautt

    eanautt Новичок

    С нами с:
    10 июл 2017
    Сообщения:
    27
    Симпатии:
    0
    Допустим если
    PHP:
    1. if (!isset($_SESSION['phones'])) {
    2.   $_SESSION['phones'] = $cnt['id'];
    3. }
    4. // Где id - ID пользователя
    Как сделать, чтобы переменная $cnt['id'] приняла значение ИД конкретного того пользователя, какого надо. То есть кнопка - есть как бы пользователь. Мне нужно чтобы при нажатии одной из этих кнопок передалься ИД именного того пользователя
    PHP:
    1. <?php
    2. $contact = mysqli_query($connection, "SELECT `xxx`, `xxx`, `xxx`, `xxx` FROM `xxx`");
    3. if( mysqli_num_rows($contact) <= 0 )
    4. {
    5.   ?>
    6.   <p>Nothing found!</p>
    7.  
    8.   <?php
    9. } else {
    10. while( $cnt = mysqli_fetch_assoc($contact) )
    11. {
    12.  
    13. ?>
    14. <button ...><?php echo $cnt['name'];  ?></button>
    15. <?php }?>
     
  6. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Дайте я уточню ваш вопрос:

    У вас есть страница, на которой много кнопок? Нужно чтобы с каждой кнопки передавалось разное значение?

    или

    У Вас одна кнопка, через которую передается идентификатор пользователя? Который пользователю и знать ни к чему.

    В первом случае - это могут быть счета пользователя. У каждого пользователя их может быть несколько. Поэтому тут без передачи какого-либо ключа пользователю не обойтись. Другой вопрос, что пользователь может видеть номера своих счетов в виде порядкового номера счета (1, 2, 3...), а на сервере они будут преобразовываться в идентификаторы с помощью запросов в БД. Такой вариант гарантирует, что один пользователь не увидит счета другого.
    Во втором случае идентификатор связан только с пользователем. Например "корзина покупок" - она одна у одного пользователя и адрес ее у всех пользователей одинаковый, но в сессии хранится идентификатор корзины. А сессия у каждого пользователя своя.

    Если Вы единожды узнали ID пользователя - записываете в сессию его. Сессия существует между запросами и связана с конкретным соединением.
     
  7. eanautt

    eanautt Новичок

    С нами с:
    10 июл 2017
    Сообщения:
    27
    Симпатии:
    0
    У вас есть страница, на которой много кнопок? Нужно чтобы с каждой кнопки передавалось разное значение - да
     
  8. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    @eanautt, что произойдет, если пользователь подменит значение?
     
  9. eanautt

    eanautt Новичок

    С нами с:
    10 июл 2017
    Сообщения:
    27
    Симпатии:
    0
    Он получит данные не того пользователя которого нужно, да в рамках этого кода это не страшно так как здесь выводятся все пользователи, но если в запросе Select будет ограничения, то таким образом их можно будет обойти - это категорически нельзя
    --- Добавлено ---
    Как тогда с сессиями
     
  10. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Давайте на пальцах:
    1. Напимер, у Вас есть таблица, в которой 100 записей - с идентификаторами от 1 до 100
    2. Напимер, 10 из этих записей могут быть показаны определенному пользователю (например с идентификаторами 11, 13, 19, 35, 57, 58, 73, 77, 80 и 95). Остальные не должны ему показываться.
    3. Должен быть какой-то атрибут в таблице, по которому Вы определяете какие записи показывать, а какие нет. Напимер, в таблице с каждой записью хранится идентификатор пользователя. Или Напимер, есть еще одна таблица, в которой идентификаторы пользователей связаны с идентификаторами записей.
    4. Составляете запрос, который выводит только разрешенные пользователю записи.
    5. На выходе получается массив Напимер, из 10-ти строк (с номерами 0, 1, 2, 3, 4, 5, 6, 7, 8, 9).
    6. Пользователю в кнопки передаете номер строки из этого массива, потому как этот же запрос для этого пользователя всегда будет выдавать Напимер, 10 строк в том же порядке.
    7. По номеру строки находите нужную запись в результатах запроса. Если пользователь подменит номер строки, то он не увидит ничего, если строки с таким номером нет в массиве и производится проверка, наличия строки в массиве.
    8. Идентификатор пользователя храните в сессии, чтобы пользователь не мог его изменить.
    9. Прежде чем обращаться к сессии не забудьте ее включить функцией session_start()
     
    #10 Maputo, 30 июл 2017
    Последнее редактирование: 30 июл 2017
  11. Познающий php

    Познающий php Новичок

    С нами с:
    23 мар 2017
    Сообщения:
    381
    Симпатии:
    74
    Не должно быть ситуации, чтобы человек мог что-то поменять в форме и получит данные, которые ему не получать нельзя.

    Если у тебя так, значит у тебя хуйня получается ))
     
  12. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.823
    Симпатии:
    736
    Адрес:
    Татарстан
    может он о защите от CSRF атак?
     
  13. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    184
    Я такое задание сделал, через текстовые файлы, когда делал калькулятор, ответ в исходнике, невозможно подсмотреть.

    list.php

    PHP:
    1. <?php
    2. ini_set('display_errors', 'On');
    3. header('Content-Type: text/html; charset=utf-8');
    4.  
    5. $files = scandir(__DIR__ . '/' . 'test');
    6. $title = 'Список загруных тестов';
    7. ?>
    8.  
    9. <!doctype html>
    10. <html>
    11.     <head>
    12.         <meta charset="UTF-8">
    13.         <title><?php echo $title?></title>
    14.     </head>
    15. <body>
    16.  
    17. <h2><?php echo $title?></h2>
    18.  
    19. <ul>
    20.     <?php
    21.         foreach ($files as $f) {
    22.             if(pathinfo($f, PATHINFO_EXTENSION) == 'json'){
    23.                 echo '<li><a href="./test.php?test=' . $f .'">' . $f .'</a></li>';
    24.             }
    25.         }
    26.     ?>
    27. </ul>
    28.  
    29. </body>
    30. </html>
    test.php

    PHP:
    1. <?php
    2. header('Content-Type: text/html; charset=utf-8');
    3. ini_set('display_errors', 'On');
    4.  
    5. $getParametr = false;
    6.  
    7. if(isset($_GET['test'])){
    8.     $getParametr = true;
    9.     if (file_exists('test/' . $_GET['test'])){
    10.         $file = file_get_contents('test/'. $_GET['test'], true);
    11.     }
    12.     else{
    13.         echo 'Такого теста не существует';
    14.         die();
    15.     }
    16.  
    17.     $decode = json_decode($file, true);
    18.  
    19.     $primer = $decode["calculate"]["description"];
    20.     $answer = $decode["calculate"]["result"];
    21.     $type = $decode["calculate"]["input"]["type"];
    22.  
    23.     $fp = fopen('answer.txt', 'w');
    24.  
    25.     $test = fwrite($fp, $answer);
    26.     fclose($fp);
    27. }
    28.  
    29.  
    30. if(isset($_GET['sum'])){
    31.     $file = file_get_contents('answer.txt', true);
    32.  
    33.     if($_GET['sum'] == $file){
    34.         echo 'Ответ правильный';
    35.         die();
    36.     }
    37.     else{
    38.         echo 'Ответ не правильный';
    39.         die();
    40.     }
    41. }
    42. ?>
    43.  
    44. <!doctype html>
    45. <html>
    46.     <head>
    47.         <meta charset="UTF-8">
    48.         <title>Генератор тестов</title>
    49.     </head>
    50. <body>
    51. <?php
    52.     if(!isset($_GET['test'])){
    53.         $message = '<p>Вы напрямую открыли эту страницу, для того, что бы увидеть контент, воспользуйтесь страницей <a href="list.php">list.php</a> и перейдите по ссылкам. </p>';
    54.         echo $message;
    55.     }
    56.  
    57.     if(isset($_GET['test'])){
    58.         echo '<h2>Решите пример</h2>';
    59.          
    60.         echo '<form action="" method="get">';
    61.         echo '<label for="sum">';
    62.          
    63.         if($getParametr) {
    64.             echo $decode["calculate"]["description"];
    65.         }
    66.         else die();
    67.          
    68.         echo '</label>';
    69.         echo '<input type="' .$type . '" name="sum" id="sum">';
    70.          
    71.         echo '<input type="submit" value="Проверить">';
    72.         echo '</form>';
    73.     }
    74.  
    75.     if(isset($_GET['test'])){
    76.         echo '<p><a href="list.php">Вернутся к выбору теста</a> | <a href="admin.php">Загрузить новый</a></p>';
    77.     }
    78. ?>  
    79. </body>
    80. </html>
    И ещё надо создать папку test и поместить туда файлы
    test1.json,
    test2.json,
    test3.json ,
    test4.json.

    Код (Text):
    1. {
    2.     "calculate" : {
    3.         "description" : "2+2?=",
    4.         "input" : {
    5.             "type" : "text",
    6.             "name" : "number1"
    7.         },
    8.         "result" : 4
    9.     }
    10. }
    Код (Text):
    1. {
    2.     "calculate" : {
    3.         "description" : "3+3?=",
    4.         "input" : {
    5.             "type" : "text",
    6.             "name" : "number1"
    7.         },
    8.         "result" : 6
    9.     }
    10. }
    Код (Text):
    1. {
    2.     "calculate" : {
    3.         "description" : "5*5?=",
    4.         "input" : {
    5.             "type" : "text",
    6.             "name" : "number1"
    7.         },
    8.         "result" : 25
    9.     }
    10. }
    Код (Text):
    1. {
    2.     "calculate" : {
    3.         "description" : "10/2?=",
    4.         "input" : {
    5.             "type" : "text",
    6.             "name" : "number1"
    7.         },
    8.         "result" : 5
    9.     }
    10. }
     
  14. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.823
    Симпатии:
    736
    Адрес:
    Татарстан
    .... а чего не через БД то?
    ну и если на вашу папку и файлы нет прав соответствующих - их легко посмотреть
     
  15. Sergey_Tsarev

    Sergey_Tsarev Активный пользователь

    С нами с:
    17 мар 2016
    Сообщения:
    502
    Симпатии:
    105
    Проверяй, можно ли конкретному пользователю получить доступ к этим данным. Например пользователь может просматривать информацию с id от 1 до 20:

    PHP:
    1. echo (filter_var($_POST['id_user_car'], FILTER_VALIDATE_INT, ['options' => [ 'min_range' => 1, 'max_range' => 20]] === FALSE))  ?  "Слышь? Данные не подменяй!!!" : "Красавчик! Вот тебе данные пользователя."
     
    Dimon2x нравится это.
  16. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    184
    Алгоритмы одни и те же