如何仅限制从我网站中的页面访问某些PHP页面?

Yos*_*ssi 7 php security ajax

我在我的网站上有一个PHP页面,它从我的数据库中检索数据,以便在我的网站上显示.该页面通过AJAX调用.我怎样才能限制只能从网页网站内谁愿意滥用它,并得到这个数据的访问它,因此用户无法从网站(从他们的服务器如HTTP发布请求)本身就不能这样做呢?

ZZ *_*der 8

这就是我做的,

  1. 在您的网站上,创建一个秘密字符串.我使用HMAC($ _ SERVER ['REMOTE_ADDR'],键).
  2. 在Javascript var中写下秘密.
  3. 在AJAX调用中,将此字符串作为参数传递.
  4. 在AJAX服务器上,再次执行哈希.如果它与参数匹配,则呼叫来自您的页面.

编辑:代码示例,

在您的网站中,您这样做,

$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=...&timestamp=...
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)

您还可以为货币和随机数填充时间戳以进行重放(需要会话或数据存储).


roo*_*ook 1

由于XHR 的同源策略,在其他站点上运行的 JavaScript 将无法访问您的站点。但是没有什么可以阻止某人构建 PHP+CURL 脚本来“代理”来自您的 ajax 支持的数据,使其看起来好像在他们的服务器上运行。尝试将客户端列入黑名单很麻烦,IP 地址很便宜,而且免费的 http 代理也很多。

简而言之,你的 javascript 没有什么特别的。客户可以为所欲为,你不能强迫他做任何事,这就是“客户现场信任”的基础。黑客可以使用诸如tamperdata甚至firebug之类的东西来识别 HTTP 请求,并且他将能够重放它们或使用 CURL 伪造它们。

你可以尝试混淆你的 JavaScript。但归根结底,攻击者只会重放 http 请求,而您绝对可以对此采取措施。