Simplify the isSubDirectory() function
isSubDirectory() checks if a specified $sub is a subdirectory of the $parent, this is needed to prevent file inclusions. Actually, the current code is more kind of a "hack" which I always struggle over if browsing through source. So this should be a much better implementation. The implementation is really straightforward: - [realpath()](http://php.net/manual/function.realpath.php) expands all symbolic links and resolves references to '/./', '/../' and extra '/' characters in the input path and return the canonicalized absolute pathname. - [strpos()](php.net/manual/function.strpos.php) returns FALSE if the substring wasn't found. Since this is an absolutely critical piece of code, I'd like to ensure that this is absolutely safe!
This commit is contained in:
parent
981fd5e424
commit
e151210a62
1 changed files with 2 additions and 22 deletions
|
@ -633,29 +633,9 @@ class OC_Helper {
|
|||
* @return bool
|
||||
*/
|
||||
public static function issubdirectory($sub, $parent) {
|
||||
if($sub == null || $sub == '' || $parent == null || $parent == '') {
|
||||
return false;
|
||||
if (strpos(realpath($sub), realpath($parent)) !== false) {
|
||||
return true;
|
||||
}
|
||||
$realpath_sub = realpath($sub);
|
||||
$realpath_parent = realpath($parent);
|
||||
if(($realpath_sub == false && substr_count($realpath_sub, './') != 0) || ($realpath_parent == false && substr_count($realpath_parent, './') != 0)) { //it checks for both ./ and ../
|
||||
return false;
|
||||
}
|
||||
if($realpath_sub && $realpath_sub != '' && $realpath_parent && $realpath_parent != '') {
|
||||
if(substr($realpath_sub, 0, strlen($realpath_parent)) == $realpath_parent) {
|
||||
return true;
|
||||
}
|
||||
}else{
|
||||
if(substr($sub, 0, strlen($parent)) == $parent) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
/*echo 'SUB: ' . $sub . "\n";
|
||||
echo 'PAR: ' . $parent . "\n";
|
||||
echo 'REALSUB: ' . $realpath_sub . "\n";
|
||||
echo 'REALPAR: ' . $realpath_parent . "\n";
|
||||
echo substr($realpath_sub, 0, strlen($realpath_parent));
|
||||
exit;*/
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue