Скрытые поля в Ларавеле - PullRequest
       10

Скрытые поля в Ларавеле

0 голосов
/ 22 марта 2019

Я не уверен, что понимаю «скрытый» атрибут при комментировании поста.Я написал код ниже, чтобы «нацелить» комментарий на 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('/');
}

Ответы [ 2 ]

4 голосов
/ 22 марта 2019

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

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

1 голос
/ 22 марта 2019

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

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

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

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

Решение

Что мы делаем

Шифрование 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 Illuminate\Support\Facades\Crypt;
use Illuminate\Contracts\Encryption\DecryptException;

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

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('/');
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...