大数据(BD社区)-专业IT技术社区

?找回密码
?365bet开户娱乐

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 617|回复: 0
打印 上一主题 下一主题

An invalid domain [.test.com] was specified for this cookie 原因分析

[复制链接]

70

主题

73

帖子

389

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
389
跳转到指定楼层
楼主
发表于 2018-7-9 19:31:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
说明了解决办法以及可能的原因,现在就根据log查看tomcat源码看看是异常的原因以及在tomcat8.5上cookie name的规则。
Rfc6265CookieProcessor源码的167-197行代码如下
  1. private void validateDomain(String domain) {
  2. ? ?? ???int i = 0;
  3. ? ?? ???int prev = -1;
  4. ? ?? ???int cur = -1;
  5. ? ?? ???char[] chars = domain.toCharArray();
  6. ? ?? ???while (i < chars.length) {
  7. ? ?? ?? ?? ?prev = cur;
  8. ? ?? ?? ?? ?cur = chars[i];
  9. ? ?? ?? ?? ?if (!domainValid.get(cur)) {
  10. ? ?? ?? ?? ?? ? throw new IllegalArgumentException(sm.getString(
  11. ? ?? ?? ?? ?? ?? ?? ?? ?"rfc6265CookieProcessor.invalidDomain", domain));
  12. ? ?? ?? ?? ?}
  13. ? ?? ?? ?? ?// labels must start with a letter or number
  14. ? ?? ?? ?? ?if ((prev == '.' || prev == -1) && (cur == '.' || cur == '-')) {
  15. ? ?? ?? ?? ?? ? throw new IllegalArgumentException(sm.getString(
  16. ? ?? ?? ?? ?? ?? ?? ?? ?"rfc6265CookieProcessor.invalidDomain", domain));
  17. ? ?? ?? ?? ?}
  18. ? ?? ?? ?? ?// labels must end with a letter or number
  19. ? ?? ?? ?? ?if (prev == '-' && cur == '.') {
  20. ? ?? ?? ?? ?? ? throw new IllegalArgumentException(sm.getString(
  21. ? ?? ?? ?? ?? ?? ?? ?? ?"rfc6265CookieProcessor.invalidDomain", domain));
  22. ? ?? ?? ?? ?}
  23. ? ?? ?? ?? ?i++;
  24. ? ?? ???}
  25. ? ?? ???// domain must end with a label
  26. ? ?? ???if (cur == '.' || cur == '-') {
  27. ? ?? ?? ?? ?throw new IllegalArgumentException(sm.getString(
  28. ? ?? ?? ?? ?? ?? ???"rfc6265CookieProcessor.invalidDomain", domain));
  29. ? ?? ???}
  30. ? ? }
复制代码
domain规则如下
1、必须是1-9、a-z、A-Z、. 、- (注意是-不是_)这几个字符组成
2、必须是数字或字母开头
上篇文章使用.test.com报错就是因为使用”.”开头
3、必须是数字或字母结尾
path的规则源码及规则
  1. private void validatePath(String path) {
  2. ? ?? ???char[] chars = path.toCharArray();

  3. ? ?? ???for (int i = 0; i < chars.length; i++) {
  4. ? ?? ?? ?? ?char ch = chars[i];
  5. ? ?? ?? ?? ?if (ch < 0x20 || ch > 0x7E || ch == ';') {
  6. ? ?? ?? ?? ?? ? throw new IllegalArgumentException(sm.getString(
  7. ? ?? ?? ?? ?? ?? ?? ?? ?"rfc6265CookieProcessor.invalidPath", path));
  8. ? ?? ?? ?? ?}
  9. ? ?? ???}
  10. ? ? }
复制代码

1、字符必须是在 0x20-0x7E之间,并且不能出现”;”号

cookie value 源码及规则

  1. private void validateCookieValue(String value) {
  2. ? ?? ???int start = 0;
  3. ? ?? ???int end = value.length();

  4. ? ?? ???if (end > 1 && value.charAt(0) == '"' && value.charAt(end - 1) == '"') {
  5. ? ?? ?? ?? ?start = 1;
  6. ? ?? ?? ?? ?end--;
  7. ? ?? ???}

  8. ? ?? ???char[] chars = value.toCharArray();
  9. ? ?? ???for (int i = start; i < end; i++) {
  10. ? ?? ?? ?? ?char c = chars[i];
  11. ? ?? ?? ?? ?if (c < 0x21 || c == 0x22 || c == 0x2c || c == 0x3b || c == 0x5c || c == 0x7f) {
  12. ? ?? ?? ?? ?? ? throw new IllegalArgumentException(sm.getString(
  13. ? ?? ?? ?? ?? ?? ?? ?? ?"rfc6265CookieProcessor.invalidCharInValue", Integer.toString(c)));
  14. ? ?? ?? ?? ?}
  15. ? ?? ???}
  16. ? ? }
复制代码

1、会自动去除开头和结尾的引号”
2、如果包含以下规则字符则校验失败:
c < 0x21 || c == 0x22 || c == 0x2c || c == 0x3b || c == 0x5c || c == 0x7f


您需要登录后才可以回帖 登录 | 365bet开户娱乐

本版积分规则

Archiver|手机版|小黑屋|BD Inc. ( 京ICP备16038882号-2 )

GMT+8, 2019-11-12 21:46 , Processed in 0.025218 second(s), 16 queries .

Powered by Discuz! X3.4

? 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表