php REST - запретить прямой доступ в браузере - PullRequest
0 голосов
/ 19 октября 2018

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

Например, я говорю, что у меня вызов GET для "HOST / api"/ article / id ", который вернул бы статью с заданным идентификатором клиентскому приложению.Но когда я набираю «HOST / api / article / id» в своем браузере, статья не должна возвращаться - я не хочу, чтобы что-либо происходило (например, просто верните пустую страницу или 403).

  • Возможно ли это?
  • Если да, это обычная практика? (я имею в виду, что это то, что обычно хочется делать, или это неясно и / или нарушаетПринципы HTTP / REST и их следует избегать?)
  • Если да, то как мне это сделать? (в PHP / .htaccess / и т.д.)

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

(Я новичок в этом, так что, возможно,мой вопрос не имеет смысла. Может быть, я неправильно понял что-то очень общее о том, как работает REST / HTTP / что-либо еще. Если это так, пожалуйста, скажите мне.)

1 Ответ

0 голосов
/ 19 октября 2018

Обычный подход будет следующим:

  1. Ваш клиент (используя открытый ключ) запрашивает токен с сервера, токен проверяет, является ли ключ действительным и не занесен в черный список (вы можете просрочить / занести в черный список старые ключиесли они скомпрометированы)
  2. Токен отправляется каждый раз
  3. Сервер отвечает только при наличии токена

В зависимости от ваших требований, существует хакерский способреализовать это.

  1. Иметь переменную my_client со значением true
  2. При каждом запросе из вашего приложения переменная отправляется в ваших заголовках.
  3. Только для сервераинформация о серверах, если переменная «my_client» находится в заголовках

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

Это настолько просто, что вы можете написать ее на минуту, просто как тест.

<?php
 if(!$_SERVER['HTTP_MY_CLIENT']){
   header("HTTP/1.1 403 FORBIDEN");
  }

В продолжение концепции использования переменной заголовка мыможно использовать его как «полукокен», что будет означать, что мы будем заполнять значение случайным значением, которое только мы можем прочитать.

Итак, концепция такова:

Клиент -> Запрос случайногозначение Клиент / устанавливает значение в каждом заголовке запроса / Клиент -> отправляет запросы на сервер.

<?php
 /* A basic API token and authentication class. */
 class SimpleToken
 {
    /* Creates a salt based on the passed key that is good for the current day */
   public static function generateSalt($key)
   {
    return md5($key . date('Y-m-d'));
   }
  /* Crytographically combine the key and the salt to produce a token */
   public static function generateToken($key, $content)
   {
    $package = $content . $key;
    return crypt($package);
   }
   /* Generate a relatively strong SSL key */
  public static function generateKey()
   {
    $config = array(
        "digest_alg" => "sha512",
        "private_key_bits" => 4096,
        "private_key_type" => OPENSSL_KEYTYPE_RSA,
    );
    //Create a private key
    $res = openssl_pkey_new($config);
    //Extract the private part of the key
    openssl_pkey_export($res, $private_key);
    //Shorten it up for use in an API
    return md5($private_key);
}

/* Verify the authenticity of the passed key/token pair */
public static function isAuthentic($key, $content, $token)
{
    $package = $content . $key;
    if(crypt($package, $token) == $token)
    {
        return true;
    }
    else
    {
        return false;
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...