记一次安全漏洞修复
某个系统用漏洞工具扫描后,报了好几个问题。然后从网上逐一搜到对应的答案。总体来说,就是设置一下nginx的响应头、修改php.ini的默认安全配置等。故简单记录一下。
第一次漏洞修复
配置:
nginx配置:
# HTTP拒绝服务攻击
client_body_timeout 20s;
client_header_timeout 10s;
send_timeout 30s;
# large_client_header_buffers 4 8k;
# 漏洞修复
add_header X-Frame-Options SAMEORIGIN;
add_header Content-Security-Policy "default-src 'self' www.aiwetalk.com;script-src 'self' 'unsafe-eval' 'unsafe-inline' www.aiwetalk.com;object-src 'none';style-src 'self' 'unsafe-inline';";
add_header Referrer-Policy "strict-origin-when-cross-origin";
php.ini配置
session.cookie_httponly = true
具体问题描述
Clickjacking: X-Frame-Options header missing
add_header X-Frame-Options SAMEORIGIN;
Cookies with missing, inconsistent or contradictory properties
暂未找到相应的修复方法。
Cookies without HttpOnly flag set
修改php.ini
session.cookie_httponly = true
Content Security Policy (CSP) not implemented
add_header Content-Security-Policy "default-src 'self' www.aiwetalk.com;script-src 'self' 'unsafe-eval' 'unsafe-inline' www.aiwetalk.com;object-src 'none';style-src 'self' 'unsafe-inline';";
上面的设置最为复杂,具体参考http://www.ruanyifeng.com/blog/2016/09/csp.html
Insecure Referrer Policy
add_header Referrer-Policy "strict-origin-when-cross-origin";
Subresource Integrity (SRI) not implemented
直接将引入的外部文件,改为由服务器自己内部下载。否则,对引入的文件,需要加入 sha256等进行签名。
其他
对于nginx以下的配置,注释掉的代码,可能造成无法正常的访问服务。注释掉就可。
http {
client_body_timeout 20s;
client_header_timeout 10s;
send_timeout 30s;
# large_client_header_buffers 4 8k;
}
server {
# client_body_buffer_size 8k;
# client_max_body_size 2m;
# client_body_in_file_only clean;
# client_body_in_single_buffer on;
# client_body_temp_pathtemp_files 1 2;
# client_header_buffer_size 1m;
}
第二次漏洞修复
bug1
安全修复时, 要求添加上cookie的访问策略,
具体参见文章:http://www.ruanyifeng.com/blog/2019/09/cookie-samesite.html
解决方式 php 或 nginx配置:
1、nginx配置
在location 的位置处设置(但是删除上设置了,发现没有什么效果?why?)
proxy_cookie_path / "/; httponly; secure; SameSite=Lax";
2、php配置
session.cookie_samesite = Strict
备注:php中默认session.name = PHPSESSID,查看该条session对应的cookie,确实是按设置生效了,但是对自己使用以下方式设置的cookie不起任何作用?难道这个配置只适合session而不适合cookie?
$r = mt_rand(1000,9999);
setcookie('mykey_'.$r,$r);
填写完整的setcookie调用参数,能添加上secure、httponly、过期时间参数,还是无法设置SameSite=Lax这个参数。
bug2
另外一处修复:
增加frame-ancestors ‘self’;
add_header Content-Security-Policy "default-src 'self' www.aiwetalk.com;script-src 'self' 'unsafe-eval' 'unsafe-inline' www.aiwetalk.com;object-src 'none';style-src 'self' 'unsafe-inline';frame-ancestors 'self';";
proxy_cookie_path命令详解
proxy_cookie_path命令的作用,找到path中的特定部分,然后按照指定的规则进行整体替换,而cookie利用nginx加上安全策略,也只是利用了替换path中的特定部分。
php使用按如下方式设置cookie:
// 假设是在 /apimy/test.php路径下,否则,路径不符合,也不会显示cookie
$r = mt_rand(1000,9999);
echo 'set-cookie'.$r;
setcookie('mykey_'.$r,$r,time()+3600,'/apimy','',false,true);
以下为实验对比:
在没有proxy_cookie_path 设置时,响应的Set-Cookie头如下:
mykey_7684=7684; expires=Tue, 06-Apr-2021 10:22:44 GMT; Max-Age=3600; path=/apimy; HttpOnly
进行对比:
增加proxy_cookie_path的配置如下:
proxy_cookie_path / "/; httponly; secure; SameSite=Lax";
其作用是:发现了路径,将进行替换。
结果发现
mykey_8190=8190; expires=Tue, 06-Apr-2021 10:19:00 GMT; Max-Age=3600; path=/; httponly; secure; SameSite=Laxapimy; HttpOnly
对比发现,其命令是简单的将path=/;中的/,按上面的配置进行替换。
注意
1、如果setcookie中没有path,proxy_cookie_path将不会进行任何替换,因为找不到path。
2、secure选项如果设置,而本身不是https的协议访问,设置将不会起作用。
3、由于proxy_cookie_path本身并不智能,放在location这样更小的范围,可能更适合。