从servlet API设置时是否需要转义cookie值?

时间:2011-07-29 07:23:58

标签: java security servlets cookies

Servlet API提供了一种设置cookie的便捷方式:

   response.addCookie(new Cookie(name, value))

JavaDoc告诉:

  

使用版本0的cookie,值不应包含空格,   括号,括号,等号,逗号,双引号,斜线,   问号,标志,冒号和分号。空值可能不会   在所有浏览器上表现相同。

但是,如果值中存在这些字符,则无法说明会发生什么。

如果值来自不受信任的来源,我是否可以使用API​​安全地设置值而无需额外的预处理,或者我是否为某种注入打开门?

1 个答案:

答案 0 :(得分:7)

  

如果值来自不受信任的来源,我是否可以使用API​​安全地设置值而无需额外的预处理?

不,你可能没有。 API不会为您解决此问题。否则将在Javadoc中明确指定。如果您使用版本0(Netscape)或版本1(RFC2965)Cookie,API可能不会事先知道。

最好是事先对cookie名称/值进行URL编码,这样您就可以确保最终得到一个安全的cookie名称/值。

String safeCookieName = URLEncoder.encode(name, "UTF-8");
String safeCookieValue = URLEncoder.encode(value, "UTF-8");
response.addCookie(new Cookie(safeCookieName, safeCookieValue));
// ...

或者,您也可以使用正则表达式预先删除所有非法字符。只允许使用字母字符,数字,连字符,下划线,句点,波浪线以及可能更多(依赖浏览器!)。所有其他人都需要被剥夺。