PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / trunk
GiveWP – Donation Plugin and Fundraising Platform vtrunk
4.16.7.2 4.16.7.1 4.16.7 4.16.6.1 4.16.6 4.16.5.1 4.16.5 4.16.4 4.16.3 4.16.2 4.16.1 4.16.0 4.15.5 4.15.4 4.15.3 4.15.2 4.15.1 4.15.0 2.3.0 2.3.1 2.3.2 2.30.0 2.31.0 2.31.1 2.32.0 2.33.0 2.33.1 2.33.2 2.33.3 2.33.4 2.33.5 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 2.4.7 2.5.0 2.5.1 2.5.10 2.5.11 2.5.12 2.5.13 2.5.2 2.5.3 2.5.4 2.5.5 2.5.6 2.5.7 2.5.8 2.5.9 2.6.0 2.6.1 2.6.2 2.6.3 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.8.0 2.8.1 2.9.0 2.9.1 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.1.0 3.1.1 3.1.2 3.10.0 3.11.0 3.12.0 3.12.1 3.12.2 3.12.3 3.13.0 3.14.0 3.14.1 3.14.2 3.15.0 3.15.1 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.17.0 3.17.1 3.17.2 3.18.0 3.19.0 3.19.1 3.19.2 3.19.3 3.19.4 3.2.0 3.2.1 3.2.2 3.20.0 3.21.0 3.21.1 3.22.0 3.22.1 3.22.2 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.5.0 3.5.1 3.6.0 3.6.1 3.6.2 3.7.0 3.8.0 3.9.0 4.0.0 4.1.0 4.1.1 4.10.0 4.10.1 4.11.0 4.12.0 4.13.0 4.13.1 4.13.2 4.14.0 4.14.1 4.14.2 4.14.3 4.14.4 4.14.5 4.14.6 4.2.0 4.2.1 4.3.0 4.3.1 4.3.2 4.4.0 4.5.0 4.6.1 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 trunk 1.9.0 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.2 2.11.3 2.12.0 2.12.1 2.12.2 2.12.3 2.13.0 2.13.1 2.13.2 2.13.3 2.13.4 2.14.0 2.15.0 2.16.0 2.16.1 2.17.0 2.17.1 2.17.3 2.18.0 2.18.1 2.19.1 2.19.2 2.19.3 2.19.4 2.19.5 2.19.6 2.19.7 2.19.8 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2.6 2.20.0 2.20.1 2.20.2 2.21.0 2.21.1 2.21.2 2.21.3 2.21.4 2.22.0 2.22.1 2.22.2 2.22.3 2.23.0 2.23.1 2.23.2 2.24.0 2.24.1 2.24.2 2.25.0 2.25.1 2.25.2 2.25.3 2.26.0 2.27.0 2.27.1 2.27.2 2.27.3 2.28.0 2.29.0 2.29.1 2.29.2
give / src / Donations / Migrations / SanitizeSerializedObjectPayloads.php
give / src / Donations / Migrations Last commit date
AddMissingDonorIdToDonationComments.php 1 year ago MoveDonationCommentToDonationMetaTable.php 3 years ago RecalculateExchangeRate.php 1 year ago SanitizeSerializedObjectPayloads.php 1 day ago SetAutomaticFormattingOption.php 3 years ago UnserializeTitlePrefix.php 1 year ago
SanitizeSerializedObjectPayloads.php
172 lines
1 <?php
2
3 namespace Give\Donations\Migrations;
4
5 use Give\Framework\Database\DB;
6 use Give\Framework\Migrations\Contracts\Migration;
7 use Give\Helpers\Utils;
8
9 /**
10 * @since 4.16.7.2
11 */
12 class SanitizeSerializedObjectPayloads extends Migration
13 {
14 /**
15 * @since 4.16.7.2
16 */
17 public function run()
18 {
19 $this->sanitizeUserMeta();
20 $this->sanitizeDonorMeta();
21 $this->sanitizeDonationMeta();
22 $this->sanitizeSessions();
23 }
24
25 /**
26 * @since 4.16.7.2
27 */
28 private function sanitizeUserMeta()
29 {
30 $this->sanitizeTable(
31 'usermeta',
32 'umeta_id',
33 'meta_key',
34 'meta_value',
35 ['first_name', 'last_name', 'user_title', 'billing_address']
36 );
37 }
38
39 /**
40 * @since 4.16.7.2
41 */
42 private function sanitizeDonorMeta()
43 {
44 $this->sanitizeTable(
45 'give_donormeta',
46 'meta_id',
47 'meta_key',
48 'meta_value',
49 ['_give_donor_first_name', '_give_donor_last_name', '_give_donor_title_prefix']
50 );
51 }
52
53 /**
54 * @since 4.16.7.2
55 */
56 private function sanitizeDonationMeta()
57 {
58 $this->sanitizeTable(
59 'give_donationmeta',
60 'meta_id',
61 'meta_key',
62 'meta_value',
63 ['_give_payment_meta', '_give_donor_billing_first_name', '_give_donor_billing_last_name']
64 );
65 }
66
67 /**
68 * @since 4.16.7.2
69 */
70 private function sanitizeSessions()
71 {
72 $this->sanitizeTable(
73 'give_sessions',
74 'session_id',
75 'session_key',
76 'session_value',
77 []
78 );
79 }
80
81 /**
82 * @since 4.16.7.2
83 *
84 * @param string $table
85 * @param string $idColumn
86 * @param string $keyColumn
87 * @param string $valueColumn
88 * @param array $keys
89 */
90 private function sanitizeTable($table, $idColumn, $keyColumn, $valueColumn, array $keys)
91 {
92 $query = DB::table($table);
93
94 if ( ! empty($keys)) {
95 $query->whereIn($keyColumn, $keys);
96 }
97
98 $rows = $query->getAll();
99
100 foreach ($rows as $row) {
101 if ( ! Utils::isSerialized($row->{$valueColumn})) {
102 continue;
103 }
104
105 $safe = $this->sanitizeRecursively($row->{$valueColumn});
106
107 DB::table($table)
108 ->where($idColumn, $row->{$idColumn})
109 ->update([
110 $valueColumn => maybe_serialize($safe),
111 ]);
112 }
113 }
114
115 /**
116 * Recursively unserialize values and replace any object (including
117 * __PHP_Incomplete_Class instances) with an empty string so the final
118 * serialization cannot restore the original class.
119 *
120 * @since 4.16.7.2
121 *
122 * @param mixed $value
123 * @return mixed
124 */
125 private function sanitizeRecursively($value)
126 {
127 if (is_string($value) && Utils::isSerialized($value)) {
128 $unserialized = unserialize($value, ['allowed_classes' => false]);
129
130 if (false !== $unserialized && $unserialized !== $value) {
131 $value = $this->sanitizeRecursively($unserialized);
132 }
133 }
134
135 if (is_object($value)) {
136 return '';
137 }
138
139 if (is_array($value)) {
140 foreach ($value as $key => $item) {
141 $value[$key] = $this->sanitizeRecursively($item);
142 }
143 }
144
145 return $value;
146 }
147
148 /**
149 * @since 4.16.7.2
150 */
151 public static function id()
152 {
153 return 'sanitize-serialized-object-payloads';
154 }
155
156 /**
157 * @since 4.16.7.2
158 */
159 public static function title()
160 {
161 return 'Sanitize serialized object payloads from meta tables and sessions';
162 }
163
164 /**
165 * @since 4.16.7.2
166 */
167 public static function timestamp()
168 {
169 return strtotime('2026-08-26');
170 }
171 }
172