@@ -120,6 +120,9 @@ static inline void php_rinit_session_globals(void) /* {{{ */
120
120
PS (define_sid ) = 1 ;
121
121
PS (session_vars ) = NULL ;
122
122
PS (module_number ) = my_module_number ;
123
+ #if defined(HAVE_OPENSSL_EXT )
124
+ PS (ssl_iv ) = NULL ;
125
+ #endif
123
126
ZVAL_UNDEF (& PS (http_session_vars ));
124
127
}
125
128
/* }}} */
@@ -147,6 +150,13 @@ static inline void php_rshutdown_session_globals(void) /* {{{ */
147
150
PS (session_vars ) = NULL ;
148
151
}
149
152
153
+ #if defined(HAVE_OPENSSL_EXT )
154
+ if (PS (ssl_iv )) {
155
+ zend_string_release_ex (PS (ssl_iv ), 0 );
156
+ PS (ssl_iv ) = NULL ;
157
+ }
158
+ #endif
159
+
150
160
/* User save handlers may end up directly here by misuse, bugs in user script, etc. */
151
161
/* Set session status to prevent error while restoring save handler INI value. */
152
162
PS (session_status ) = php_session_none ;
@@ -457,6 +467,41 @@ static int php_session_initialize(void) /* {{{ */
457
467
php_session_decode (val );
458
468
zend_string_release_ex (val , 0 );
459
469
}
470
+ #if defined(HAVE_OPENSSL_EXT )
471
+ if (PS (ssl_encrypt )) {
472
+ zend_long ssl_method_len = strlen (PS (ssl_method ));
473
+ if (!ssl_method_len ) {
474
+ php_error_docref (NULL , E_WARNING , "A cipher method is needed to encrypt the session" );
475
+ PS (ssl_encrypt ) = 0 ;
476
+ } else {
477
+ zend_string * iv ;
478
+ zend_long iv_len ;
479
+ zend_long ssl_tag_len = strlen (PS (ssl_tag ));
480
+
481
+ if (PS (ssl_iv ))
482
+ zend_string_release_ex (PS (ssl_iv ), 0 );
483
+
484
+ if ((iv_len = php_openssl_cipher_iv_length (PS (ssl_method ))) == -1 || iv_len == 0 ) {
485
+ php_error_docref (NULL , E_ERROR , "session.ssl_method `%s` is invalid" , PS (ssl_method ));
486
+ return FAILURE ;
487
+ }
488
+
489
+ if ((iv = php_openssl_random_pseudo_bytes (iv_len )) == NULL ) {
490
+ php_error_docref (NULL , E_ERROR , "session iv data failure" );
491
+ return FAILURE ;
492
+ }
493
+
494
+ if (!ssl_tag_len )
495
+ PS (ssl_tag ) = NULL ;
496
+ PS (ssl_tag_len ) = ssl_tag_len ;
497
+
498
+ ZSTR_VAL (iv )[iv_len ] = 0 ;
499
+ PS (ssl_method_len ) = ssl_method_len ;
500
+ PS (ssl_iv ) = iv ;
501
+ PS (ssl_iv_len ) = iv_len ;
502
+ }
503
+ }
504
+ #endif
460
505
return SUCCESS ;
461
506
}
462
507
/* }}} */
@@ -813,6 +858,13 @@ PHP_INI_BEGIN()
813
858
PHP_INI_ENTRY ("session.sid_length" , "32" , PHP_INI_ALL , OnUpdateSidLength )
814
859
PHP_INI_ENTRY ("session.sid_bits_per_character" , "4" , PHP_INI_ALL , OnUpdateSidBits )
815
860
STD_PHP_INI_BOOLEAN ("session.lazy_write" , "1" , PHP_INI_ALL , OnUpdateLazyWrite , lazy_write , php_ps_globals , ps_globals )
861
+ #if defined(HAVE_OPENSSL_EXT )
862
+ STD_PHP_INI_BOOLEAN ("session.ssl_encrypt" , "0" , PHP_INI_ALL , OnUpdateBool , ssl_encrypt , php_ps_globals , ps_globals )
863
+ STD_PHP_INI_ENTRY ("session.ssl_method" , "" , PHP_INI_ALL , OnUpdateSessionString , ssl_method , php_ps_globals , ps_globals )
864
+ STD_PHP_INI_ENTRY ("session.ssl_tag" , "" , PHP_INI_ALL , OnUpdateSessionString , ssl_tag , php_ps_globals , ps_globals )
865
+ #endif
866
+
867
+ /* Commented out until future discussion */
816
868
817
869
/* Upload progress */
818
870
STD_PHP_INI_BOOLEAN ("session.upload_progress.enabled" ,
@@ -826,15 +878,69 @@ PHP_INI_BEGIN()
826
878
STD_PHP_INI_ENTRY ("session.upload_progress.freq" , "1%" , ZEND_INI_PERDIR , OnUpdateRfc1867Freq , rfc1867_freq , php_ps_globals , ps_globals )
827
879
STD_PHP_INI_ENTRY ("session.upload_progress.min_freq" ,
828
880
"1" , ZEND_INI_PERDIR , OnUpdateReal , rfc1867_min_freq ,php_ps_globals , ps_globals )
829
-
830
- /* Commented out until future discussion */
831
881
/* PHP_INI_ENTRY("session.encode_sources", "globals,track", PHP_INI_ALL, NULL) */
832
882
PHP_INI_END ()
833
- /* }}} */
883
+ /* }}} */
834
884
835
885
/* ***************
836
886
* Serializers *
837
887
*************** */
888
+
889
+ #if defined(HAVE_OPENSSL_EXT )
890
+ static int php_session_encrypt (smart_str * buf ) /* {{{ */
891
+ {
892
+ zend_string * buffer ;
893
+ smart_str res = {0 };
894
+
895
+ if (!PS (ssl_encrypt ) || !PS (id ) || !buf -> a )
896
+ return SUCCESS ;
897
+
898
+ zval * ztag = NULL ;
899
+
900
+ if (PS (ssl_tag_len ) > 0 ) {
901
+ ztag = emalloc (sizeof (* ztag ));
902
+ ZVAL_STRINGL (ztag , PS (ssl_tag ), PS (ssl_tag_len ));
903
+ }
904
+
905
+ if ((buffer = php_openssl_encrypt (ZSTR_VAL (buf -> s ), buf -> a , PS (ssl_method ), PS (ssl_method_len ),
906
+ ZSTR_VAL (PS (id )), ZSTR_LEN (PS (id )), 0 , ZSTR_VAL (PS (ssl_iv )), PS (ssl_iv_len ),
907
+ ztag , PS (ssl_tag_len ), NULL , 0 )) == NULL ) {
908
+ php_error_docref (NULL , E_WARNING , "Cannot encrypt the session data with method '%s', tag '%s'" ,
909
+ PS (ssl_method ), PS (ssl_tag ));
910
+ efree (ztag );
911
+ return FAILURE ;
912
+ }
913
+
914
+ smart_str_free (buf );
915
+ res .s = zend_string_dup (buffer , 0 );
916
+ res .a = ZSTR_LEN (buffer );
917
+ * buf = res ;
918
+ zend_string_release_ex (buffer , 0 );
919
+ efree (ztag );
920
+ return SUCCESS ;
921
+ }
922
+ /* }}} */
923
+
924
+ static zend_string * php_session_decrypt (PS_SERIALIZER_DECODE_ARGS ) /* {{{ */
925
+ {
926
+ zend_string * buffer ;
927
+
928
+ if (!PS (ssl_encrypt ) || !PS (id ) || !vallen )
929
+ return NULL ;
930
+
931
+ if ((buffer = php_openssl_decrypt ((char * )val , vallen , PS (ssl_method ), PS (ssl_method_len ),
932
+ ZSTR_VAL (PS (id )), ZSTR_LEN (PS (id )), 0 , ZSTR_VAL (PS (ssl_iv )), PS (ssl_iv_len ),
933
+ PS (ssl_tag ), PS (ssl_tag_len ), NULL , 0 )) == NULL ) {
934
+ php_error_docref (NULL , E_WARNING , "Cannot decrypt the session data with method '%s'" ,
935
+ PS (ssl_method ));
936
+ return NULL ;
937
+ }
938
+
939
+ return buffer ;
940
+ }
941
+ /* }}} */
942
+ #endif
943
+
838
944
PS_SERIALIZER_ENCODE_FUNC (php_serialize ) /* {{{ */
839
945
{
840
946
smart_str buf = {0 };
@@ -843,6 +949,9 @@ PS_SERIALIZER_ENCODE_FUNC(php_serialize) /* {{{ */
843
949
IF_SESSION_VARS () {
844
950
PHP_VAR_SERIALIZE_INIT (var_hash );
845
951
php_var_serialize (& buf , Z_REFVAL (PS (http_session_vars )), & var_hash );
952
+ #if defined(HAVE_OPENSSL_EXT )
953
+ php_session_encrypt (& buf );
954
+ #endif
846
955
PHP_VAR_SERIALIZE_DESTROY (var_hash );
847
956
}
848
957
return buf .s ;
@@ -857,6 +966,13 @@ PS_SERIALIZER_DECODE_FUNC(php_serialize) /* {{{ */
857
966
int result ;
858
967
zend_string * var_name = zend_string_init ("_SESSION" , sizeof ("_SESSION" ) - 1 , 0 );
859
968
969
+ #if defined(HAVE_OPENSSL_EXT )
970
+ zend_string * buffer = php_session_decrypt (val , vallen );
971
+ if (buffer ) {
972
+ val = ZSTR_VAL (buffer );
973
+ endptr = val + ZSTR_LEN (buffer );
974
+ }
975
+ #endif
860
976
ZVAL_NULL (& session_vars );
861
977
PHP_VAR_UNSERIALIZE_INIT (var_hash );
862
978
result = php_var_unserialize (
@@ -877,9 +993,14 @@ PS_SERIALIZER_DECODE_FUNC(php_serialize) /* {{{ */
877
993
Z_ADDREF_P (& PS (http_session_vars ));
878
994
zend_hash_update_ind (& EG (symbol_table ), var_name , & PS (http_session_vars ));
879
995
zend_string_release_ex (var_name , 0 );
996
+ #if defined(HAVE_OPENSSL_EXT )
997
+ if (buffer )
998
+ zend_string_release_ex (buffer , 0 );
999
+ #endif
1000
+
880
1001
return SUCCESS ;
881
1002
}
882
- /* }}} */
1003
+ /* }}} */
883
1004
884
1005
#define PS_BIN_NR_OF_BITS 8
885
1006
#define PS_BIN_UNDEF (1<<(PS_BIN_NR_OF_BITS-1))
@@ -901,6 +1022,9 @@ PS_SERIALIZER_ENCODE_FUNC(php_binary) /* {{{ */
901
1022
);
902
1023
903
1024
smart_str_0 (& buf );
1025
+ #if defined(HAVE_OPENSSL_EXT )
1026
+ php_session_encrypt (& buf );
1027
+ #endif
904
1028
PHP_VAR_SERIALIZE_DESTROY (var_hash );
905
1029
906
1030
return buf .s ;
@@ -915,6 +1039,13 @@ PS_SERIALIZER_DECODE_FUNC(php_binary) /* {{{ */
915
1039
zend_string * name ;
916
1040
php_unserialize_data_t var_hash ;
917
1041
zval * current , rv ;
1042
+ #if defined(HAVE_OPENSSL_EXT )
1043
+ zend_string * buffer = php_session_decrypt (val , vallen );
1044
+ if (buffer ) {
1045
+ val = ZSTR_VAL (buffer );
1046
+ endptr = val + ZSTR_LEN (buffer );
1047
+ }
1048
+ #endif
918
1049
919
1050
PHP_VAR_UNSERIALIZE_INIT (var_hash );
920
1051
@@ -944,6 +1075,10 @@ PS_SERIALIZER_DECODE_FUNC(php_binary) /* {{{ */
944
1075
945
1076
php_session_normalize_vars ();
946
1077
PHP_VAR_UNSERIALIZE_DESTROY (var_hash );
1078
+ #if defined(HAVE_OPENSSL_EXT )
1079
+ if (buffer )
1080
+ zend_string_release_ex (buffer , 0 );
1081
+ #endif
947
1082
948
1083
return SUCCESS ;
949
1084
}
@@ -971,6 +1106,9 @@ PS_SERIALIZER_ENCODE_FUNC(php) /* {{{ */
971
1106
);
972
1107
973
1108
smart_str_0 (& buf );
1109
+ #if defined(HAVE_OPENSSL_EXT )
1110
+ php_session_encrypt (& buf );
1111
+ #endif
974
1112
975
1113
PHP_VAR_SERIALIZE_DESTROY (var_hash );
976
1114
return buf .s ;
@@ -987,6 +1125,13 @@ PS_SERIALIZER_DECODE_FUNC(php) /* {{{ */
987
1125
php_unserialize_data_t var_hash ;
988
1126
zval * current , rv ;
989
1127
1128
+ #if defined(HAVE_OPENSSL_EXT )
1129
+ zend_string * buffer = php_session_decrypt (val , vallen );
1130
+ if (buffer ) {
1131
+ val = ZSTR_VAL (buffer );
1132
+ endptr = val + ZSTR_LEN (buffer );
1133
+ }
1134
+ #endif
990
1135
PHP_VAR_UNSERIALIZE_INIT (var_hash );
991
1136
992
1137
p = val ;
@@ -1018,6 +1163,10 @@ PS_SERIALIZER_DECODE_FUNC(php) /* {{{ */
1018
1163
php_session_normalize_vars ();
1019
1164
1020
1165
PHP_VAR_UNSERIALIZE_DESTROY (var_hash );
1166
+ #if defined(HAVE_OPENSSL_EXT )
1167
+ if (buffer )
1168
+ zend_string_release_ex (buffer , 0 );
1169
+ #endif
1021
1170
1022
1171
return retval ;
1023
1172
}
0 commit comments