Servlet API提供了一种设置cookie的便捷方式:
response.addCookie(new Cookie(name, value))
JavaDoc告诉:
使用版本0的cookie,值不应包含空格, 括号,括号,等号,逗号,双引号,斜线, 问号,标志,冒号和分号。空值可能不会 在所有浏览器上表现相同。
但是,如果值中存在这些字符,则无法说明会发生什么。
如果值来自不受信任的来源,我是否可以使用API安全地设置值而无需额外的预处理,或者我是否为某种注入打开门?
答案 0 :(得分:7)
不,你可能没有。 API不会为您解决此问题。否则将在Javadoc中明确指定。如果您使用版本0(Netscape)或版本1(RFC2965)Cookie,API可能不会事先知道。如果值来自不受信任的来源,我是否可以使用API安全地设置值而无需额外的预处理?
最好是事先对cookie名称/值进行URL编码,这样您就可以确保最终得到一个安全的cookie名称/值。
String safeCookieName = URLEncoder.encode(name, "UTF-8");
String safeCookieValue = URLEncoder.encode(value, "UTF-8");
response.addCookie(new Cookie(safeCookieName, safeCookieValue));
// ...
或者,您也可以使用正则表达式预先删除所有非法字符。只允许使用字母字符,数字,连字符,下划线,句点,波浪线以及可能更多(依赖浏览器!)。所有其他人都需要被剥夺。