一、限制敏感信息写入cookie
如果要通过Cookie来维持用户的登录状态,请务必不要存储 “登录ID、密码” 等敏感信息,而是应该在服务端存储用户的会话状态Session,并用对应的SessionID来替代上述的敏感信息
二、在向Set-Cookie中写入内容前,要进行过滤
- 过滤特殊字符:
防止针对Cookie的CRLF攻击【如果当Cookie的某些内容是可由用户控制的,那么千万要在写入Set-Cookie时对内容进行过滤,尤其是换行符、截断符等】 - 对保存到cookie里面的敏感信息必须加密
cookie中的数据通常会包含用户的隐私数据,首先要保证数据的保密性,其次要保证数据不能被伪造或者篡改,基于这两点,我们通常需要对cookie内容进行加密,加密方式一般使用对称加密(单密钥,如DES)或非对称加密(一对密钥,如RSA),密钥需要保存在服务器端一个安全的地方,这样,别人不知道密钥时,无法对数据进行解密,也无法伪造或篡改数据。
二、做Cookie的访问控制
- 在HTTP响应的Set-Cookie中添加HttpOnly属性,限制 Cookie 的访问权限
Set-Cookie: name=value; HttpOnly
。
在设置了 HttpOnly 属性的情况下,浏览器将禁止通过 JavaScript 访问和修改 Cookie,从而有效地防止一些常见的攻击,例如跨站脚本攻击(XSS) - 在HTTP响应的Set-Cookie中添加Domain属性,设置Cookie的可用域:
Set-Cookie: name=value; Domain=example.com
- 在HTTP响应的Set-Cookie中添加Path属性,设置Cookie的可用路径:
Set-Cookie: name=value; Path=/
三、限制Cookie的传输方式
在HTTP响应的Set-Cookie字段中添加Secure属性,以要求Cookie仅在HTTPS下才能传输
Set-Cookie: name=value; Secure
当setSecure(true)时,只有在https协议下访问的时候,浏览器才会发送该cookie给服务端,http连接不发送,所以绝对不会被窃听到
- 当setSecure(true)时,浏览器端的cookie不会传递到服务器端
- 当setSecure(true)时,服务器端的cookie会传递到浏览器端
四、限制Cookie的存储
- 在HTTP响应的Set-Cookie中添加expires和max-age属性,设置过期时间:
用expires指定绝对时间:
Set-Cookie: name=value; expires=Wed, 21 Oct 2021 07:28:00 GMT;
用max-age指定存活时间(s):
Set-Cookie: name=value; max-age=3600;
- 给cookie设置有效期意义
- 如果不设置有效期,万一用户获取到用户的Cookie后,就可以一直使用用户身份登录。
- 在设置Cookie认证的时候,需要加入两个时间,一个是“即使一直在活动,也要失效”的时间,一个是“长时间不活动的失效时间”,并在Web应用中,首先判断两个时间是否已超时,再执行其他操作。