我在我的网站上有一个PHP页面,它从我的数据库中检索数据,以便在我的网站上显示.该页面通过AJAX调用.我怎样才能限制只能从网页网站内谁愿意滥用它,并得到这个数据的访问它,因此用户无法从网站(从他们的服务器如HTTP发布请求)本身就不能这样做呢?
这就是我做的,
编辑:代码示例,
在您的网站中,您这样做,
$key = 'supersecretkey'; // This is your security, don't expose this
$nonce = rand();
$timestamp = time();
$signature = hash_hmac('sha1', $_SERVER['REMOTE_ADDR'] . $nonce . $timestamp, $key);
Run Code Online (Sandbox Code Playgroud)
将vars打印到页面,
<script type="text/javascript">
<?php
echo " var signature = '" . $signature . "';\n";
echo " var nonce = '" . $nonce . "';\n";
echo " var timestamp = '" . $timestamp . "';\n";
?>
</script>
Run Code Online (Sandbox Code Playgroud)
进行AJAX调用时,将3个参数传递给服务器,
http://example.com?signature=...&nonce=...×tamp=...
Run Code Online (Sandbox Code Playgroud)
在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.
Run Code Online (Sandbox Code Playgroud)
您还可以为货币和随机数填充时间戳以进行重放(需要会话或数据存储).
由于XHR 的同源策略,在其他站点上运行的 JavaScript 将无法访问您的站点。但是没有什么可以阻止某人构建 PHP+CURL 脚本来“代理”来自您的 ajax 支持的数据,使其看起来好像在他们的服务器上运行。尝试将客户端列入黑名单很麻烦,IP 地址很便宜,而且免费的 http 代理也很多。
简而言之,你的 javascript 没有什么特别的。客户可以为所欲为,你不能强迫他做任何事,这就是“客户现场信任”的基础。黑客可以使用诸如tamperdata甚至firebug之类的东西来识别 HTTP 请求,并且他将能够重放它们或使用 CURL 伪造它们。
你可以尝试混淆你的 JavaScript。但归根结底,攻击者只会重放 http 请求,而您绝对可以对此采取措施。