php REST-防止在浏览器中直接访问
我正在用PHP开发RESTAPI服务器,我计划由客户端应用程序调用它,但我想阻止通过浏览器直接访问API 例如,假设我对“HOST/api/article/id”进行了调用,该调用会将具有给定id的文章返回给客户端应用程序。但是,当我在浏览器中键入“HOST/api/article/id”时,不应该返回文章-我不希望发生任何事情(例如只返回空页或403)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原则,应该避免?) 如果是
- 这可能吗?
- 如果是,这是常见的做法吗?(我的意思是,这是人们通常想要做的事情,还是模糊和/或违反HTTP/REST原则,应该避免?)
- 如果是,我该怎么做?(在PHP/.htaccess/etc中)
(我对此有点陌生,所以可能我的问题没有意义。可能我误解了REST/HTTP/任何东西的工作原理。如果是这样,请告诉我。)通常的方法是:
<?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;
}
}
}