php сделать скрытые поля доказательства несанкционированного доступа?
Я не хочу использовать фреймворк, когда в этом проекте есть только одно значение, которое нуждается в проверке, но я хочу убедиться, что метод, который я использую, является достаточно безопасным и разумным!
У меня установлено значение $ secret во включаемом файле, который находится за пределами корневого веб-каталога.
форма выглядит следующим образом ( $salt - случайное целое число, новое для каждой формы)
<form name="deleteform" action="#" method="get">
<input type="hidden" name="check" value="<?=sha1($salt.$secret.$songid)?>"/>
<input type="hidden" name="songid" value="<?=$songid?>"/>
<input type="hidden" name="salt" value="<?=$salt?>"/>
<input type="hidden" name="action" value="delete"/>
<input type="submit" value="Delete"/></form>
когда форма возвращается, я использую возвращенные значения для $ salt $ songid вместе с $ secret, чтобы вычислить новый sha1 и сравнить его с $check
если они равны, я предполагаю, что возвращенный $ songid не был подделан
2 ответа
Использование $_SESSIONS - путь. Даже если вы хотите все еще использовать идею скрытого поля, защищенную от взлома. Чтобы обеспечить защиту от несанкционированного доступа, вам необходимо установить значение на стороне сервера после нажатия кнопки "Отправить". Вы можете сделать это с помощью jQuery's .preventDefault()
установите значение скрытых полей в этой точке, а затем продолжите отправку. Но зачем делать дополнительный шаг?
Просто используйте сессии с самого начала, например:
session_start();
$_SESSION['name'] = value;
echo $_SESSION['name'];
$_SESSION - это то, что нужно... недостатком вашего дизайна является то, что вы все равно можете изменить форму, просто скопировав / вставив значения.
Кроме того, если они выясняют, какую проверку вы делаете, ничто не мешает им вставить свой собственный songid, вычислить собственный хэш sha1 и вставить его в ваше поле проверки.
Общее введение в сессии:
session_start();
$_SESSION['songid']=your song id;
и все готово... Теперь значение songid хранится на сервере, и ничто не может изменить его, кроме вас... если openSSL снова не сломается.