Javascript http_源可以被欺骗吗?

Javascript http_源可以被欺骗吗?,javascript,php,security,Javascript,Php,Security,我托管了一个javascript,站点所有者可以在他们的网站上运行它。我的服务器是一个灯堆。我正在尝试保护已批准网站的脚本。有什么方法可以做到这一点?我目前正在寻找$\u服务器['HTTP\u ORIGIN']和访问控制允许ORIGIN到允许访问。这是最安全的方法吗,可以欺骗吗 我的javascript是为了提供服务,需要安全。想想google analytics——人们放在网站上的js。根据web标准,出于安全原因,通过XMLHttpRequest(AJAX)发出的跨源请求不允许避免一个域从另

我托管了一个javascript,站点所有者可以在他们的网站上运行它。我的服务器是一个灯堆。我正在尝试保护已批准网站的脚本。有什么方法可以做到这一点?我目前正在寻找
$\u服务器['HTTP\u ORIGIN']
访问控制允许ORIGIN
允许访问
。这是最安全的方法吗,可以欺骗吗


我的javascript是为了提供服务,需要安全。想想google analytics——人们放在网站上的js。

根据web标准,出于安全原因,通过XMLHttpRequest(AJAX)发出的跨源请求不允许避免一个域从另一个域访问另一个资源。这适用于通过XMLHttpRequest对象启动的请求。“源”标头用于帮助允许跨域资源共享,同时仍保持对资源的安全检查,并且仅针对被视为跨域请求的请求发送

对于您的情况,检查Origin头是错误的,因为对托管脚本的请求不是通过XMLHttpRequest启动的,而是通过脚本元素的src属性启动的

最佳做法是检查referer头。几乎每个请求都会发送此消息,在实施跨站点请求伪造防御时检查此消息也很好

使用regex从发送的referer头捕获主机。然后根据允许的主机列表检查主机

如果捕获的主机未列入白名单,则通过发送404或403响应(如您认为合适)来拒绝访问

$allow = FALSE;
$allowed_hosts = ['http://www.example.com/']; //note the ending slash
$matches = [];
$referrer = array_key_exists('HTTP_REFERER', $_SERVER)? $_SERVER['HTTP_REFERER'] : NULL;
if (!is_null($referrer) && preg_match('/^(http[s]?\:\/\/[^\/]+\/)/', 
$referrer, $matches)) {
    $host = strtolower($matches[1]);
    if (in_array($host, $allowed_hosts)) {
        $allow = TRUE;
    }
}
if ($allow) {
    header("Content-Type: text/javascript");
    header('Cache-Control: max-age=86400');
    echo file_get_contents('path to javascript');
}
else{
   header("HTTP/1 403 Forbidden");
   exit;
}

和往常一样,这取决于你想要保护什么

什么可以阻止用户使用授权的推荐人/来源伪造完整请求、下载javascript并将其托管在服务器上

还要注意的是,在某些情况下,referer/origin可能会被伪造。例如,某些浏览器扩展(当然,如果安装了)一些旧版本的Java或Flash插件,可能其他东西也允许此类伪造。作为一个极端的例子,你的内容的胭脂消费者可能会要求他的访问者首先安装一个浏览器扩展,它“允许访问他的内容”,而实际上它允许他伪造推荐人/来源

如果你真的想保护你的内容,你只想让授权的客户端下载它,不幸的是,实现这一点的唯一途径是某种身份验证。现在很明显,您不想验证最终用户,但是发送给他的网站,这是一个有趣的场景,超出了这个答案的范围

除此之外,可能你能做的最常见和最好的实践是,你可以为授权网站提供类似于api密钥的东西,就像谷歌在他们的服务中所做的那样。密钥在任何客户页面中都是明文的,但是如果您有适当的监控,您可以撤销被滥用的密钥。请注意,这不是身份验证,任何人都可以从其页面源复制主机网站密钥,但您将有机会发现滥用,例如,并非所有人都会安装浏览器扩展或插件,并且您将看到给定api密钥上的引用不匹配。在许多情况下,这可能已经足够好了。请注意,困难不在于api关键部分,而在于有效的监控。

您的“安全”模式似乎是基于防止其他人使用您的代码。这有一些明显的解决方案,但是它们取决于你打破了最终用户可能认为安全的东西。 您已经有了法律保护,防止未经许可使用您的代码的人。您描述的方法提供了有限的技术保护


如果你真的认为你的代码很好/很有价值,那么移动逻辑服务器端,用JavaScript编写一个基本的渲染器,通过WebSocket进行连接

也许你会看到,当然,它可以被欺骗。什么都可以。清理并验证所有输入。CORS不被脚本标记使用,只被ajax使用。因此,该脚本在任何关闭了referer的浏览器上都会失败,并且在Safari中经常由于其错误的referer处理而失败。您能否给出一个测试场景来证明Safari有错误的referer处理。所有主要浏览器都会发送referer头,即使在本地计算机(localhost)上工作时也是如此。为了满足要求,如果referer标头不存在,则应该中止请求。这就是白名单防卫的本质。根据他的说法,由于javascript不是一种公共资源,我相信所提供的解决方案将实现这一点,谢谢您的分享。从IBM的报告中可以看出,该报告没有经过测试证明。那是在2014年。当遵循web标准时,一个或两个产品总是会违反标准。但它会随着时间的推移而改变。因此,我认为没有理由不保留referer headerMy javascript是为了提供服务,并且需要安全。想想谷歌分析(google analytics)——人们放在网站上的js。你发送给客户端的任何东西都无法避免用户的行为。您仍然没有明确解释“安全”的含义:如果您无法解释问题,那么几乎没有人能够帮助您解决问题。