Защита внутренней конечной точки API с помощью Laravel - PullRequest
0 голосов
/ 16 октября 2019

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

Пользователь может загрузить много документов (hasMany).

У меня есть файл ниже Vue, который выбирает мой внутренний API для получения информации из загруженного документа. Ниже приведен метод, который я использую:

ShowDocument.Vue

getDocument: function (documentId) {
    axios.get('/api/documents/' + documentId).then((response) => {
        this.document = response.data.document;
    }).catch(error => {
        console.log(error);
    })

},

В моем файле routes/api.php я определил следующий маршрут:

Route::apiResource('documents', 'Api\DocumentsController')->middleware('ajax')->only(['show']);

Как вывидите, у меня есть специальное промежуточное ПО под названием ajax. Это гарантирует, что только AJAX-запросы к конечной точке API принимаются:

app\Http\Middleware\RequestIsAjax.php

public function handle($request, Closure $next)
{
    if (! $request->ajax())
        return abort(403);
    return $next($request);
}

Далее, DocumentsController просто выглядит так:

public function show($id)
{
    $document = Document::findOrFail($id);

    return response()->json([
        'document' => $document,
    ], 200);
}

Пока все хорошо. Теперь моя проблема в том, что эта конечная точка API используется только для внутреннего использования (на данный момент), но как пользователь я могу легко просматривать информацию о документе других пользователей, просто отправив запрос AJAX по адресу:

/api/documents/<documentID>

и просто замените его на другой номер.

Мой вопрос: как я могу предотвратить это и обеспечить, чтобы только пользователь мог просматривать свои собственные документы?

1 Ответ

0 голосов
/ 16 октября 2019

Вы можете добавить дополнительную проверку. Это может быть так же элементарно, как это:

public function show($id)
{
    $document = Document::findOrFail($id);

    if ($document->user_id !== auth()->id())
    {
        return response()->json([
            'message' => 'You are not allowed to see this document',
        ], 403);
    }

    return response()->json([
        'document' => $document,
    ], 200);
}

В качестве альтернативы, вы также можете сделать это при поиске документа (потому что кажется, что вы не используете привязку модели), так что это также должно работать:

public function show($id)
{
    $document = Document::where('user_id', auth()->id)->find($id);

    if ($document)
    {
        return response()->json([
            'message' => "The document does not exist or you are not allowed to see it.",
        ], 404);
    }

    return response()->json([
        'document' => $document,
    ], 200);
}

Опять же, вы можете реализовать это не только в контроллере, но и в промежуточном программном обеспечении, запросе формы и т. Д.

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