From 6ccc2ac44dc49125b8fc60872c024f944a32a5e6 Mon Sep 17 00:00:00 2001 From: tbrehm <t.brehm@ispconfig.org> Date: Mon, 24 Jun 2013 05:39:27 -0400 Subject: [PATCH] Extended FTP user path checks. --- interface/lib/classes/validate_ftpuser.inc.php | 7 +++++-- interface/web/sites/ftp_user_edit.php | 17 +++++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/interface/lib/classes/validate_ftpuser.inc.php b/interface/lib/classes/validate_ftpuser.inc.php index 0682650..60768a3 100644 --- a/interface/lib/classes/validate_ftpuser.inc.php +++ b/interface/lib/classes/validate_ftpuser.inc.php @@ -47,7 +47,7 @@ $ftp_data = $app->db->queryOneRecord("SELECT parent_domain_id FROM ftp_user WHERE ftp_user_id = '".$app->db->quote($app->tform->primary_id)."'"); - if(!$ftp_data["parent_domain_id"]) { + if(!is_array($ftp_data) || $ftp_data["parent_domain_id"] < 1) { $errmsg = $validator['errmsg']; if(isset($app->tform->wordbook[$errmsg])) { return $app->tform->wordbook[$errmsg]."<br>\r\n"; @@ -57,7 +57,7 @@ } $domain_data = $app->db->queryOneRecord("SELECT domain_id, document_root FROM web_domain WHERE domain_id = '".$app->db->quote($ftp_data["parent_domain_id"])."'"); - if(!$domain_data["domain_id"]) { + if(!is_array($domain_data) || $domain_data["domain_id"] < 1) { $errmsg = $validator['errmsg']; if(isset($app->tform->wordbook[$errmsg])) { return $app->tform->wordbook[$errmsg]."<br>\r\n"; @@ -75,6 +75,9 @@ if(stristr($field_value,'..') or stristr($field_value,'./') or stristr($field_value,'/.')) $is_ok = false; + //* Final check if docroot path of website is >= 5 chars + if(strlen($doc_root) < 5) $is_ok = false; + if($is_ok == false) { $errmsg = $validator['errmsg']; if(isset($app->tform->wordbook[$errmsg])) { diff --git a/interface/web/sites/ftp_user_edit.php b/interface/web/sites/ftp_user_edit.php index 455d126..798233d 100644 --- a/interface/web/sites/ftp_user_edit.php +++ b/interface/web/sites/ftp_user_edit.php @@ -177,6 +177,23 @@ $app->db->query($sql); } + //* 2. check to ensure that the FTP user path is not changed to a path outside of the docroot by a normal user + if(isset($this->dataRecord['dir']) && $this->dataRecord['dir'] != $this->oldDataRecord['dir'] && !$app->auth->is_admin()) { + $vd = new validate_ftpuser; + $error_message = $vd->ftp_dir('dir', $this->dataRecord['dir'], ''); + //* This check should normally never be triggered + //* Set the path to a safe path (web doc root). + if($error_message != '') { + $ftp_data = $app->db->queryOneRecord("SELECT parent_domain_id FROM ftp_user WHERE ftp_user_id = '".$app->db->quote($app->tform->primary_id)."'"); + $web = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".$app->functions->intval($ftp_data["parent_domain_id"])); + $dir = $web["document_root"]; + $sql = "UPDATE ftp_user SET dir = '$dir' WHERE ftp_user_id = ".$this->id; + $app->db->query($sql); + $app->log("Error in FTP path settings of FTP user ".$this->dataRecord['username'], 1); + } + + } + } } -- Gitblit v1.9.1