我怎么知道php文件是否只是从客户端的js调用的


how can i know if a php file was only called from js on the client side?

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

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

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

你可能想看看是否所有浏览器都支持PHP';s$_SERVER[';HTTP_X_REQUESTD_WITH';]?用于解释哪些浏览器/JavaScript库发送CCD_ 3报头。

您可以使用以下信息:

  1. 正在发送的头(通常Ajax调用会添加特殊的头(
    X-Requested-With: XMLHttpRequest
  2. 引用$_SERVER中的URL

不过两者都可以被黑客入侵。

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

你不能。你向ajax公开的任何东西都是向世界公开的。更重要的是,想要进入该页面的人可以在页面上运行他们自己的javascript,并伪造他们想要的任何HTTP头。不管怎样,这些人都是你想避开的。你不应该使用限制非恶意用户的措施,但给恶意用户带来的麻烦相对较小(如果有的话(。

也就是说,我从来没有听说过HTTP_X_REQUESTED_WITH,根据初步阅读,使用它不是一个好主意。我通常使用POST并检查_SERVER[REQUEST_METHOD]是否为POST,因为大多数现代浏览器都会对url栏发出的任何请求使用GET(这是我的经验(。再说一遍,这不是为了把坏人拒之门外,只是为了防止事故发生。

您应该采取的另一项措施是检查是否向页面发送了标志,以帮助发出来自已验证来源的信号。根据ajax页面的安全程度,您可能还需要验证会话等。一种稍微安全的方法是创建一个唯一的哈希(例如md5(,并将其与时间戳一起存储在DB中。该散列表示该页面最多可以访问三次。当用户单击ajax链接时,它会发送散列。哈希被标记为已消耗,不能重复使用。哈希也应该在创建后的一段时间内过期(5分钟?取决于具体情况,由您决定(。

最后,请确保友好的机器人(如果可能的话,robots.txtmeta等(忽略此页面。这将防止人们通过搜索引擎意外访问它。