Скрытые поля в Laravel

#laravel #eloquent

#laravel #красноречивый

Вопрос:

Я не уверен, понимаю ли я атрибут «hidden» при создании комментариев к сообщению. Я написал приведенный ниже код, чтобы «направить» комментарий к post_id

    <input type="hidden" name="post_id" value="{{$post->id}}" >
  

Другие люди, похоже, также используют этот «скрытый» метод для поиска post_id. Проблема в том, что когда я проверяю элементы и пишу «3» в значении, это позволяет мне написать комментарий к совершенно другому сообщению в блоге.

Есть ли какой-нибудь способ проверить post_id или сделать невозможным использование «проверять элементы».

Вот как выглядит контроллер CommentStore

 public function storeComment(request $request)
{

$post = $request->post_id;
$id = Auth::id();

Comment::create([
    'body' => $request->body,
    'user_id' => $id,
    'post_id' => $post
]);

return redirect('/');
}
  

Ответ №1:

Если пользователи должны иметь возможность оставлять комментарии только к определенным сообщениям, используйте политику авторизации для авторизации запроса и разрешайте их комментарии только там, где они должны быть разрешены.

Если пользователи должны иметь возможность размещать сообщения где угодно, не беспокойтесь об этом. Пользователь на самом деле не делает ничего, чего он не должен делать в этом сценарии.

Комментарии:

1. Спасибо за ваш ответ, я понимаю ваш образ мыслей. Пользователю невыгодно публиковать свой ответ в каком-либо другом сообщении, поэтому нет причин проверять его, потому что пользователь может свободно оставлять комментарий к любому сообщению в блоге.

Ответ №2:

я прочитал ответ от @ceejayoz , и он выглядит хорошо

Но если ваше приложение небольшого масштаба и вам не нужно внедрять authorization политики, есть такой способ

Проблемы в вашем hidden attribute

пользователь сможет прочитать их с помощью view::source или даже может inspect использовать страницу и rewrite ее

Решение

Что мы делаем

Шифрование post_id в скрытом атрибуте формы и decrypting it the controller

Документы по шифрованию см.https://laravel.com/docs/5.8/encryption

Следуйте инструкциям

Число просмотров

От

 <input type="hidden" name="post_id" value="{{$post->id}}" >
  

Для

 <input type="hidden" name="post_id" value="{{Crypt::encrypt($post->id)}}" >
  

Теперь post_id зашифровано в виде

Контроллер

Добавьте это пространство имен в начало контроллера

 use IlluminateSupportFacadesCrypt;
use IlluminateContractsEncryptionDecryptException;
  

Добавьте эту функцию в свой контроллер

 public function decryptId($encryptedId='',$message='Not Found',$statusCode=404)
    {
        try {

            $decrypted =Crypt::decrypt($encryptedId);

            return $decrypted;

            } catch (DecryptException $e) 
            {
            abort($statusCode,$message);
            }
    }
  

и ваш storeComment

 public function storeComment(request $request)
{

$postIdEncrypted = $request->post_id;

$postIdDecrypted = self::decryptId($postIdEncrypted);

$post = $postIdDecrypted;
$id = Auth::id();

Comment::create([
    'body' => $request->body,
    'user_id' => $id,
    'post_id' => $post
]);

return redirect('/');
}
  

Надеюсь, это поможет

Комментарии:

1. Это по-прежнему допускает повторные атаки, когда злоумышленник запоминает зашифрованный идентификатор одной записи и использует его в другой форме (или, что еще хуже, делится им со всем миром).

2. да, принято , но прочитали ли вы строку , но если ваше приложение небольшого масштаба в моем ответе

3. и к вашему сведению, каждый раз, когда вводится одно и то же значение, это приводит к другому значению

4. Какое отношение масштаб имеет к безопасности? Абсолютно ничего. Каждый разработчик обязан помнить о безопасности, особенно при написании программного обеспечения, которое используется в открытом Интернете. И, кроме того, вы правы в том, что значение отличается из-за разных MAC-адресов и векторов инициализации, но это не имеет значения, когда дело доходит до повторного использования зашифрованных кодов. Повторные атаки все равно будут работать.

5. Спасибо, что нашли время объяснить безопасность. Я не уверен, что этот метод шифрования и дешифрования полезен для этого текущего проекта. Но я вижу большую ценность в будущих проектах. Я сохраню ваше объяснение в своих заметках и сохраню его на тот момент, когда почувствую, что проектам нужна такая проверка. Еще раз, большое вам спасибо.