免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2500 | 回复: 6
打印 上一主题 下一主题

session ID 是怎么计算出来的? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-01-10 16:18 |只看该作者 |倒序浏览
我很想知道 session ID 是怎么计算出来的?

论坛徽章:
0
2 [报告]
发表于 2007-01-10 20:07 |只看该作者
不太了解。

论坛徽章:
0
3 [报告]
发表于 2007-01-10 20:29 |只看该作者

  1. PHPAPI char *php_session_create_id(PS_CREATE_SID_ARGS)
  2. {
  3.     PHP_MD5_CTX md5_context;
  4.     PHP_SHA1_CTX sha1_context;
  5.     unsigned char digest[21];
  6.     int digest_len;
  7.     int j;
  8.     char *buf;
  9.     struct timeval tv;
  10.     zval **array;
  11.     zval **token;
  12.     char *remote_addr = NULL;
  13.                
  14.     gettimeofday(&tv, NULL);

  15.     if (zend_hash_find(&EG(symbol_table), "_SERVER",
  16.                 sizeof("_SERVER"), (void **) &array) == SUCCESS &&
  17.             Z_TYPE_PP(array) == IS_ARRAY &&
  18.             zend_hash_find(Z_ARRVAL_PP(array), "REMOTE_ADDR",
  19.                 sizeof("REMOTE_ADDR"), (void **) &token) == SUCCESS) {
  20.         remote_addr = Z_STRVAL_PP(token);
  21.     }

  22.     buf = emalloc(100);

  23.     /* maximum 15+19+19+10 bytes */
  24.     sprintf(buf, "%.15s%ld%ld%0.8f", remote_addr ? remote_addr : "",
  25.             tv.tv_sec, tv.tv_usec, php_combined_lcg(TSRMLS_C) * 10);

  26.     switch (PS(hash_func)) {
  27.     case PS_HASH_FUNC_MD5:
  28.         PHP_MD5Init(&md5_context);
  29.         PHP_MD5Update(&md5_context, buf, strlen(buf));
  30.         digest_len = 16;
  31.         break;
  32.     case PS_HASH_FUNC_SHA1:
  33.         PHP_SHA1Init(&sha1_context);
  34.         PHP_SHA1Update(&sha1_context, buf, strlen(buf));
  35.         digest_len = 20;
  36.         break;
  37.         efree(buf);
  38.         return NULL;
  39.     }

  40.     if (PS(entropy_length) > 0) {
  41.         int fd;

  42.         fd = VCWD_OPEN(PS(entropy_file), O_RDONLY);
  43.         if (fd >= 0) {
  44.             unsigned char rbuf[2048];
  45.             int n;
  46.             int to_read = PS(entropy_length);

  47.             while (to_read > 0) {
  48.                 n = read(fd, rbuf, MIN(to_read, sizeof(rbuf)));
  49.                 if (n <= 0) break;

  50.                 switch (PS(hash_func)) {
  51.                 case PS_HASH_FUNC_MD5:
  52.                     PHP_MD5Update(&md5_context, rbuf, n);
  53.                     break;
  54.                 case PS_HASH_FUNC_SHA1:
  55.                     PHP_SHA1Update(&sha1_context, rbuf, n);
  56.                     break;
  57.                 }
  58.                 to_read -= n;
  59.             }
  60.             close(fd);
  61.         }
  62.     }

  63.     switch (PS(hash_func)) {
  64.     case PS_HASH_FUNC_MD5:
  65.         PHP_MD5Final(digest, &md5_context);
  66.         break;
  67.     case PS_HASH_FUNC_SHA1:
  68.         PHP_SHA1Final(digest, &sha1_context);
  69.         break;
  70.     }

  71.     if (PS(hash_bits_per_character) < 4
  72.             || PS(hash_bits_per_character) > 6) {
  73.         PS(hash_bits_per_character) = 4;

  74.         php_error_docref(NULL TSRMLS_CC, E_WARNING, "The ini setting hash_bits_per_character is out of range (should be 4, 5,
  75. or 6) - using 4 for now");
  76.     }
  77.     j = (int) (bin_to_readable(digest, digest_len, buf, PS(hash_bits_per_character)) - buf);

  78.     if (newlen)
  79.         *newlen = j;
  80.     return buf;
  81. }
复制代码


转贴,非原创

论坛徽章:
0
4 [报告]
发表于 2007-01-10 21:27 |只看该作者
原帖由 Namelessxp 于 2007-1-10 20:29 发表
[code]
PHPAPI char *php_session_create_id(PS_CREATE_SID_ARGS)
{
    PHP_MD5_CTX md5_context;
    PHP_SHA1_CTX sha1_context;
    unsigned char digest[21];
    int digest_len;
    int j;
     ...



谢谢你,不过单纯的这么一段函数也没有文档来说明,我看的很糊涂啊,能解释一下吗?

这段代码来源于哪里?PHP 源代码吗?我没看过 PHP 的源代码。不会非得让我自己看源代码吧?

论坛徽章:
0
5 [报告]
发表于 2007-01-10 23:23 |只看该作者
我在源代码中找到这部分代码了……

不过依然郁闷中…………

论坛徽章:
0
6 [报告]
发表于 2007-01-10 23:51 |只看该作者
不知道楼主要这个来个干嘛?

论坛徽章:
0
7 [报告]
发表于 2007-01-15 09:30 |只看该作者
没什么特别的意思,极其好奇而已!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP