使用Apache将白名单加入CORS

时间:2014-11-07 23:10:32

标签: ajax apache security cors

我希望设置我的(Red Hat Linux / Apache 2.2.3)网站,以允许使用Javascript编写的HTML5应用程序进行Ajax调用,这些脚本可以在其他地方托管。

这就是CORS的全部内容。

有很多关于如何通过mod_headers启用CORS的描述。几乎所有人都将Access-Control-Allow-Origin标头设置为" *"这使网站向世界开放。

但同源策略的存在是有原因的,这种访问级别提出了真正的安全问题。

我如何将这些网站列入白名单(可能是其中的几十个,但我与之有业务关系的人的网站)我希望不向全世界开放我的网站?

我之前讨论过的唯一讨论是http://blog.blakesimpson.co.uk/read/64-apache-configure-cors-headers-for-whitelist-domains,但是:

  1. 该页虽然富有洞察力但并不彻底。
  2. 这种方法看起来并不容易处理,因为有大量允许的来源。
  3. 有安全意识的网络管理员在做什么?

1 个答案:

答案 0 :(得分:2)

您可以将所有列入白名单的域名设置如下,并为更多flexibel到白名单域定义通用正则表达式匹配。

<IfModule mod_headers.c>

   ##########################################################################
   # 1.) ENABLE CORS PRE-FLIGHT REQUESTS
   # e.g. PUT, DELETE, OPTIONS, ...
   # we need to set Access-Control-Allow-Headers and
   # Access-Control-Allow-Methods for allowed domain(s)
   ##########################################################################

   # first check for pre-flight headers and set as environment variables
   # e.g. header method-a is set here
   SetEnvIf ^Access-Control-Request-Method$ "method-a" METHOD_A
   SetEnvIf ^Access-Control-Request-Headers$ "^Content-Type$" HEADER_A

   # set corresponding response pre-flight headers for allowed domain(s)
   Header set Access-Control-Request-Methods "method-a" env=METHOD_A
   Header set Access-Control-Request-Headers "content-type" env=HEADER_A

   # TODO: add allowed additional pre-flight requests here...

   #########################################################################
   # 2.) ENABLE CORS *SIMPLE REQUESTS* (vs. Pre-Flight Requests from above)
   # e.g. GET, POST and HEAD requests
   # we need to set Access-Control-Allow-Origin header for allowed domain(s)
   # also note that POST requests need to match one of the following
   # Content-Type:
   # 1) application/x-www-form-urlencoded
   # 2) multipart/form-data
   # 3) text/plain
   #########################################################################


   # e.g. origin = https://host-b.local
   SetEnvIfNoCase Origin "https://host-b.local" AccessControlAllowOrigin=$0
   Header set Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin


   # generic regexp match for more flexibel use cases
   #SetEnvIfNoCase Origin "((http(s?))?://(www\.)?(host\-a|host\-b)\.local)(:\d+)?$" AccessControlAllowOrigin=$0
   #Header set Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin

   # TODO: add additional whitelisted domain here...

</IfModule>