我怎么知道一个php文件是否只在客户端从js调用?

时间:2011-07-02 06:43:45

标签: php javascript

我的网页上有一个javascript,它调用一个php文件并将一些值传递给php文件。我怎么能确定对php文件的调用是来自我网页上的js而不是直接从浏览器地址栏输入php url?

3 个答案:

答案 0 :(得分:5)

如果$_SERVER['HTTP_X_REQUESTED_WITH']XMLHttpRequest,您需要使用检查。这将阻止人们在允许Ajax请求时直接在浏览器中键入URL。

if ( ! empty($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest' )
{
  // Do something useful
}

您可能希望查看Do all browsers support PHP's $_SERVER['HTTP_X_REQUESTED_WITH']?以获取有关哪些浏览器/ JavaScript库发送HTTP_X_REQUESTED_WITH标头的说明。

答案 1 :(得分:2)

您可以使用以下信息:

  1. 正在发送的标头(通常是Ajax调用添加特殊标头)
    X-Requested-With: XMLHttpRequest
  2. 引用$ _SERVER
  3. 中的网址

    但两者都可以被黑客攻击。

    如果您需要一个非常安全的解决方案,则需要为每个请求创建一个唯一的代码,并将其从JS发送到服务器。每次使用后,此代码都需要更改。

答案 2 :(得分:1)

你做不到。你暴露给世界的ajax暴露的任何东西。更重要的是,想要进入该页面的人无论如何都可以在页面上运行他们自己的javascript并欺骗他们想要的任何HTTP头。无论如何,这些人都是你想要保留的人。您不应该使用限制非恶意用户的措施,但不要向恶意用户提供相对较少的麻烦(如果有的话)。

那就是说,我从来没有听说过HTTP_X_REQUESTED_WITH,并且在初步阅读的基础上使用它并不是一个好主意。我通常使用POST并检查_SERVER[REQUEST_METHOD]是否为POST,因为大多数现代浏览器都会对网址栏发出的任何请求使用GET(这是我的经验)。同样,这不是为了防止坏人,只是为了防止事故发生。

您应采取的另一项措施是检查是否向页面发送了一个标志,以帮助发出来自验证来源的信号。根据ajax页面的安全性,您可能还需要验证会话等。一种安全的方法是创建一个唯一的哈希(例如md5)并将其存储在带有时间戳的数据库中。该哈希表示可以访问该页面,例如,最多三次。当用户单击您的ajax链接时,它会发送哈希。散列被标记为已消耗,无法重用。哈希在创建后的某个时间也应该过时(5分钟?这取决于你自己)。

最后,请确保友好机器人(robots.txtmeta,如果可能)等忽略此页面。这将阻止人们通过搜索引擎意外地到达它。