代码之家  ›  专栏  ›  技术社区  ›  awa993

php REST-阻止在浏览器中直接访问

  •  0
  • awa993  · 技术社区  · 6 年前

    例如,假设我对“HOST/api/article/id”进行了GET调用,该调用会将具有给定id的文章返回给客户机应用程序。但是当我在浏览器中键入“HOST/api/article/id”时,不应该返回文章-我不希望发生任何事情(例如只返回空页或403)。

    • 如果是,这是惯例吗? (我的意思是,这是人们通常想要做的事情,还是含糊不清和/或违反了HTTP/REST原则,应该避免?)
    • 如果是,我该怎么做? (在PHP/.htaccess/etc中)

    1 回复  |  直到 5 年前
        1
  •  1
  •   thefolenangel    6 年前

    1. 您的客户机(使用公钥),从服务器请求令牌,令牌检查密钥是否有效且未列入黑名单(如果旧密钥被泄露,您可以将其过期/列入黑名单)
    2. 每次都发送令牌

    1. 有一个变量,名为“myu client”,值为true
    2. 如果标头中有“my\ u 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;
        }
      }
    }