1

Тема: Перехід за посиланням з передачею параметрів по POST

Поставлене завдання щоб на сторінку можна було перейти лише за посиланням і при спробі перейти по URL в браузері отримувати повідомлення про помилку. Прийнято рішення передавати один із параметрів по POST.

На JavaScript створена функція передавання форми:

echo '
<script>
    function url_post(url, name, value) {
        let form = document.createElement("form");
        form.action = url;
        form.method = "POST";
        form.innerHTML = \'<input name="\'+name+\'" value="\'+value+\'">\';
        document.body.append(form);
        form.submit();    
        return false;
    }
</script>
';

На PHP підготовлена змінна і секретне ім'я сесії (сама змінна не секретна, а ім'я сесії не світиться):

$microtime = substr(str_replace(' ', '', microtime()), 2);
$_SESSION['form'.$microtime] = 'form';

В існуючий тег переходу за посиланням додано onclick для виклика функції:

echo '
<a href="admin.php?action=delete&id=*" onclick="return url_post(this.href, \'microtime\', \''.$microtime.'\');">видалити все</a>
';

На сторінці переходу робимо перевірку:

if((isset($_POST['microtime']) && !isset($_SESSION['form'.$_POST['microtime']])) || !isset($_POST['microtime'])) {
    echo 'текст помилки';
} else {
    echo 'текст сторінки';
}
if(isset($_POST['microtime'])) unset($_SESSION['form'.$_POST['microtime']]);

Мінімальні зміни в існуючому тегі <a> дають змогу перейти за посиланням з передачею параметра (можна змінити функцію і передавати кілька параметрів) по POST за допомогою динамічної форми.

2

Re: Перехід за посиланням з передачею параметрів по POST

А нафіга вам JS, якщо це все можна зробити чистим PHP?

Подякували: leofun011

3

Re: Перехід за посиланням з передачею параметрів по POST

Людина поставила собі за мету порушувати протокол і доставити проблем користувачам. JavaScript на стороні клієнта ідеально підходить для цього.

Подякували: bebyk1

4 Востаннє редагувалося frz (11.07.2023 13:35:57)

Re: Перехід за посиланням з передачею параметрів по POST

vk написав:

(1) Поставлене завдання щоб на сторінку можна було перейти лише за посиланням і при спробі перейти по URL в браузері отримувати повідомлення про помилку. (2) Прийнято рішення передавати один із параметрів по POST.

Спершу розкажіть, Автор (1) = Автор (2) ?

Якщо так, то це "tricky", тобто задачка з зірочкою.
Якщо ж (2) придумали ви самі, то ви собі самі ускладнили завдання.

Наскільки я розумію, перехід за посиланням це наприклад

https://example.com/?var1=value1

Це звичайний GET. Тут POST потрібен лише якщо вхідний параметр не вміщається в обмеження довжини URL, по-моєму це не той випадок.

Якщо користувач не передає ...var1=value1, тоді можна в логіку додати присвоєння var1 дефолтного значення, далі якщо var1 становить дефолтне значення, тоді відображати щось типу 400 Bad Request чи що там у вас написано в завданні.

Все робиться на стороні сервера. Хоча якщо ви знаєте краще Javascript, і саме тому намагаєтеся на ньому щось зробити, то так і скажіть. Буде як в анекдоті "а от якщо б у риби була шерсть...". І що буде, якщо в налаштуваннях користувача вимкнено Javascript?... По-правильному така тривіальна логіка не повинна залежати від налаштувань користувача.

5

Re: Перехід за посиланням з передачею параметрів по POST

bebyk написав:

А нафіга вам JS, якщо це все можна зробити чистим PHP?

1) На сторінках jQuery.ajax, так що JS не вимкнений у користувачів.
2) Немало тегів <a> і замовник хоче щоб був перехід зі сторінки1 на сторінку2 тільки з посиланням в цих тегах сторінки1. Напряму з браузера при наборі url не можна було бачити сторінку2 (і виконувати php),а бачити повідомлення про недопустимість таких дій. Звісно можливо було замінити переходи зі сторінки1 на сторінку2 через передачу форм по POST і тоді за відсутністю відповідних параметрів при вводі url в браузері повідомляти про недопустимість таких дій. Це й зроблено і щоб не було на сторінці багато форм, а формується js одна динамічна форма з мінімальними доповненнями в тегах <a>.

6

Re: Перехід за посиланням з передачею параметрів по POST

frz написав:
vk написав:

(1) Поставлене завдання щоб на сторінку можна було перейти лише за посиланням і при спробі перейти по URL в браузері отримувати повідомлення про помилку. (2) Прийнято рішення передавати один із параметрів по POST.

Спершу розкажіть, Автор (1) = Автор (2) ?

Якщо так, то це "tricky", тобто задачка з зірочкою.
Якщо ж (2) придумали ви самі, то ви собі самі ускладнили завдання.

Наскільки я розумію, перехід за посиланням це наприклад

https://example.com/?var1=value1

Це звичайний GET. Тут POST потрібен лише якщо вхідний параметр не вміщається в обмеження довжини URL, по-моєму це не той випадок.

Якщо користувач не передає ...var1=value1, тоді можна в логіку додати присвоєння var1 дефолтного значення, далі якщо var1 становить дефолтне значення, тоді відображати щось типу 400 Bad Request чи що там у вас написано в завданні.

Все робиться на стороні сервера. Хоча якщо ви знаєте краще Javascript, і саме тому намагаєтеся на ньому щось зробити, то так і скажіть. Буде як в анекдоті "а от якщо б у риби була шерсть...". І що буде, якщо в налаштуваннях користувача вимкнено Javascript?... По-правильному така тривіальна логіка не повинна залежати від налаштувань користувача.

Автор(1) - замовник, Автор(2) - виконавець. Зі сторінки1 є кілька десятків чи сотень переходів на сторінку2 з різними параметрами, що передаються по GET. Набрав потрібний url в браузері користувач може завантажити сторінку2 минаючи сторінку1. Замовник дозволяє завантажити сторінку2 тільки при переході зі сторінки1. При спробі завантажити сторінку2 з браузера замість сторінки 2 бачимо тільки відповідне повідомлення. Як вирішення цього питання бачу завантаження відповідної форми зі сторінки1 з url сторінки2 з параметрами по POST. Щоб не плодити кілька десятків чи сотень форм використовую динамічну форму на JS.

7

Re: Перехід за посиланням з передачею параметрів по POST

vk написав:

На сторінках jQuery.ajax, так що JS не вимкнений у користувачів.

То й чудово. Запропонуйте замовникові перейти на API-driven backend + якийсь розпузлий js фреймворк типу React, зможете доїти його роками, якщо погодиться.

А якщо серйозно, то не побачив, у чому ваша проблема. Де питання? Спершу навіть подумав, що хтось ґайд закинув не в той розділ.

Подякували: vk, leofun012