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

Vil*_*kas 9 java security cookies servlets

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

   response.addCookie(new Cookie(name, value))
Run Code Online (Sandbox Code Playgroud)

JavaDoc告诉:

对于版本0 cookie,值不应包含空格,括号,括号,等号,逗号,双引号,斜杠,问号,符号,冒号和分号.在所有浏览器上,空值的行为可能不同.

但是,它不会告诉如果值中存在这些字符会发生什么.

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

Bal*_*usC 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));
// ...
Run Code Online (Sandbox Code Playgroud)

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