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

时间:2010-05-06 21:09:24

标签: php ajax security

我在我的网站上有一个PHP页面,它从我的数据库中检索数据,以便在我的网站上显示。该页面通过AJAX调用。如何限制只能从我网站中的网页访问它,以便那些想要滥用它并从网站上获取的数据的用户(例如从他们的服务器发布HTTP请求)本身将不会能够这样做吗?

6 个答案:

答案 0 :(得分:8)

这就是我的工作,

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

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

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

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

答案 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)

唉,那是不可能的。任何Javascript都可以做,'滥用者'也可以从他的服务器做。你可以通过混淆javascript和协议使其变得更加困难,使其更难以嗅探。 有各种免费和非免费的javascript混淆器(也称为“最小化”)可用。 对于发送和接收的数据,通过实施简单的加密方案(使其更高级无效,因为密钥必须始终嵌入到代码中)无法模糊协议。

答案 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/