php - 通过AJAX获取在您的服务器上调用PHP文件的域

标签 php ajax api referer

我正在构建一个api,并有一个关于如何跟踪/知道哪些域使用该调用的问题。
api调用是用php构建的,不需要任何身份验证。用户很可能在服务器上的ajax调用中使用api。
例如,提供api php文件的域称为dev.yourmapper.com。www.metromapper.org域中的某个人构建了一个创建google地图的页面,并使用ajax调用我的文件以将我的数据覆盖在他们的地图上。
下面是实际的例子:http://www.metromapper.org/example/apitest.htm
(单击中间的映射标记以查看yourmapper.com脚本可用的所有php服务器变量的弹出窗口。)
请注意,如果单击链接,http_referer可能是“stackoverflow.com”(如果剪切并粘贴链接,则为空)。我认为引用者应该是metromapper.org,因为该域在加载后调用yourmapper.com脚本,但显然不是。
底线:我可以使用什么方法来确定哪个域正在用javascript调用我的yourmapper.com脚本?如果需要的话,我可以使用php以外的其他语言。谢谢。

最佳答案

“我认为引用者应该是metromapper.org,因为该域在加载后调用yourmapper.com脚本”
实际上这是不正确的。首先,您不应该依赖http_referer,因为它是大多数(不是所有)浏览器传递的自愿参数,而且很容易被欺骗。如果我愿意的话,我可以使用curl发送你的网站请求,使其看起来像是whitehouse.gov。那里没有安全措施。
我是这么说的。浏览器将该参数设置为将用户引用到当前加载页的页。不是脚本。因此,您看到结果的原因是,stackoverflow.com上的链接将用户引用到metromapper.org
最后,让我们来谈谈有趣的部分。您使用js在浏览器中编写代码。那很好,绝对没有问题。但是你必须记住js是开源的。所以人们可以(也会)搅乱你的代码来使用你的api,仅仅因为他们可以。我是这么说的。您最好的选择可能是在js api中传递站点的url和请求。这是“跟踪”网站使用脚本的最佳方式。您可以检查服务器端以确保传递了url。这将阻止人们修改您的api以删除将其url发送到服务器的位。但是,它不会阻止他们修改它,以使用其他人的url或随机未注册的url作为参数。
当然,您可以构建一个在服务器上运行的php api。js api连接到phpapi,而phpapi是zend-guard编码的(或其他一些源代码保护系统),但是仍然会有人对文件进行解码,以返回到源代码并与您发生冲突。当然,能够做到这一点的人要少得多,而普通用户更愿意使用你的api。然后,还存在这样的问题:人们无法在无法运行编码的php文件的服务器上运行api。
最后,您必须确定所需的安全性和身份验证级别,但由于您的api是在客户端浏览器中的javascript中运行的,因此除了混淆之外,几乎没有其他可用的方法。
我认为最好的选择是让js代码拦截当前页面的url,并将其与api请求一起发送。从那里你的服务器可以处理这个url来获取根域和你想存储的任何其他信息。
如果你想防止人们“欺骗”其他用户的网站url请求,你可以实现一个php api,安装在用户服务器的某个地方。例如http://www.domain.com/my-app-name.php
所有js api调用都应该经过该脚本。当用户下载你的api时,他们应该输入他们的网站url和其他一些信息。您的系统生成一个“密钥”,并将其注入到脚本中,然后将其打包以供下载。该密钥对其域有效,并用于使用say blowfish或另一种双向加密算法对与api的所有传输进行编码。这样,当你的api从他们的phpapi文件接收到请求时,你就得到了发出请求的页面的url,用一个只有你和该站点的管理员拥有的密钥进行编码。所以请求是这样的:metromapper.org/api?site=[url_encoded_page_address]&req=[加密的_请求]
您的服务器使用页面url来确定应该使用什么密钥来解密数据。然后解密数据。如果数据已损坏或未按预期解密,则这是一个无效请求,您应该退出,不返回任何内容。
我建议使用php文件进行加密,而不是将加密写入js,原因是您不想让客户端(每个站点访问者)负担加密/解密的负载,php将比js处理它快得多,因为有一些库帮你处理那些任务。
无论如何,这会让你走上正确的轨道,能够根据你的api跟踪和验证不同站点的请求。

关于php - 通过AJAX获取在您的服务器上调用PHP文件的域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6946744/

相关文章:

database - 返回在 Mule 中创建的数据库记录的详细信息

php - 在不覆盖现有元素的情况下不能插入元素

javascript - 在触发一系列ajax请求时排队

c# - 通过AJAX MVC下载Excel文件,而无需将文件保存在ASP.Net/C#中的服务器上

javascript - jQuery AJAX Post alert() 未被调用

api - 从Twitter客户端读取响应返回错误

javascript - DOM 有什么问题?

php - url 管理器 yii

php - 无法从数据库回显表

php - Symfony2 简单结果缓存?