Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php REST-防止在浏览器中直接访问_Php_Rest_.htaccess_Api - Fatal编程技术网

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

php REST-防止在浏览器中直接访问,php,rest,.htaccess,api,Php,Rest,.htaccess,Api,我正在用PHP开发RESTAPI服务器,我计划由客户端应用程序调用它,但我想阻止通过浏览器直接访问API 例如,假设我对“HOST/api/article/id”进行了调用,该调用会将具有给定id的文章返回给客户端应用程序。但是,当我在浏览器中键入“HOST/api/article/id”时,不应该返回文章-我不希望发生任何事情(例如只返回空页或403) 这可能吗? 如果是,这是常见的做法吗?(我的意思是,这是人们通常想要做的事情,还是模糊和/或违反HTTP/REST原则,应该避免?) 如果是

我正在用PHP开发RESTAPI服务器,我计划由客户端应用程序调用它,但我想阻止通过浏览器直接访问API

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

  • 这可能吗?
  • 如果是,这是常见的做法吗?(我的意思是,这是人们通常想要做的事情,还是模糊和/或违反HTTP/REST原则,应该避免?)
  • 如果是,我该怎么做?(在PHP/.htaccess/etc中)
我知道我可以实现某种授权(比如API密钥),它只允许客户端应用程序执行API,我计划无论如何都要这样做


(我对此有点陌生,所以可能我的问题没有意义。可能我误解了REST/HTTP/任何东西的工作原理。如果是这样,请告诉我。)

通常的方法是:

  • 您的客户机(使用公钥),从服务器请求令牌,令牌检查密钥是否有效且未列入黑名单(如果旧密钥被泄露,您可以将其过期/列入黑名单)
  • 每次都会发送令牌
  • 服务器仅在有令牌时响应
  • 根据您的需求,有一种黑客方法来实现这一点

  • 有一个名为“my_client”的变量,其值为true
  • 在应用程序发出的每个请求中,都会在标题中发送变量
  • 如果“my_client”变量位于标头中,则服务器仅会服务器信息
  • 这种方法的缺点是,这不是真正安全的,因为每个人都可以看到他们发出的请求。因此,我们可以注意到这些额外的信息

    它非常简单,您可以编写一分钟,就像测试一样

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

    您是否尝试过类似
    if(count(get_included_files())==1)退出(“错误,联系管理员”)他们试图访问的php文件?这可能值得一读。让服务器通过证书强制执行客户端身份验证,并且仅在连接时允许访问。浏览器通常不会发送@codebrane谢谢,我会给它一个readThank的答案。我不需要尖端的安全性,不会有任何个人或关键数据。这只是我的业余爱好。即使如此,你的黑客方式似乎还不够安全。我想我会尝试第一种方法,看看它会走到哪里。@awa993 1您可以改进的方法是使用header变量的值,并在那里插入服务器生成的内容,在第五次调用时您可以验证:)也许这就足够了。就像我说的,我不需要太多的安全。虽然我的服务器站点将是公开的(由于它将挂在internet上,这真是一个惊喜),但我将只与少数朋友共享它。@awa993我用一个类扩展了答案,该类可以生成并验证随机字符串,您可以使用:)P.S.如果这个答案,帮助您并回答您的问题您能将其标记为已接受的答案吗谢谢您的代码示例。我可能现在就这么说&稍后再看是否足够。
    
    <?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;
        }
      }
    }