case 'rename':
$file = serendipity_fetchImageFromDatabase($serendipity['GET']['fid']);
- $serendipity['GET']['newname'] = serendipity_uploadSecure($serendipity['GET']['newname']);
+ $serendipity['GET']['newname'] = serendipity_uploadSecure($serendipity['GET']['newname'], true);
if ($serendipity['serendipityUserlevel'] < USERLEVEL_CHIEF && $file['authorid'] != '0' && $file['authorid'] != $serendipity['authorid']) {
return;
}
+ if ($serendipity['serendipityUserlevel'] < USERLEVEL_ADMIN && !serendipity_isSafeFile($serendipity['GET']['newname'])) {
+ printf(ERROR_FILE_FORBIDDEN, $serendipity['GET']['newname']);
+ return;
+ }
+
if ($file['hotlink']) {
serendipity_updateImageInDatabase(array('name' => $serendipity['GET']['newname']), $serendipity['GET']['fid']);
} else {
}
$tfile = serendipityNormalizeFilename(serendipity_uploadSecure($tfile));
- $serendipity['POST']['target_directory'][$tindex] = serendipity_uploadSecure($serendipity['POST']['target_directory'][$tindex], true);
+ $serendipity['POST']['target_directory'][$tindex] = serendipity_uploadSecure($serendipity['POST']['target_directory'][$tindex], true, true);
$target = $serendipity['serendipityPath'] . $serendipity['uploadPath'] . $serendipity['POST']['target_directory'][$tindex] . $tfile;
if (file_exists($target)) {
}
$tfile = serendipityNormalizeFilename(serendipity_uploadSecure($tfile));
- $serendipity['POST']['target_directory'][$idx] = serendipity_uploadSecure($serendipity['POST']['target_directory'][$idx], true);
+ $serendipity['POST']['target_directory'][$idx] = serendipity_uploadSecure($serendipity['POST']['target_directory'][$idx], true, true);
$target = $serendipity['serendipityPath'] . $serendipity['uploadPath'] . $serendipity['POST']['target_directory'][$idx] . $tfile;
if (file_exists($target)) {
return $out;
}
+function serendipity_isSafeFile($file) {
+ return preg_match('@\.(php[34]?|[psj]html?|aspx?|cgi|jsp|py|pl)$@i', $file);
+}
/**
* Get a list of images
}
}
-function serendipity_uploadSecure($var, $strip_paths = true) {
+function serendipity_uploadSecure($var, $strip_paths = true, $append_slash = false) {
$var = preg_replace('@[^0-9a-z\._/-]@i', '', $var);
if ($strip_paths) {
$var = preg_replace('@(\.+[/\\\\]+)@', '/', $var);
}
$var = preg_replace('@^(/+)@', '', $var);
+
+ if ($append_slash) {
+ if (substr($var, -1, 1) != '/') {
+ $var .= '/';
+ }
+ }
return $var;
}