2011-07-29 29 views
7

的Servlet API提供了一个方便的方法来设置cookies:从servlet API设置时是否需要转义cookie值?

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

的JavaDoc讲述:

随着版本0的cookie,值不应包含空格, 括号,括号,等号,逗号,双引号,斜杠, 问号,符号,冒号和分号。在所有浏览器上,空值可能不是 的行为方式相同。

但是它不能告诉如果这些字符出现在值中会发生什么。

如果价值来自不可信来源,我可以使用API​​安全地设置价值,无需额外的预处理,或者我打开一些注入的门?

+0

如果它们存在,您将得到一个illegalArgumentException – Edd

回答

6

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

不,你可能不会。 API不会为你处理这件事。否则这将在Javadoc中明确指定。如果您使用的是版本0(Netscape)或版本1(RFC2965)Cookie,API可能不会事先知道。

最好的办法是事先对cookie名称/值进行网址编码,以便确保您最终获得安全的cookie名称/值。

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

或者,您也可以使用正则表达式来提前关闭所有非法字符。只允许使用字母字符,数字,连字符,下划线,句号,撇号以及可能多一些(依赖于浏​​览器!)。所有其他需要被剥夺。

相关问题