Как запретить пользователю доступ к данным JSON из параметров запроса? - PullRequest
3 голосов
/ 25 октября 2019

Я разрабатываю очень простое веб-приложение, которое ищет акции компании.

Вот код JS (использует AJAX для получения акций компании с сервера):

document.getElementById("requestQuoteBtn").addEventListener("click", function createQuoteRequest(){
    var quoteSymbol = document.getElementById("requestedSymbol").value;
    var quoteRequest = createAJAX();

    quoteRequest.open('GET', '/quote?sym='+quoteSymbol);
    quoteRequest.send();

    quoteRequest.onload = function getQuoteRequest(){
        if(quoteRequest.status == 200){ // SUCCESSFUL
            displayQuoteData(false, JSON.parse(quoteRequest.response)); // basically shows a hidden div with the data
        }
        else // NO COMPANY W/ THIS SYMBOL FOUND
            displayQuoteData(true, null);
    };
});

Вот код Flask:

@app.route("/quote", methods=["GET"])
@login_required
def quote():
    requestedSymbol = request.args.get("sym")
    if not requestedSymbol:
        return "no symbol"

    quoteData = lookup(requestedSymbol) # USES AN API TO FETCH COMPANY'S STOCK

    if quoteData is None:
        return "NONE", 404
    else:
        return quoteData

Проблема в том, что если пользователь обращается, например, к этому URL-адресу:

www.mywebsite.com/quote?sym=AAPL

Буквально будет отображатьсясырой HTML с данными JSON вместо моего сайта с данными:

{"name":"Apple, Inc.","price":"$245.18","symbol":"AAPL"}

Как я могу предотвратить это?

1 Ответ

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

Если вы просто хотите убедиться, что пользователи не получают случайный доступ к вашей конечной точке API при попытке получить доступ к вашему веб-сайту (иначе речь идет о пользовательском опыте, и вы не заинтересованы в добавлении аутентификации к вашей конечной точке API)

Самый простой способ - создать отдельные маршруты для вашего API и маршрутизации вашего клиента

Обновление:

@app.route("/api/quote", methods=["GET"])

Аналогично обновлению:

quoteRequest.open('GET', '/api/quote?sym='+quoteSymbol);

Ваша маршрутизация клиента все равно будет:

@app.route("/quote", methods=["GET"])

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

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

В любом случае настройка отдельных маршрутов для ваших конечных точек API и клиентских маршрутов должна решить проблему отображения данных API вместоВаш клиентский шаблон при посещении:

mywebsite.com / quote? sym = AAPL

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