PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 6.21
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v6.21
6.35 6.34 6.33.1 6.33 6.32.1 6.32 6.31 6.25 6.25.1 6.26 6.26.1 6.27 6.28 6.29 6.3 6.3.1 6.3.2 6.30 6.4 6.4.1 6.4.2 6.5 6.5.1 6.5.2 6.5.3 All 141 releases
← All changes | classes/helpers/FrmSerializedStringParserHelper.php +117 -43 6.4.26.21 View file →
@@ -40,73 +40,147 @@
40 40 * @param string $string
41 41 * @return mixed
42 42 */
43 43 public function parse( $string ) {
44 - return $this->do_parse( new FrmStringReaderHelper( $string ) );
44 + $unserialized_data = $this->do_parse( new FrmStringReaderHelper( $string ) );
45 +
46 + if ( is_array( $unserialized_data ) && $this->serialized_string_is_invalid( $string ) ) {
47 + return array_filter( $unserialized_data, array( $this, 'serialized_value_is_valid' ) );
48 + }
49 +
50 + return $unserialized_data;
45 51 }
46 52
47 53 /**
54 + * Check if an unserialized value is valid.
55 + *
56 + * @since 6.20
57 + *
58 + * @param mixed $value
59 + * @return bool
60 + */
61 + private function serialized_value_is_valid( $value ) {
62 + return ! is_string( $value ) || strpos( $value, ';s:' ) === false;
63 + }
64 +
65 + /**
66 + * @since 6.20
67 + *
68 + * @param string $string
69 + * @return bool
70 + */
71 + private function serialized_string_is_invalid( $string ) {
72 + $invalid_substrings = array(
73 + ';s:10:\"a"',
74 + ';s:";',
75 + );
76 +
77 + foreach ( $invalid_substrings as $invalid ) {
78 + if ( strpos( $string, $invalid ) !== false ) {
79 + return true;
80 + }
81 + }
82 +
83 + return false;
84 + }
85 +
86 + /**
48 87 * This is the recursive parser.
49 88 *
50 89 * @param FrmStringReaderHelper $string
51 - * @return mixed
90 + * @return array|bool|float|int|string|null
52 91 */
53 92 private function do_parse( $string ) {
54 - $val = null;
55 -
56 93 // May be : or ; as a terminator, depending on what the data type is.
57 - $type = substr( $string->read( 2 ), 0, 1 );
94 + $type = $string->read( 1 );
95 + $string->skip_next_character();
58 96
59 97 switch ( $type ) {
60 98 case 'a':
61 - // Associative array: a:length:{[index][value]...}
62 - $count = (int) $string->read_until( ':' );
99 + return $this->parse_array( $string );
63 100
64 - // Eat the opening "{" of the array.
65 - $string->read( 1 );
101 + case 's':
102 + return $this->parse_string( $string );
66 103
67 - $val = array();
68 - for ( $i = 0; $i < $count; $i++ ) {
69 - $array_key = $this->do_parse( $string );
70 - $array_value = $this->do_parse( $string );
104 + case 'i':
105 + return $this->parse_int( $string );
71 106
72 - if ( ! is_array( $array_key ) ) {
73 - $val[ $array_key ] = $array_value;
74 - }
75 - }
107 + case 'd':
108 + return $this->parse_float( $string );
76 109
77 - // Eat "}" terminating the array.
78 - $string->read( 1 );
79 - break;
110 + case 'b':
111 + return $this->parse_bool( $string );
112 + }
80 113
81 - case 's':
82 - $len = (int) $string->read_until( ':' );
83 - $val = $string->read( $len + 2 );
114 + // Includes case 'N' and case 'O'.
115 + // Treat a serialized object or anything unexpected as Null.
116 + return null;
117 + }
84 118
85 - // Eat the separator.
86 - $string->read( 1 );
87 - break;
119 + /**
120 + * @param FrmStringReaderHelper $string
121 + * @return array
122 + */
123 + private function parse_array( $string ) {
124 + // Associative array: a:length:{[index][value]...}
125 + $count = (int) $string->read_until( ':' );
88 126
89 - case 'i':
90 - $val = (int) $string->read_until( ';' );
91 - break;
127 + // Eat the opening "{" of the array.
128 + $string->skip_next_character();
92 129
93 - case 'd':
94 - $val = (float) $string->read_until( ';' );
95 - break;
130 + $val = array();
131 + for ( $i = 0; $i < $count; $i++ ) {
132 + $array_key = $this->do_parse( $string );
133 + $array_value = $this->do_parse( $string );
96 134
97 - case 'b':
98 - // Boolean is 0 or 1.
99 - $bool = $string->read( 2 );
100 - $val = substr( $bool, 0, 1 ) == '1';
101 - break;
135 + if ( ! is_array( $array_key ) ) {
136 + $val[ $array_key ] = $array_value;
137 + }
138 + }
102 139
103 - default:
104 - // Includes case 'N' and case 'O'.
105 - // Treat a serialized object or anything unexpected as Null.
106 - $val = null;
107 - break;
108 - }
140 + // Eat "}" terminating the array.
141 + $string->skip_next_character();
109 142
143 + return $val;
144 + }
145 +
146 + /**
147 + * @param FrmStringReaderHelper $string
148 + * @return string
149 + */
150 + private function parse_string( $string ) {
151 + $len = (int) $string->read_until( ':' );
152 + $val = $string->read( $len + 2 );
153 +
154 + // Eat the separator.
155 + $string->skip_next_character();
156 +
157 + return $val;
158 + }
159 +
160 + /**
161 + * @param FrmStringReaderHelper $string
162 + * @return int
163 + */
164 + private function parse_int( $string ) {
165 + return (int) $string->read_until( ';' );
166 + }
167 +
168 + /**
169 + * @param FrmStringReaderHelper $string
170 + * @return float
171 + */
172 + private function parse_float( $string ) {
173 + return (float) $string->read_until( ';' );
174 + }
175 +
176 + /**
177 + * @param FrmStringReaderHelper $string
178 + * @return bool
179 + */
180 + private function parse_bool( $string ) {
181 + // Boolean is 0 or 1.
182 + $val = $string->read( 1 ) === '1';
183 + $string->skip_next_character();
110 184 return $val;
111 185 }
112 186 }