Skip to content

Commit d3b0ea7

Browse files
committed
Escape user input in LIKE queries via escapeLikeValue()
Multiple SQL queries used `LIKE ?` with raw user-controlled input concatenated with `%` wildcards. Without escaping, `%` and `_` characters in the input were interpreted as wildcards, allowing broader matches than intended and enabling potential information disclosure via crafted search strings.
1 parent dd65c60 commit d3b0ea7

23 files changed

Lines changed: 30 additions & 29 deletions

wcfsetup/install/files/lib/command/style/CopyStyle.class.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ private function getUniqueStyleName(Style $style): string
145145
AND styleID <> ?";
146146
$statement = WCF::getDB()->prepare($sql);
147147
$statement->execute([
148-
$style->styleName . '%',
148+
WCF::getDB()->escapeLikeValue($style->styleName) . '%',
149149
$style->styleID,
150150
]);
151151
$numbers = [];

wcfsetup/install/files/lib/data/article/ArticleAction.class.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -930,7 +930,7 @@ public function search()
930930
ORDER BY title";
931931
$statement = WCF::getDB()->prepare($sql, 5);
932932
$statement->execute([
933-
'%' . $this->parameters['searchString'] . '%',
933+
'%' . WCF::getDB()->escapeLikeValue($this->parameters['searchString']) . '%',
934934
WCF::getLanguage()->languageID,
935935
]);
936936

wcfsetup/install/files/lib/data/package/update/PackageUpdateAction.class.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ public function search()
9494

9595
$conditions = new PreparedStatementConditionBuilder();
9696
$conditions->add("package_update.packageUpdateServerID IN (?)", [\array_keys($availableUpdateServers)]);
97-
$searchString = '%' . $this->parameters['searchString'] . '%';
97+
$searchString = '%' . WCF::getDB()->escapeLikeValue($this->parameters['searchString']) . '%';
9898
$conditions->add(
9999
"(package_update.package LIKE ? OR package_update.packageDescription LIKE ? OR package_update.packageName LIKE ?)",
100100
[$searchString, $searchString, $searchString]

wcfsetup/install/files/lib/data/page/PageAction.class.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -370,7 +370,7 @@ public function search()
370370
ORDER BY name";
371371
$statement = WCF::getDB()->prepare($sql, 5);
372372
$statement->execute([
373-
'%' . $this->parameters['searchString'] . '%',
373+
'%' . WCF::getDB()->escapeLikeValue($this->parameters['searchString']) . '%',
374374
0,
375375
]);
376376

wcfsetup/install/files/lib/data/search/keyword/SearchKeywordAction.class.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public function getSearchResultList()
5353
WHERE keyword LIKE ?
5454
ORDER BY searches DESC";
5555
$statement = WCF::getDB()->prepare($sql, 10);
56-
$statement->execute([$this->parameters['data']['searchString'] . '%']);
56+
$statement->execute([WCF::getDB()->escapeLikeValue($this->parameters['data']['searchString']) . '%']);
5757
while ($row = $statement->fetchArray()) {
5858
$list[] = [
5959
'label' => $row['keyword'],

wcfsetup/install/files/lib/data/tag/TagAction.class.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ public function getSearchResultList()
129129
$list = [];
130130

131131
$conditionBuilder = new PreparedStatementConditionBuilder();
132-
$conditionBuilder->add("name LIKE ?", [$this->parameters['data']['searchString'] . '%']);
132+
$conditionBuilder->add("name LIKE ?", [WCF::getDB()->escapeLikeValue($this->parameters['data']['searchString']) . '%']);
133133
if (!empty($excludedSearchValues)) {
134134
$conditionBuilder->add("name NOT IN (?)", [$excludedSearchValues]);
135135
}

wcfsetup/install/files/lib/data/user/UserAction.class.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -606,7 +606,7 @@ public function getSearchResultList()
606606
}
607607

608608
// find users
609-
$searchString = \addcslashes($searchString, '_%');
609+
$searchString = WCF::getDB()->escapeLikeValue($searchString);
610610
$parameters = [
611611
'searchString' => $searchString,
612612
];

wcfsetup/install/files/lib/form/UserSearchForm.class.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ protected function search()
209209
protected function buildStaticConditions()
210210
{
211211
if (!empty($this->username)) {
212-
$this->conditions->add("user_table.username LIKE ?", ['%' . \addcslashes($this->username, '_%') . '%']);
212+
$this->conditions->add("user_table.username LIKE ?", ['%' . WCF::getDB()->escapeLikeValue($this->username) . '%']);
213213
}
214214
}
215215

wcfsetup/install/files/lib/system/endpoint/controller/core/messages/GetMentionSuggestions.class.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ public function __invoke(ServerRequestInterface $request, array $variables): Res
7070
private function getUsers(string $query): array
7171
{
7272
$userProfileList = new UserProfileList();
73-
$userProfileList->getConditionBuilder()->add("username LIKE ?", [$query . '%']);
73+
$userProfileList->getConditionBuilder()->add("username LIKE ?", [WCF::getDB()->escapeLikeValue($query) . '%']);
7474

7575
$userProfileList->sqlLimit = 10;
7676
$userProfileList->readObjects();

wcfsetup/install/files/lib/system/html/input/node/HtmlInputNodeTextParser.class.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,7 @@ protected function lookupUsernames(array $usernames)
290290

291291
if (!empty($likeValues)) {
292292
for ($i = 0, $length = \count($likeValues); $i < $length; $i++) {
293-
$conditions->add('username LIKE ?', [\str_replace('%', '', $likeValues[$i]) . '%']);
293+
$conditions->add('username LIKE ?', [WCF::getDB()->escapeLikeValue($likeValues[$i]) . '%']);
294294
}
295295
}
296296

0 commit comments

Comments
 (0)