“我认为,引用者将metromapper.org,因为该域调用脚本yourmapper.com加载后”
这其实不正确。首先你不应该依赖HTTP_REFERER,因为它是大多数(不是全部)浏览器传递的自愿参数,并且很容易被欺骗。如果我愿意,我可以使用CURL发送您的网站请求,使其看起来像推荐人是whitehouse.gov。那里没有安全措施。
这就是说。浏览器将该参数设置为将用户引用到当前加载的页面的页面。不是脚本。所以,你看到的结果,你所看到的原因是因为用户是通过一个链接所指metromapper.org上stackoverflow.com
最后,让我们对这种多汁的一部分。您正在使用JS在浏览器中编写代码。这很好,这绝对没有问题。但是你必须记住JS是开源的。因此,人们可以(并且会)混淆你的代码,只是因为他们可以玩你的API。话虽如此。你最好的选择可能是在你的JS api中传递网站的URL和请求。这是“跟踪”哪些网站使用脚本的最佳方式。您可以检查服务器端以确保URL已通过。这将阻止人们修改您的API以删除将其URL发送到您的服务器的位。但是,它不会阻止它们将其修改为使用其他人的url或随机未注册的参数作为参数。
当然,你可以建立一个PHP API,他们在他们的服务器上运行。 JS API连接到PHP API,而PHP API是zend-guard编码(或其他一些源代码保护代码系统),但是仍然有人会解码文件以回到源代码并与您混淆。当然,能够做到这一点的人数会少得多,而普通用户只会更愿意使用您的API。然后,您也有人无法在不能运行编码的PHP文件的服务器上运行API的问题。
在你要确定你想要的安全和认证级别的结束,而是因为你的API在JavaScript中的客户端浏览器中运行,很少有提供超越混淆。
我想说你最好的选择是让你的JS代码拦截当前页面的URL,并用API请求发送它。从那里你的服务器可以处理URL来获取你想存储的根域和其他任何信息。
如果您想阻止人们“欺骗”其他用户的网站URL请求,您可以实现一个PHP API,该PHP API将在用户的服务器上安装在某个地方。例如http://www.domain.com/my-app-name.php
所有JS API调用都应该通过该脚本。当用户下载你的API时,他们应该输入他们的网站URL和一些其他信息。系统生成一个“密钥”并将其注入到脚本中,然后将其打包下载。该密钥对其域是有效的,并用于使用sayfish或其他双向加密算法对所有传输进行编码。通过这种方式,当您的API收到来自PHP API文件的请求时,您将获取请求的网址,并使用只有您和该网站的管理员拥有的密钥进行编码。所以请求通过如下方式来实现:metromapper.org/api?site=[url_encoded_page_address] & req = [encrypted_request]
您的服务器使用页面url来确定应使用哪个密钥来解密数据。然后解密数据。如果数据已损坏或未解密到您期望的内容,那么这是一个无效的请求,您应该退出不返回任何内容。
我建议使用PHP文件进行加密而不是将加密写入JS中的原因是因为您不希望加载/解密加载客户端(每个站点访问者),并且PHP将要处理它要比JS快得多,因为有库可以为你处理这些任务。
无论如何,这应该能让您在正确的轨道上跟踪和验证针对您的API的不同网站的请求。
从某人留下的评论中,他们建议使用REMOTE_HOST和REMOTE_ADDR,您可以在标记弹出窗口中看到REMOTE_HOST和REMOTE_ADDR。原来,这是Google的IP地址,这是我的yourmapper.com数据在被Google提供之前的地址。 http://whatismyipaddress.com/ip/74.125.75.3所以它可能无法获得始发页的IP /域... –
从上面不清楚你的API是从服务器调用还是从(例如,通过JSONP,绕过提供页面的服务器)。如果是后者,您可以将Javascript所在的页面的URL附加到您的ajax调用中,即window.location。 –
@ chris-carson我可以从任何人的网页(如metromapper.org)调用dev.yourmapper.com上的API。 API可以将数据作为JSON提供,但在这种情况下,它将作为KML直接叠加在地图上。由于我无法控制其他人的Javascript代码,因此我无法强制他们将“window.location”添加到KML请求中。 –