我托管网站所有者在其网站上运行的 javascript。我的服务器是一个 LAMP 堆栈。我正在尝试保护已批准网站的脚本。有哪些方法可以做到这一点?我目前正在寻找 $_SERVER['HTTP_ORIGIN']
和 Access-Control-Allow-Origin
以允许访问
。这是最安全的方法吗,可以被欺骗吗?
我的 javascript 用于提供服务并且需要安全。想想谷歌分析 - 人们放在他们网站上的 js。
最佳答案
根据网络标准,出于安全原因,不允许通过 XMLHttpRequest (AJAX) 发出跨源请求,以避免一个域访问来自不同域的另一个资源。这适用于通过 XMLHttpRequest 对象发起的请求。引入原始 header 是为了帮助实现跨域资源共享,同时仍然保持对资源的安全检查,并且只会针对被视为跨域请求的请求发送。
对于您的情况,检查 Origin header 将是错误的,因为对托管脚本的请求不是通过 XMLHttpRequest 而是通过脚本元素的 src 属性启动的。
最佳做法是检查引用 header 。这几乎是为每个请求发送的,也有助于在实现跨站点请求伪造防御时检查它。
使用正则表达式从发送的引用 header 中捕获主机。然后根据允许的主机列表检查主机
如果捕获的主机未列入白名单,则通过发送您认为合适的 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 - http_origin 可以被欺骗吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48832871/