Задача такая: Пользователь нажимает на кнопку, которое имеет скрытое значение (e.g. 10), когда пользователь нажал (это конечно форма - все как надо), отображается соответствующий контент исходя из переданного значения, но дело в том, что пользователь через инспектор элементов может просто изменить это значение и тогда он получит то, что не должен был получить вопрос в том, как это вообще можно обойти, у меня не было ещё таких задач и даже не знаю с какой стороны подойти. Форма HTML: <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"> </button></form> Обработчик PHP: <?php if(isset($_POST['do_open_contact']) ) { echo $_POST['id_user_card']; } ?> (Этот пример кода отображает лишь главную суть, задачи конечно же глобальнее)
@eanautt Вот про сессии -> Основы использования. Там довольно понятно написано. Запихивается, как в ассоциативный массив. Так же и извлекается.
Допустим если PHP: if (!isset($_SESSION['phones'])) { $_SESSION['phones'] = $cnt['id']; } // Где id - ID пользователя Как сделать, чтобы переменная $cnt['id'] приняла значение ИД конкретного того пользователя, какого надо. То есть кнопка - есть как бы пользователь. Мне нужно чтобы при нажатии одной из этих кнопок передалься ИД именного того пользователя PHP: <?php $contact = mysqli_query($connection, "SELECT `xxx`, `xxx`, `xxx`, `xxx` FROM `xxx`"); if( mysqli_num_rows($contact) <= 0 ) { ?> <p>Nothing found!</p> <?php } else { while( $cnt = mysqli_fetch_assoc($contact) ) { ?> <button ...><?php echo $cnt['name']; ?></button> <?php }?>
Дайте я уточню ваш вопрос: У вас есть страница, на которой много кнопок? Нужно чтобы с каждой кнопки передавалось разное значение? или У Вас одна кнопка, через которую передается идентификатор пользователя? Который пользователю и знать ни к чему. В первом случае - это могут быть счета пользователя. У каждого пользователя их может быть несколько. Поэтому тут без передачи какого-либо ключа пользователю не обойтись. Другой вопрос, что пользователь может видеть номера своих счетов в виде порядкового номера счета (1, 2, 3...), а на сервере они будут преобразовываться в идентификаторы с помощью запросов в БД. Такой вариант гарантирует, что один пользователь не увидит счета другого. Во втором случае идентификатор связан только с пользователем. Например "корзина покупок" - она одна у одного пользователя и адрес ее у всех пользователей одинаковый, но в сессии хранится идентификатор корзины. А сессия у каждого пользователя своя. Если Вы единожды узнали ID пользователя - записываете в сессию его. Сессия существует между запросами и связана с конкретным соединением.
У вас есть страница, на которой много кнопок? Нужно чтобы с каждой кнопки передавалось разное значение - да
Он получит данные не того пользователя которого нужно, да в рамках этого кода это не страшно так как здесь выводятся все пользователи, но если в запросе Select будет ограничения, то таким образом их можно будет обойти - это категорически нельзя --- Добавлено --- Как тогда с сессиями
Давайте на пальцах: 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()
Не должно быть ситуации, чтобы человек мог что-то поменять в форме и получит данные, которые ему не получать нельзя. Если у тебя так, значит у тебя хуйня получается ))
Я такое задание сделал, через текстовые файлы, когда делал калькулятор, ответ в исходнике, невозможно подсмотреть. list.php PHP: <?php error_reporting(-1); ini_set('display_errors', 'On'); header('Content-Type: text/html; charset=utf-8'); $files = scandir(__DIR__ . '/' . 'test'); $title = 'Список загруных тестов'; ?> <!doctype html> <html> <head> <meta charset="UTF-8"> <title><?php echo $title?></title> </head> <body> <h2><?php echo $title?></h2> <ul> <?php foreach ($files as $f) { if(pathinfo($f, PATHINFO_EXTENSION) == 'json'){ echo '<li><a href="./test.php?test=' . $f .'">' . $f .'</a></li>'; } } ?> </ul> </body> </html> test.php PHP: <?php header('Content-Type: text/html; charset=utf-8'); error_reporting(-1); ini_set('display_errors', 'On'); $getParametr = false; if(isset($_GET['test'])){ $getParametr = true; if (file_exists('test/' . $_GET['test'])){ $file = file_get_contents('test/'. $_GET['test'], true); } else{ echo 'Такого теста не существует'; die(); } $decode = json_decode($file, true); $primer = $decode["calculate"]["description"]; $answer = $decode["calculate"]["result"]; $type = $decode["calculate"]["input"]["type"]; $fp = fopen('answer.txt', 'w'); $test = fwrite($fp, $answer); fclose($fp); } if(isset($_GET['sum'])){ $file = file_get_contents('answer.txt', true); if($_GET['sum'] == $file){ echo 'Ответ правильный'; die(); } else{ echo 'Ответ не правильный'; die(); } } ?> <!doctype html> <html> <head> <meta charset="UTF-8"> <title>Генератор тестов</title> </head> <body> <?php if(!isset($_GET['test'])){ $message = '<p>Вы напрямую открыли эту страницу, для того, что бы увидеть контент, воспользуйтесь страницей <a href="list.php">list.php</a> и перейдите по ссылкам. </p>'; echo $message; } if(isset($_GET['test'])){ echo '<h2>Решите пример</h2>'; echo '<form action="" method="get">'; echo '<label for="sum">'; if($getParametr) { echo $decode["calculate"]["description"]; } else die(); echo '</label>'; echo '<input type="' .$type . '" name="sum" id="sum">'; echo '<input type="submit" value="Проверить">'; echo '</form>'; } if(isset($_GET['test'])){ echo '<p><a href="list.php">Вернутся к выбору теста</a> | <a href="admin.php">Загрузить новый</a></p>'; } ?> </body> </html> И ещё надо создать папку test и поместить туда файлы test1.json, test2.json, test3.json , test4.json. Код (Text): { "calculate" : { "description" : "2+2?=", "input" : { "type" : "text", "name" : "number1" }, "result" : 4 } } Код (Text): { "calculate" : { "description" : "3+3?=", "input" : { "type" : "text", "name" : "number1" }, "result" : 6 } } Код (Text): { "calculate" : { "description" : "5*5?=", "input" : { "type" : "text", "name" : "number1" }, "result" : 25 } } Код (Text): { "calculate" : { "description" : "10/2?=", "input" : { "type" : "text", "name" : "number1" }, "result" : 5 } }
.... а чего не через БД то? ну и если на вашу папку и файлы нет прав соответствующих - их легко посмотреть
Проверяй, можно ли конкретному пользователю получить доступ к этим данным. Например пользователь может просматривать информацию с id от 1 до 20: PHP: echo (filter_var($_POST['id_user_car'], FILTER_VALIDATE_INT, ['options' => [ 'min_range' => 1, 'max_range' => 20]] === FALSE)) ? "Слышь? Данные не подменяй!!!" : "Красавчик! Вот тебе данные пользователя."