@@ -74,6 +74,7 @@ zend_class_entry *php_session_id_iface_entry;
74
74
zend_class_entry * php_session_update_timestamp_iface_entry ;
75
75
76
76
#define PS_MAX_SID_LENGTH 256
77
+ #define PW_TOK_LEN 32
77
78
78
79
/* ***********
79
80
* Helpers *
@@ -118,6 +119,7 @@ static inline void php_rinit_session_globals(void) /* {{{ */
118
119
PS (module_number ) = my_module_number ;
119
120
#if defined(HAVE_OPENSSL_EXT )
120
121
PS (ssl_iv ) = NULL ;
122
+ PS (ssl_pw_tok ) = NULL ;
121
123
#endif
122
124
ZVAL_UNDEF (& PS (http_session_vars ));
123
125
}
@@ -151,6 +153,11 @@ static inline void php_rshutdown_session_globals(void) /* {{{ */
151
153
zend_string_release_ex (PS (ssl_iv ), 0 );
152
154
PS (ssl_iv ) = NULL ;
153
155
}
156
+
157
+ if (PS (ssl_pw_tok )) {
158
+ zend_string_release_ex (PS (ssl_pw_tok ), 0 );
159
+ PS (ssl_pw_tok ) = NULL ;
160
+ }
154
161
#endif
155
162
156
163
/* User save handlers may end up directly here by misuse, bugs in user script, etc. */
@@ -480,8 +487,9 @@ static int php_session_initialize(void) /* {{{ */
480
487
PS (ssl_encrypt ) = 0 ;
481
488
} else {
482
489
zend_string * iv ;
490
+ zend_string * pw_tok ;
483
491
zend_long iv_len ;
484
- zend_long ssl_tag_len = strlen (PS (ssl_tag ));
492
+ zend_long ssl_tag_len = PS ( ssl_tag ) ? strlen (PS (ssl_tag )) : 0 ;
485
493
486
494
if (PS (ssl_iv ))
487
495
zend_string_release_ex (PS (ssl_iv ), 0 );
@@ -496,14 +504,19 @@ static int php_session_initialize(void) /* {{{ */
496
504
return FAILURE ;
497
505
}
498
506
507
+ if ((pw_tok = php_openssl_random_pseudo_bytes (PW_TOK_LEN )) == NULL ) {
508
+ php_error_docref (NULL , E_ERROR , "session token data failure" );
509
+ return FAILURE ;
510
+ }
511
+
499
512
if (!ssl_tag_len )
500
513
PS (ssl_tag ) = NULL ;
501
514
PS (ssl_tag_len ) = ssl_tag_len ;
502
515
503
- ZSTR_VAL (iv )[iv_len ] = 0 ;
504
516
PS (ssl_method_len ) = ssl_method_len ;
505
517
PS (ssl_iv ) = iv ;
506
518
PS (ssl_iv_len ) = iv_len ;
519
+ PS (ssl_pw_tok ) = pw_tok ;
507
520
}
508
521
}
509
522
#endif
@@ -874,7 +887,6 @@ PHP_INI_BEGIN()
874
887
STD_PHP_INI_ENTRY ("session.ssl_tag" , "" , PHP_INI_ALL , OnUpdateSessionString , ssl_tag , php_ps_globals , ps_globals )
875
888
#endif
876
889
877
- /* Commented out until future discussion */
878
890
879
891
/* Upload progress */
880
892
STD_PHP_INI_BOOLEAN ("session.upload_progress.enabled" ,
@@ -888,9 +900,10 @@ PHP_INI_BEGIN()
888
900
STD_PHP_INI_ENTRY ("session.upload_progress.freq" , "1%" , ZEND_INI_PERDIR , OnUpdateRfc1867Freq , rfc1867_freq , php_ps_globals , ps_globals )
889
901
STD_PHP_INI_ENTRY ("session.upload_progress.min_freq" ,
890
902
"1" , ZEND_INI_PERDIR , OnUpdateReal , rfc1867_min_freq ,php_ps_globals , ps_globals )
903
+ /* Commented out until future discussion */
891
904
/* PHP_INI_ENTRY("session.encode_sources", "globals,track", PHP_INI_ALL, NULL) */
892
905
PHP_INI_END ()
893
- /* }}} */
906
+ /* }}} */
894
907
895
908
/* ***************
896
909
* Serializers *
@@ -913,15 +926,14 @@ static int php_session_encrypt(smart_str *buf) /* {{{ */
913
926
}
914
927
915
928
if ((buffer = php_openssl_encrypt (ZSTR_VAL (buf -> s ), buf -> a , PS (ssl_method ), PS (ssl_method_len ),
916
- ZSTR_VAL (PS (id )), ZSTR_LEN ( PS ( id )) , 0 , ZSTR_VAL (PS (ssl_iv )), PS (ssl_iv_len ),
929
+ ZSTR_VAL (PS (ssl_pw_tok )), PW_TOK_LEN , 0 , ZSTR_VAL (PS (ssl_iv )), PS (ssl_iv_len ),
917
930
ztag , PS (ssl_tag_len ), NULL , 0 )) == NULL ) {
918
931
php_error_docref (NULL , E_WARNING , "Cannot encrypt the session data with method '%s', tag '%s'" ,
919
932
PS (ssl_method ), PS (ssl_tag ));
920
933
efree (ztag );
921
934
return FAILURE ;
922
935
}
923
936
924
- smart_str_free (buf );
925
937
res .s = zend_string_dup (buffer , 0 );
926
938
res .a = ZSTR_LEN (buffer );
927
939
* buf = res ;
@@ -939,7 +951,7 @@ static zend_string *php_session_decrypt(PS_SERIALIZER_DECODE_ARGS) /* {{{ */
939
951
return NULL ;
940
952
941
953
if ((buffer = php_openssl_decrypt ((char * )val , vallen , PS (ssl_method ), PS (ssl_method_len ),
942
- ZSTR_VAL (PS (id )), ZSTR_LEN ( PS ( id )) , 0 , ZSTR_VAL (PS (ssl_iv )), PS (ssl_iv_len ),
954
+ ZSTR_VAL (PS (ssl_pw_tok )), PW_TOK_LEN , 0 , ZSTR_VAL (PS (ssl_iv )), PS (ssl_iv_len ),
943
955
PS (ssl_tag ), PS (ssl_tag_len ), NULL , 0 )) == NULL ) {
944
956
php_error_docref (NULL , E_WARNING , "Cannot decrypt the session data with method '%s'" ,
945
957
PS (ssl_method ));
@@ -1010,7 +1022,7 @@ PS_SERIALIZER_DECODE_FUNC(php_serialize) /* {{{ */
1010
1022
1011
1023
return result || !vallen ? SUCCESS : FAILURE ;
1012
1024
}
1013
- /* }}} */
1025
+ /* }}} */
1014
1026
1015
1027
#define PS_BIN_NR_OF_BITS 8
1016
1028
#define PS_BIN_UNDEF (1<<(PS_BIN_NR_OF_BITS-1))
@@ -2411,6 +2423,19 @@ PHP_FUNCTION(session_regenerate_id)
2411
2423
}
2412
2424
zend_string_release_ex (PS (id ), 0 );
2413
2425
PS (id ) = NULL ;
2426
+ #if defined(HAVE_OPENSSL_EXT )
2427
+ if (PS (ssl_pw_tok )) {
2428
+ zend_string_release_ex (PS (ssl_pw_tok ), 0 );
2429
+ PS (ssl_pw_tok ) = NULL ;
2430
+ }
2431
+
2432
+ PS (ssl_pw_tok ) = php_openssl_random_pseudo_bytes (PW_TOK_LEN );
2433
+ if (!PS (ssl_pw_tok )) {
2434
+ PS (session_status ) = php_session_none ;
2435
+ zend_throw_error (NULL , "Failed to create new session ID: %s (path: %s)" , PS (mod )-> s_name , PS (save_path ));
2436
+ RETURN_FALSE ;
2437
+ }
2438
+ #endif
2414
2439
2415
2440
if (PS (mod )-> s_open (& PS (mod_data ), PS (save_path ), PS (session_name )) == FAILURE ) {
2416
2441
PS (session_status ) = php_session_none ;
0 commit comments