我正在构建一个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 Server变量。)
请注意,如果您单击链接,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。这样可以防止人们修改您的API来删除将其URL发送到您的服务器的位。但是,它不会阻止他们将其修改为使用其他人的网址或随机未注册的网址作为参数。
确保您可以构建一个在其服务器上运行的PHP API。JS API连接到PHP API,并且PHP API是zend- guard编码的(或其他一些源代码保护代码系统),但是仍然会有人对该文件进行解码以返回到您的源并与您混淆。当然,能够这样做的人要少得多,而普通用户宁愿照原样使用您的API。然后,还有一个问题,就是人们无法在没有能力运行编码的PHP文件的服务器上运行API。
最后,您必须确定所需的安全性和身份验证级别,但是由于您的API在客户端浏览器中的JavaScript中运行,因此除了模糊处理外,几乎没有其他可用的方法。
我想说,最好的选择是让您的JS代码紧抓当前页面的URL,然后将其与API请求一起发送。从那里,您的服务器可以处理URL以获取根域和您要存储的任何其他信息。
如果要防止人们“欺骗”对其他用户的网站URL的请求,则可以实现一个PHP API,该API可以在特定位置安装在用户的服务器上。例如http://www.domain.com/my-app- name.php
所有JS API调用都应通过该脚本。用户下载您的API时,他们应该输入其网站URL和其他信息。您的系统会生成一个“密钥”,并将其注入脚本中,然后再打包以供他们下载。该密钥在其域内有效,并用于使用河豚或另一种2向加密算法对与API之间的所有传输进行编码。这样,当您的API收到来自其PHP API文件的请求时,您将获得发出请求的页面的URL,并用只有您和该站点的管理员拥有的密钥进行编码。因此,请求是这样发送的:metromapper.org/api?site=[url_encoded_page_address]&req=[encrypted_request]
您的服务器使用页面URL来确定应使用什么密钥来解密数据。然后,它解密数据。如果数据已损坏或没有解密为您期望的数据,则这是无效请求,您应该退出而不返回任何内容。
我建议使用PHP文件进行加密,而不是将加密写入JS,这是因为您不想给客户端(每个站点访问者)带来加密/解密的负担,PHP会更快地处理它。比JS还要多,因为有一些库可以为您处理这些任务。
无论如何,应该使您正确地跟踪和验证针对您API的不同站点的请求。