时间:2021-07-01 10:21:17 帮助过:17人阅读
我不知道PHP的session id是基于哪种算法,但是不管什么算法,如果我有多台php web共享一个session池,那么php在生成这个session id的时候是不是有一定几率会产生冲突?因为这几台服务器都不知道对方生成了哪些id
不会。
源码 https://raw.githubusercontent.com/php/php-src/master/ext/session/session.c
php_session_create_id
此函数负责生成 session idPHPAPI zend_string *php_session_create_id(PS_CREATE_SID_ARGS) /* {{{ */
{
// 散列算法 md5 sha1
PHP_MD5_CTX md5_context;
PHP_SHA1_CTX sha1_context;
#if defined(HAVE_HASH_EXT) && !defined(COMPILE_DL_HASH)
void *hash_context = NULL;
#endif
unsigned char *digest;
int digest_len;
char *buf;
struct timeval tv; // 时间
zval *array;
zval *token; // 令牌 token
zend_string *outid;
char *remote_addr = NULL; //看着熟悉,这个值就是$_SERVER['REMOTE_ADDR']的值
gettimeofday(&tv, NULL);
......
/* maximum 15+19+19+10 bytes */
spprintf(
&buf, // 生成的 session_id
0,
"%.15s%ld" ZEND_LONG_FMT "%0.8F",
remote_addr ? remote_addr : "",
tv.tv_sec, // 时间
(zend_long)tv.tv_usec, // 毫秒
php_combined_lcg(TSRMLS_C) * 10 // 随机数
);
// 后面就是各种散列算法
所以我觉得,除非有非法攻击者,否则应该不会。
但是,即使 MD5 SHA 算法,都可能冲突。如果服务器并发非常大,可以考虑自己实现一个 session 算法。
当然有可能,即使是一台都有可能。
理论上,也许会。实际上,不会。