aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoeland Jago Douma <roeland@famdouma.nl>2021-02-09 22:35:18 +0100
committerRoeland Jago Douma <roeland@famdouma.nl>2021-02-09 22:35:18 +0100
commit784a752c0f38c6f667516e8377a42b37cd527038 (patch)
treebce8c1b0c07faf2e8fd481b3fc6117d88fdd3f7d
parente4ca0c9fa0339b54ca7b95e158d18091ddd0e5d6 (diff)
downloadnextcloud-server-784a752c0f38c6f667516e8377a42b37cd527038.tar.gz
nextcloud-server-784a752c0f38c6f667516e8377a42b37cd527038.zip
tain-escape the cookie input
we only set the cookie if it is a proper <=32 char alphanum string. Otherwise we just ignore the input. Makes psalm also happier so that we can focus on other errors. Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
-rw-r--r--apps/files/ajax/download.php22
1 files changed, 18 insertions, 4 deletions
diff --git a/apps/files/ajax/download.php b/apps/files/ajax/download.php
index 25d70c7ebcf..445b15dc6a7 100644
--- a/apps/files/ajax/download.php
+++ b/apps/files/ajax/download.php
@@ -42,14 +42,28 @@ if (!is_array($files_list)) {
}
/**
+ * @psalm-taint-escape cookie
+ */
+function cleanCookieInput(string $value): string {
+ if (strlen($value) > 32) {
+ return '';
+ }
+ if (preg_match('!^[a-zA-Z0-9]+$!', $_GET['downloadStartSecret']) !== 1) {
+ return '';
+ }
+ return $value;
+}
+
+/**
* this sets a cookie to be able to recognize the start of the download
* the content must not be longer than 32 characters and must only contain
* alphanumeric characters
*/
-if (isset($_GET['downloadStartSecret'])
- && !isset($_GET['downloadStartSecret'][32])
- && preg_match('!^[a-zA-Z0-9]+$!', $_GET['downloadStartSecret']) === 1) {
- setcookie('ocDownloadStarted', $_GET['downloadStartSecret'], time() + 20, '/');
+if (isset($_GET['downloadStartSecret'])) {
+ $value = cleanCookieInput($_GET['downloadStartSecret']);
+ if ($value !== '') {
+ setcookie('ocDownloadStarted', $value, time() + 20, '/');
+ }
}
$server_params = [ 'head' => \OC::$server->getRequest()->getMethod() === 'HEAD' ];