我希望设置我的 (Red Hat Linux/Apache 2.2.3) 网站,以允许来自用 Javascript 编写的 HTML5 应用程序的 Ajax 调用,这些脚本可能托管在其他地方。
这就是 CORS 的意义所在。
关于如何通过 mod_headers 启用 CORS 有很多描述。几乎所有这些人都将 Access-Control-Allow-Origin header 设置为“*”,从而向世界开放网站。
但是同源策略的实现是有原因的,这种级别的访问会引发真正的安全问题。
如何将我想要的网站(可能有几十个,但都是与我有业务关系的人的网站)列入白名单,而不向全世界开放我的网站?
我见过的唯一讨论这个问题的讨论是 http://blog.blakesimpson.co.uk/read/64-apache-configure-cors-headers-for-whitelist-domains但是:
- 该页面虽然富有洞察力,但并不全面。
- 对于大量允许的来源,该方法看起来难以管理。
具有安全意识的网络管理员在做什么?
最佳答案
您可以将所有列入白名单的域如下所示,还可以定义通用正则表达式匹配,以便更灵活地加入白名单域。
<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>
关于ajax - 使用 Apache 将 CORS 列入白名单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26811599/