我在我的网站上有一个PHP页面,它从我的数据库中检索数据,以便在我的网站上显示。该页面通过AJAX调用。如何限制只能从我网站中的网页访问它,以便那些想要滥用它并从网站上获取不的数据的用户(例如从他们的服务器发布HTTP请求)本身将不会能够这样做吗?
答案 0 :(得分:8)
这就是我的工作,
编辑:代码示例,
在您的网站中,您可以这样做,
$key = 'supersecretkey'; // This is your security, don't expose this
$nonce = rand();
$timestamp = time();
$signature = hash_hmac('sha1', $_SERVER['REMOTE_ADDR'] . $nonce . $timestamp, $key);
将变量打印到页面
<script type="text/javascript">
<?php
echo " var signature = '" . $signature . "';\n";
echo " var nonce = '" . $nonce . "';\n";
echo " var timestamp = '" . $timestamp . "';\n";
?>
</script>
进行AJAX调用时,将3个参数传递给服务器,
http://example.com?signature=...&nonce=...×tamp=...
在AJAX服务器上,再次进行计算,
$key = 'supersecretkey'; // This is your security, don't expose this
$nonce = $_REQUEST['nonce'];
$timestamp = $_REQUEST['timestamp'];
$signature = hash_hmac('sha1', $_SERVER['REMOTE_ADDR'] . $nonce . $timestamp, $key);
if ($signature == $_REQUEST['signature'])
// the call if from my page.
您还可以为货币和随机数填充时间戳以进行重播(需要会话或数据存储)。
答案 1 :(得分:2)
如果如上所述,您无法真正做到这一点,您需要重新设计并实施某种身份验证方案,但即使这样也可以模拟。简短的回答是,如果网络浏览器可以访问它,那么任何东西都可以访问它,只要它假装是一个浏览器。
您可以采取一些措施使某些人更难,例如验证HTTP头字段(如Referer和User-Agent),以及在AJAX调用中实现会话验证。
答案 2 :(得分:1)
由于Same-Origin Policy for XHR,在其他网站上运行的JavaScript将无法访问您的网站。但是没有什么可以阻止某人构建一个PHP + CURL脚本来“代理”来自你的ajax支持的数据,使其看起来好像在他们的服务器上运行。试图将客户列入黑名单是麻烦的,IP地址很便宜,免费的http代理很多。
简而言之,您的javascript没什么特别之处。客户可以做任何他想做的事,你不能强迫他表现,这是“客户站点信任”的基础。黑客可以使用tamperdata甚至firebug之类的东西来识别HTTP请求,他将能够重放它们或用CURL伪造它们。
你可以试试obfuscating你的javascript。但是在一天结束时,攻击者只是要重播http请求,你可以做的就是它。
答案 3 :(得分:0)
答案 4 :(得分:0)
与@ ZZ-coder的答案类似,但您可以使用Cookie。
1)在服务器上设置cookie (“ip-address + secret”的哈希值),这是一个非持久性cookie,仅在用户登录后持续1个会话。
2)在AJAX请求期间检查服务器上的cookie (因为cookie也是通过AJAX请求发送的)
这与@ ZZ-coder的答案类似,但您可以完全跳过JS部分。
答案 5 :(得分:-2)
有多种选择,具体取决于您的潜在需求,是否允许其他人访问的服务,以及仅限内部访问的服务。这篇文章对选项有一些很好的深入解释。
http://java.sun.com/developer/technicalArticles/J2EE/usingapikeys/