用php头指令修复Access-Control-Allow-Origin(CORS源)错误安全吗?

时间:2016-10-10 作者:Atef Wagih

我正试图向另一个WordPress站点展示一个强大的Pro表单。我遵循了开发人员的API和REST API,但遇到了CORS问题。

然后,我在一个论坛帖子上找到了一条建议,建议在functions.php 原始表格所在地:

header("Access-Control-Allow-Origin: *");

我尝试了这个代码,它运行得非常好。

我的问题是:此代码是否会带来安全风险或其他漏洞?

对于许多人面临的问题来说,解决方案似乎过于简单。

非常感谢您的意见。

2 个回复
最合适的回答,由SO网友:Jesús Franco 整理而成

是的,您可以通过AJAX向整个web中的任何其他脚本打开您的站点以接受请求。

如果你把原点限制在one 使用API的特定远程域,如this example:

header("Access-Control-Allow-Origin: http://mozilla.com");
然而,正如mozilla文档所述,客户端可以转移来源,然而限制临时用户可以连接的站点是对某些攻击的威慑。

更好的是,您可以将您的请求限制为only the methods you really need to allow, 要点是这个片段,它适用于多个领域,if you have the $_SERVER[\'HTTP_ORIGIN\'] variable populated:

add_action(\'rest_api_init\', function() {

     /* unhook default function */
     remove_filter(\'rest_pre_serve_request\', \'rest_send_cors_headers\');

     /* then add your own filter */
     add_filter(\'rest_pre_serve_request\', function( $value ) {
          $origin = get_http_origin();
          $my_sites = array( \'http://site1.org/\', \'http://site2.net\', );
          if ( in_array( $origin, $my_sites ) ) {
              header( \'Access-Control-Allow-Origin: \' . esc_url_raw( $origin ) );
          } else {
              header( \'Access-Control-Allow-Origin: \' . esc_url_raw( site_url() ) );
          }
          header( \'Access-Control-Allow-Methods: GET\' );

          return $value;
     });
}, 15);
如您所见,此代码段使用函数get_http_origin 由WordPress提供,但如果HTTP_ORIGIN 未在中填充$_SERVER 数组,因此它对PHP脚本不可用,可能是因为它被您使用的cloudflare代理阻止了。我会很快检查,用脚本<?php phpinfo(); ?>, 如果已填充此变量。

可能是源站点,它由cloudflare填充在另一个标头中,您可以在连接到http_origin 滤器如果您迷失了这一点,请编辑原始问题,发布服务器变量的内容,文件系统路径或密码除外。

我很乐意帮忙。

SO网友:Mark Kaplun

后台-浏览器将脚本的远程访问限制为仅从加载脚本的站点进行。如果不进行这种检查,在访问站点X时,它可以将数据提交到您的gmail帐户(如果您已登录),甚至不需要猜测您的用户和密码,因为浏览器会向gmail发送正确的身份验证cookie。

CORS“协议”可以帮助您在需要时放松这一限制。

所以你应该问自己的问题是,我需要它吗?一方面,我不明白为什么99%的wordpress网站需要它,另一方面,wordpress Cookie的寿命相对较短,99%的wordpress网站不会成为这种随机攻击的目标。

我想说的是,由于rest API是一种变异的API,并且可以访问私有信息,因此不应该在解决方案中使用rest API。如果需要启用cors,最好编写自己的“只读”API。