繁体   English   中英

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

[英]How can I restrict access to some PHP pages only from pages within my website?

我的网站上有一个PHP页面,该页面从数据库中检索数据以显示在我的网站中。 该页面通过AJAX调用。 我该如何限制仅从我网站上的页面进行访问,以便想要滥用它而不能从网站(例如,从其服务器发布HTTP请求)获取数据的用户本身无法这样做?

我就是这样

  1. 在您的网站上,创建一个秘密字符串。 我使用HMAC($ _ SERVER ['REMOTE_ADDR'],密钥)。
  2. 将机密内容写成Javascript变量。
  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);

将变量打印到页面上,

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

在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.

您还可以查询时间戳记以获取货币,并查询随机数以进行重放(需要会话或数据存储)。

如果如上所述,这实际上是无法做到的,您将需要重新设计并实现某种身份验证方案,但即使可以进行模拟。 简短的答案是,如果Web浏览器可以访问它,那么只要它假装为浏览器,任何人都可以访问它。

您可以采取一些措施使某人变得更难,例如,验证HTTP标头字段(例如Referer和User-Agent)以及在AJAX调用中实现会话验证。

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

简而言之,您的javascript没有什么特别的。 客户可以做任何他想做的事,而你不能强迫他做事,这是“客户站点信任”的基础。 黑客可以使用篡改数据甚至Firebug之类的东西来识别HTTP请求,他将能够重播这些请求或使用CURL伪造它们。

您可以尝试混淆 JavaScript。 但是最终,攻击者将只是重播http请求,因此您绝对可以做些事情。

与@ ZZ-coder答案类似,但是您可以使用Cookie来完成。

1) 在服务器上设置cookie (“ ip-address + secret”的哈希),这是一种非持久性cookie,在用户登录后仅持续1个会话。

2) 在AJAX请求期间检查服务器上的cookie (因为cookie也与ajax请求一起发送)

这类似于@ ZZ-coder的答案,但是您可以完全跳过JS部分。

las,那是不可能的。 Javascript可以执行的任何操作,“滥用者”也可以通过其服务器执行。 您可以通过混淆javascript和协议使其变得更加困难,从而使其难以嗅探。 有多种免费和非免费的javascript混淆器(也称为“最小化”)。 通过对发送和接收的数据实施简单的加密方案(使密钥更高级将无济于事,因为密钥必须始终嵌入在您的代码中),可以使协议模糊。

有多种选择,具体取决于您的基本需求,是否让他人访问它提供的服务,还是仅基于内部的服务。 这是一篇文章,其中对这些选项进行了很好的深入说明。

http://java.sun.com/developer/technicalArticles/J2EE/usingapikeys/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM