我的网页上有一个javascript,它调用一个php文件并将一些值传递给php文件。我怎么能确定对php文件的调用是来自我网页上的js而不是直接从浏览器地址栏输入php url?
答案 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)
您可以使用以下信息:
X-Requested-With: XMLHttpRequest
但两者都可以被黑客攻击。
如果您需要一个非常安全的解决方案,则需要为每个请求创建一个唯一的代码,并将其从JS发送到服务器。每次使用后,此代码都需要更改。
答案 2 :(得分:1)
你做不到。你暴露给世界的ajax暴露的任何东西。更重要的是,想要进入该页面的人无论如何都可以在页面上运行他们自己的javascript并欺骗他们想要的任何HTTP头。无论如何,这些人都是你想要保留的人。您不应该使用限制非恶意用户的措施,但不要向恶意用户提供相对较少的麻烦(如果有的话)。
那就是说,我从来没有听说过HTTP_X_REQUESTED_WITH
,并且在初步阅读的基础上使用它并不是一个好主意。我通常使用POST并检查_SERVER[REQUEST_METHOD]
是否为POST,因为大多数现代浏览器都会对网址栏发出的任何请求使用GET(这是我的经验)。同样,这不是为了防止坏人,只是为了防止事故发生。
您应采取的另一项措施是检查是否向页面发送了一个标志,以帮助发出来自验证来源的信号。根据ajax页面的安全性,您可能还需要验证会话等。一种安全的方法是创建一个唯一的哈希(例如md5)并将其存储在带有时间戳的数据库中。该哈希表示可以访问该页面,例如,最多三次。当用户单击您的ajax链接时,它会发送哈希。散列被标记为已消耗,无法重用。哈希在创建后的某个时间也应该过时(5分钟?这取决于你自己)。
最后,请确保友好机器人(robots.txt
,meta
,如果可能)等忽略此页面。这将阻止人们通过搜索引擎意外地到达它。