javascript - http_origin 可以被欺骗吗?

标签 javascript php security

我托管网站所有者在其网站上运行的 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/

相关文章:

javascript - 有没有办法在测验中为 div 设置简单的标志以隐藏问题?

javascript - 清除输入,文本区域模糊,如果字段为空白则默认

javascript - angularjs 在等待 Controller 时设置图像

php - 如何从 Magento 2 官方市场安装扩展

php - 如果列值具有自定义模板,如何在 MySQL 中搜索增加的值?

c++ - 如何使用特定于应用程序的 key 加密目录?

javascript - 如何在 Moment 中将数字格式化为时间?

javascript - 每个子列表键都是唯一的,但我仍然在控制台中收到错误。 Reactjs

java - 是否应该使用自定义 SecurityManager 来对 javax.script.ScriptEngine 进行沙盒处理?

security - 加密和哈希之间的区别