2011-08-04 114 views
4
您的服务器上的PHP文件

我建立了一个API,并有一个关于如何跟踪/知道哪些领域使用呼叫相关的域。获得通过AJAX调用

的API调用内置的PHP,并且不需要任何身份验证。用户很可能会在其服务器上的AJAX调用中使用该API。

因此,举例来说,我是服了API PHP文件域称为dev.yourmapper.com。域名www.metromapper.org上的某个人创建了一个创建Go​​ogle地图的页面,并使用Ajax调用我的文件将我的数据覆盖在他们的地图上。

这里是的行动,例如:http://www.metromapper.org/example/apitest.htm

(点击中心的地图标记来查看所有PHP服务器提供给yourmapper.com脚本变量的弹出式)

注意,HTTP_REFERER是可能的如果你点击链接(或者如果你剪切并粘贴链接,则为空)将成为'stackoverflow.com'。我认为引用者是metromapper.org,因为该域在加载后调用了yourmapper.com脚本,但显然不是。

底线:我可以用什么方法来确定哪些域叫我用javascript脚本yourmapper.com?如果需要,我可以使用除PHP以外的其他语言。谢谢。

+0

从某人留下的评论中,他们建议使用REMOTE_HOST和REMOTE_ADDR,您可以在标记弹出窗口中看到REMOTE_HOST和REMOTE_ADDR。原来,这是Google的IP地址,这是我的yourmapper.com数据在被Google提供之前的地址。 http://whatismyipaddress.com/ip/74.125.75.3所以它可能无法获得始发页的IP /域... –

+0

从上面不清楚你的API是从服务器调用还是从(例如,通过JSONP,绕过提供页面的服务器)。如果是后者,您可以将Javascript所在的页面的URL附加到您的ajax调用中,即window.location。 –

+0

@ chris-carson我可以从任何人的网页(如metromapper.org)调用dev.yourmapper.com上的API。 API可以将数据作为JSON提供,但在这种情况下,它将作为KML直接叠加在地图上。由于我无法控制其他人的Javascript代码,因此我无法强制他们将“window.location”添加到KML请求中。 –

回答

3

“我认为,引用者将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_pa​​ge_address] & req = [encrypted_request]

您的服务器使用页面url来确定应使用哪个密钥来解密数据。然后解密数据。如果数据已损坏或未解密到您期望的内容,那么这是一个无效的请求,您应该退出不返回任何内容。

我建议使用PHP文件进行加密而不是将加密写入JS中的原因是因为您不希望加载/解密加载客户端(每个站点访问者),并且PHP将要处理它要比JS快得多,因为有库可以为你处理这些任务。

无论如何,这应该能让您在正确的轨道上跟踪和验证针对您的API的不同网站的请求。

+0

感谢您的意见和伟大的想法。 关于HTTP_REFERER是的,我知道它可以被欺骗,但我更关心跟踪它在90%的情况下比我关于安全或欺骗。 JS也一样。 我不会告诉让用户点击JSON API调用通过域。我可以但这是最后的手段。另外,这比REFERER更容易改变。但我会认为这是最后的手段。 我不能要求人们在他们的服务器上放置一个PHP文件,以便所有的电话都可以通过。首先,大多数服务器不使用PHP,但也有点麻烦。 –

+0

你最后的想法是最可能的解决方案:让他们生成一个加密密钥。但问题在于,对于查看源代码的任何人来说,这个密钥可以清楚地看到(以及站点变量)。然后他们可以剪切并粘贴它。我想我可能只需要使用REMOTE_HOST IP地址,然后从这个即时发现域。这并不能解决Google服务器针对KML的问题,因此我必须单独弄清楚。 –

+0

是的关于关键的建议是假设你在他们的服务器上使用一个PHP文件。由于密钥只能存储在纯文本服务器端,而不是存放在所有访问者可见的JS代码中。使用密钥系统将是防止人们通过修改代码来使收集的数据无效的唯一方法。因为它可以让你确定请求确实来自他们的网站(并且不是修改JS代码的人)。如果您有这种能力,您也可以在JSP/ASP中编写小型API文件。这将使它得到更广泛的支持。 – Brian

1

你可以基于域名的哈希,让你的API的用户向域名和每个请求的哈希值。现在,由于您使用的是API,因此您将在头文件的某处设置“Access-Control-Allow-Origin”。如果你在PHP中这样做,你可以稍微玩一下。下面的脚本是一个简单的实例示例,它不需要调用者端的php(使用您的API的域)。

发送方(没有PHP的要求):

<script type="text/javascript"> 
    function callA() { 
    var xhttp = new XMLHttpRequest(); 
    xhttp.open("GET", "//ajaxdomain.com/call.php?"+ 
         "dom=www.callerdomain.com&"+ 
         "key=41f8201df6cf1322cc192025cc6c5013", 
       true); 
    xhttp.onreadystatechange = function() { 
     if(xhttp.readyState == 4 && xhttp.status == 200) { 
     handleResponse(xhttp.responseText); 
     } 
    } 
    xhttp.send(); 
    } 
</script> 

Ajax的服务器端(PHP):

<?php 
    if($_GET['key']==md5($_GET['dom']."Salt")) { 
    header("Access-Control-Allow-Origin: http://".$_GET['dom']); 
    } 
?> 

这样,如果呼叫从一个恶意域名来到头也将被放置,但其余的会因为一个异源异常而反弹,因此不会给出结果。

对于清代码空间,我在本例中使用了md5散列,但如果需要,可以使用更复杂的散列。请注意,您应该(一如既往)将使用的盐保密。

我把工作的例子在网上下面的(子)域。这些页面是相同的。

cors1.serioushare.com - 只适用于'CORS 1'按钮。
cors2.serioushare.com - 只适用于'CORS 2'按钮。