我正在尝试编写各种网站将嵌入的代码,在我的服务器上调用脚本。该脚本流式传输图像的二进制数据并将其吐入图像标记。
但是,我正在尝试控制谁有权访问该脚本。因此,如果我将我的嵌入代码分发给yourwebsite.com,我想确保请求此脚本的客户端从“yourwebsite.com”获取它。
有什么建议吗?
答案 0 :(得分:4)
您是否尝试过$_SERVER['HTTP_REFERER']
?
这大部分时间都可以使用,但请考虑到这一点:
REFERER由客户端的浏览器作为HTTP协议的一部分发送,因此确实不可靠。它可能不存在,它可能是伪造的,如果是出于安全原因,你就是不能相信它。
如果您想验证某个请求是否来自您的网站,那么您不能,但您可以验证该用户是否已访问过您的网站和/或已通过身份验证。 Cookie是在AJAX请求中发送的,因此您可以依赖它。
通过@Seldaek
答案 1 :(得分:2)
最简单的方法是检查引用$_SERVER['HTTP_REFERER']
。但这可能是伪造的。
使用某种授权更安全,即
您允许每个客户端看到此图片是唯一的密钥(或盐)。
然后,您的客户必须创建标准化的时间字符串,如20100701170821
。
然后你的客户可以做这样的事情:
<?php
$public_identifier = "yourclient.com";
$secret = "1234567890ABCDFGHIJKLMNOPQRSTUVWXYZ";
$time_string = date("YmdHis");
$signature = hash_hmac('sha256',$time_string,$secret)
$url_to_access_the_images += "?time=$timestring&signature=$signature&client_id=$public_identifier"
?>
这将生成如下的URL:
yourdomain.com/secret_image.php?time=20100701170821&signature=e9de9112433944188b5da9fa7157bf167bfdd6af95120aea2674424838154ea9&client_id=yourclient.com
在您的网站上,您可以像这样进行检查:
<?php
$secret = get_secret_for_client_id($_GET['client_id']);
// check if the request time is within a tolerance of 15 minute
// time difference between client server and your server
// and check if he's authorized (signature is valid).
if(abs(int($_GET['time']) - int(date("YmdHis"))) < 1500) &&
$_GET['signature'] == hash_hmac('sha256',$_GET['time'],$secret)) {
// do what ever you do to ouput the picture
} else {
// do what ever you do for unauthorized access.
}
?>
答案 2 :(得分:0)
请参阅Determining Referrer in PHP。
您可以使用$_SERVER
变量:
$ref = $_SERVER['HTTP_REFERER'];
更多关于HTTP Referrers。
答案 3 :(得分:0)
我宁愿使用
$_SERVER['REMOTE_ADDR'];
而不是易于欺骗的REFERER。您可能必须为客户端分配多个IP,但这不应该是一个问题。
如果您不想使用服务器变量,只需分发一个API密钥,让他们在每次请求时将其提交给您的服务脚本。