Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript CORS保护:HTTP_的起源点是什么_Javascript_Php_Ajax_Http Headers_Cors - Fatal编程技术网

Javascript CORS保护:HTTP_的起源点是什么

Javascript CORS保护:HTTP_的起源点是什么,javascript,php,ajax,http-headers,cors,Javascript,Php,Ajax,Http Headers,Cors,我目前正在为我们所有的域scripts.domain.com开发一个中央AJAX脚本库 我有下面的PHP代码,从理论上讲,它可以很好地防止错误的CORS请求 $valid_cors = array("domain1","domain2","domain3"); if(in_array($_SERVER['HTTP_ORIGIN'],"https://".$valid_cors)) { header('Access-Control-Allow-Origin: https://{$valid

我目前正在为我们所有的域scripts.domain.com开发一个中央AJAX脚本库

我有下面的PHP代码,从理论上讲,它可以很好地防止错误的CORS请求

$valid_cors = array("domain1","domain2","domain3");
if(in_array($_SERVER['HTTP_ORIGIN'],"https://".$valid_cors)) {
    header('Access-Control-Allow-Origin: https://{$valid_cors}', false);
    header("Access-Control-Allow-Methods: GET, POST, PUT");
    header("Access-Control-Allow-Headers: Content-Type");
}
我打赌在你读之前,你就能猜到我收到的信息。对于那些不能这样做的人来说,这是一件大致如下的事情:

无法加载XMLHttpRequest ?. 请求的服务器上不存在“Access Control Allow Origin”标头 资源因此,不允许原产地 进入

在阅读了这里的一些问题之后,我的理解是,大多数浏览器甚至不发送HTTP_ORIGIN头,因此基本上整个A-C-A-O系统是完全没有意义的,因为您必须将Allow ORIGIN作为星号,以允许多个域调用它。您也不能放置多个A-O头,因为如果存在多个A-O头,浏览器会完全阻止该请求

到目前为止,我们都知道——不要相信浏览器发送给你的任何东西,因为它很容易被伪造,那么为什么要考虑实现这一点呢

对我来说,使用星号系统没有什么困难,因为在调用任何操作文件之前执行CSRF&session时,我们会对其进行检查,但对大多数用户来说,这可能会严重弊大于利,使他们产生错误的安全感

拜托,有人能告诉我,我用这根棍子的一端不对,我用错了吗?似乎没有多少人能给出一个带星号的答案栏,这让我更加确信这是唯一的方法

在阅读了这里的一些问题后,我的理解是,大多数浏览器甚至不发送HTTP_ORIGIN头

嗯,那不是真的。任何支持CORS的东西都支持发送原始请求头

因为您必须将Allow Origin作为星号,以允许多个域调用它

不,那也不是真的。您的服务器可以根据不同的来源做出不同的响应

例如,如果请求来自Origin:a.example.com,那么您可以使用访问控制允许Origin:a.example.com进行响应

如果请求来自于Origin:b.example.com,您将响应Access Control Allow Origin:b.example.com

到目前为止,我们都知道——不要相信浏览器发送给你的任何东西,因为它很容易被伪造,那么为什么要考虑实现这一点呢

CORS不用于保护服务器资源。它用于隔离客户端访问

正如您所知,网页可以包含来自多个来源的数据。我们一直在使用图像、脚本等来实现这一点。然而,这只允许我们查看来自多个来源的内容。它不允许来自多个来源的脚本看到彼此的数据

假设情况并非如此。。。您可以发出跨域AJAX请求。假设我有一个关于投资建议的流行博客。我知道读我博客的人最近可能也登录了他们的经纪网站。我可以在我的博客网站上编写一个脚本,向经纪网站发出AJAX请求以进行交易。原因是不是用户提出请求,现在我提出请求。。。但是他们的饼干。我可以在他们不知道的情况下模仿他们!可怕的东西

在一个更常见的例子中,许多家庭路由器都有带有默认凭据的管理面板。很多路由器也没有使用正确的HTTP动词。。。因此,GET请求可用于打开端口等操作。这些路由器仍然注定失败,因为我可以用一个简单的图像标签发出GET请求。大概是这样的:

<img src="http://192.168.1.1/firewall/?action=openPort&port=22" />
$valid_cors = array('domain1', 'domain2', 'domain3');
if (isset($_SERVER['HTTP_ORIGIN']) && in_array($_SERVER['HTTP_ORIGIN'], array_map(function ($domain) { return 'https://'.$domain; }, $valid_cors), true)) {
    header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
    header('Access-Control-Allow-Methods: GET, POST, PUT');
    header('Access-Control-Allow-Headers: Content-Type');
}
当然,图像将无法加载,但浏览器将发出请求,路由器将遵守该请求

如果路由器使用了正确的动词,如PUT或POST,则不可能使用简单的图像标记进行此更改。但是如果没有CORS,页面可以通过PUT或POST发出AJAX请求,在您不知道的情况下控制您的家庭路由器!基本上,使用计算机作为运行特权脚本的场所

以这种方式防止跨源访问资源有助于确保您的特权访问安全

在阅读了这里的一些问题后,我的理解是,大多数浏览器甚至不发送HTTP_ORIGIN头

嗯,那不是真的。任何支持CORS的东西都支持发送原始请求头

因为您必须将Allow Origin作为星号,以允许多个域调用它

不,那也不是真的。您的服务器可以根据不同的来源做出不同的响应

例如,如果请求来自Origin:a.example.com,那么您可以使用访问控制允许Origin:a.example.com进行响应

如果请求来自于Origin:b.example.com,您将响应Access Control Allow Origin:b.example.com

我们现在都知道了,别担心 不管浏览器发送给你什么,因为它很容易被伪造,那么为什么要考虑实现它呢

CORS不用于保护服务器资源。它用于隔离客户端访问

正如您所知,网页可以包含来自多个来源的数据。我们一直在使用图像、脚本等来实现这一点。然而,这只允许我们查看来自多个来源的内容。它不允许来自多个来源的脚本看到彼此的数据

假设情况并非如此。。。您可以发出跨域AJAX请求。假设我有一个关于投资建议的流行博客。我知道读我博客的人最近可能也登录了他们的经纪网站。我可以在我的博客网站上编写一个脚本,向经纪网站发出AJAX请求以进行交易。原因是不是用户提出请求,现在我提出请求。。。但是他们的饼干。我可以在他们不知道的情况下模仿他们!可怕的东西

在一个更常见的例子中,许多家庭路由器都有带有默认凭据的管理面板。很多路由器也没有使用正确的HTTP动词。。。因此,GET请求可用于打开端口等操作。这些路由器仍然注定失败,因为我可以用一个简单的图像标签发出GET请求。大概是这样的:

<img src="http://192.168.1.1/firewall/?action=openPort&port=22" />
$valid_cors = array('domain1', 'domain2', 'domain3');
if (isset($_SERVER['HTTP_ORIGIN']) && in_array($_SERVER['HTTP_ORIGIN'], array_map(function ($domain) { return 'https://'.$domain; }, $valid_cors), true)) {
    header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
    header('Access-Control-Allow-Methods: GET, POST, PUT');
    header('Access-Control-Allow-Headers: Content-Type');
}
当然,图像将无法加载,但浏览器将发出请求,路由器将遵守该请求

如果路由器使用了正确的动词,如PUT或POST,则不可能使用简单的图像标记进行此更改。但是如果没有CORS,页面可以通过PUT或POST发出AJAX请求,在您不知道的情况下控制您的家庭路由器!基本上,使用计算机作为运行特权脚本的场所

以这种方式防止跨源访问资源有助于确保您的特权访问安全

我有以下PHP代码[…]

$valid_cors = array("domain1","domain2","domain3");
if(in_array($_SERVER['HTTP_ORIGIN'],"https://".$valid_cors)) {
    header('Access-Control-Allow-Origin: https://{$valid_cors}', false);
    header("Access-Control-Allow-Methods: GET, POST, PUT");
    header("Access-Control-Allow-Headers: Content-Type");
}
[……]

拜托,有人能告诉我,我用这根棍子的一端不对,我用错了吗

潜在注意事项:未定义索引:HTTP_ORIGIN; 保证通知:数组到字符串转换+警告:in_数组期望参数2为数组,即给定的字符串https://Array 决不进入国际单项体育联合会; 即使您要输入if,字符串“Access Control Allow Origin:https://{$valid\u cors}”也会被字面理解为$valid\u cors},因为单引号没有展开,而不是带有双引号的Access Control Allow Origin:https://{$valid\u cors}; HTTP标头访问控制允许源不接受多个值。 不管怎样,我猜你的意思是这样的:

<img src="http://192.168.1.1/firewall/?action=openPort&port=22" />
$valid_cors = array('domain1', 'domain2', 'domain3');
if (isset($_SERVER['HTTP_ORIGIN']) && in_array($_SERVER['HTTP_ORIGIN'], array_map(function ($domain) { return 'https://'.$domain; }, $valid_cors), true)) {
    header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
    header('Access-Control-Allow-Methods: GET, POST, PUT');
    header('Access-Control-Allow-Headers: Content-Type');
}
但我不确定这是否能很好地防止CORS的坏请求

我有以下PHP代码[…]

$valid_cors = array("domain1","domain2","domain3");
if(in_array($_SERVER['HTTP_ORIGIN'],"https://".$valid_cors)) {
    header('Access-Control-Allow-Origin: https://{$valid_cors}', false);
    header("Access-Control-Allow-Methods: GET, POST, PUT");
    header("Access-Control-Allow-Headers: Content-Type");
}
[……]

拜托,有人能告诉我,我用这根棍子的一端不对,我用错了吗

潜在注意事项:未定义索引:HTTP_ORIGIN; 保证通知:数组到字符串转换+警告:in_数组期望参数2为数组,即给定的字符串https://Array 决不进入国际单项体育联合会; 即使您要输入if,字符串“Access Control Allow Origin:https://{$valid\u cors}”也会被字面理解为$valid\u cors},因为单引号没有展开,而不是带有双引号的Access Control Allow Origin:https://{$valid\u cors}; HTTP标头访问控制允许源不接受多个值。 不管怎样,我猜你的意思是这样的:

<img src="http://192.168.1.1/firewall/?action=openPort&port=22" />
$valid_cors = array('domain1', 'domain2', 'domain3');
if (isset($_SERVER['HTTP_ORIGIN']) && in_array($_SERVER['HTTP_ORIGIN'], array_map(function ($domain) { return 'https://'.$domain; }, $valid_cors), true)) {
    header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
    header('Access-Control-Allow-Methods: GET, POST, PUT');
    header('Access-Control-Allow-Headers: Content-Type');
}

但我不确定这是否能很好地防止错误的CORS请求…

根据多个CORS头,“访问控制允许源”值不正确allowed@tstuts谢谢你指出这一点。我已经用正确的信息更新了答案。根据多个CORS标题,“访问控制允许来源”值不正确allowed@tstuts谢谢你指出这一点。我已经用正确的信息更新了答案。