]> andersk Git - sql-web.git/blobdiff - lib/security.lib.php
Fix SQL injection vulnerability in DB deletion
[sql-web.git] / lib / security.lib.php
index 7557465526cf66a96010402dc94cdc699efa461e..1ac28492f3d6fd8dc6f6be2e6026da3cf24e4e86 100644 (file)
@@ -1,15 +1,18 @@
 <?php
+/*
+       (c) 2005 Joe Presbrey
+*/
 
 require_once('mitsql.lib.php');
 
 class Login {
-       var $id, $u, $p;
-    var $info;
+       private $id, $u, $p;
+    private $info;
     function Login($u, $p=null) {
                if (empty($u)) return;
                $this->u = $u;
                $this->p = $p;
-               if (is_numeric($u)) {
+               if (is_null($p)) {
                        $this->id = $u;
                        $opt = sprintf(" UserId = '%s'", mysql_escape_string($u));
                } else {
@@ -55,13 +58,6 @@ class Login {
     function expire() {
         $this->info = null;
     }
-    function refresh() {
-               if (!empty($this->id)) {
-                       $this->Login($this->id);
-               } else {
-                       $this->Login($this->u,$this->p);
-               }
-    }
     function update($name=null,$email=null) {
         if (!$this->exists()) return;
         $arr = array();
@@ -70,7 +66,7 @@ class Login {
         is_null($name) || $arr['Name'] = $name;
         is_null($email) || $arr['Email'] = $email;
                $upd = buildSQLSet($arr);
-        $sql = sprintf("UPDATE User %s WHERE UserId = '%s'",
+        $sql = sprintf("UPDATE User SET %s WHERE UserId = '%s'",
                         $upd, mysql_escape_string($this->getUserId()));
                if (!empty($upd) && $upd != 'SET')
                        DBUpdate($sql);
@@ -82,12 +78,12 @@ class Login {
 }
 
 class User {
-       var $userId;
-       var $info;
-       var $dblist;
+       private $userId;
+       private $info;
+       private $dblist;
     function User($userId) {
                $this->userId = $userId;
-        $sql = sprintf("SELECT User.UserId, Username, Password, Name, Email, UL, bEnabled, nBytesSoft, nBytesHard, nBytes, nDatabases, nDatabasesHard
+        $sql = sprintf("SELECT User.UserId, Username, Name, Email, UL, bEnabled, nBytesSoft, nBytesHard, nBytes, nDatabases, nDatabasesHard, IF(nBytes>nBytesHard,1,0) AS bOverQuota
                         FROM User
                                                INNER JOIN UserQuota ON User.UserId = UserQuota.UserId
                                                INNER JOIN UserStat ON User.UserId = UserStat.UserId
@@ -96,13 +92,12 @@ class User {
         $r = fetchRows(DBSelect($sql),'UserId');
         $this->info = count($r)?array_shift($r):$r;
                $this->dblist = $this->getDBList();
-//             $this->pass = base64_decode($this->info['Password']);
     }
        function refresh() {
                unset($this->dblist);
                $this->User($this->userId);
                /*
-        $sql = sprintf("SELECT UserId, Username, Password, Name, Email, UL, bEnabled
+        $sql = sprintf("SELECT UserId, Username, Name, Email, UL, bEnabled
                         FROM User
                         WHERE UserId = '%s'",
                         mysql_escape_string($this->userId));
@@ -121,6 +116,12 @@ class User {
     function getUsername() {
         return $this->exists()?$this->info['Username']:'';
     }
+    function isOverQuota() {
+        return $this->exists()?($this->info['bOverQuota']>0?true:false):'';
+    }
+    function getDBQuotaHard() {
+        return $this->exists()?$this->info['nDatabasesHard']:0;
+    }
     function getBytes() {
         if($this->exists()) {
                        $arr['nBytes'] = $this->info['nBytes'];
@@ -131,7 +132,7 @@ class User {
     }
        function setPassword($pwd) {
                $arr['Password'] = base64_encode($pwd);
-        $sql = sprintf("UPDATE User %s WHERE UserId = '%s'",
+        $sql = sprintf("UPDATE User SET %s WHERE UserId = '%s'",
                         buildSQLSet($arr), mysql_escape_string($this->getUserId()));
         DBUpdate($sql);
                $sql = sprintf('SET PASSWORD FOR \'%s\'@\'%%\'=PASSWORD(\'%s\')',
@@ -144,7 +145,7 @@ class User {
                $arr['Password'] = base64_encode($pwd);
                $arr['bEnabled'] = 1;
                $arr['dSignup'] = 'NOW()';
-        $sql = sprintf("UPDATE User %s WHERE UserId = '%s'",
+        $sql = sprintf("UPDATE User SET %s WHERE UserId = '%s'",
                         buildSQLSet($arr), mysql_escape_string($this->getUserId()));
         DBUpdate($sql);
 
@@ -195,11 +196,12 @@ class User {
                                                mysql_escape_string($this->getUserId()));
 //                     $r = fetchRows(DBSelect($sql),'DatabaseId');
                        $r = fetchRows(DBSelect($sql),'Name');
+                       ksort($r);
                        return $r;
                }
        }
        function addDB($name) {
-               if (in_array($name, $this->getDBList())) return false;
+               if (in_array($name, array_keys($this->getDBList()))) return false;
                if (!addDB($name, $this->getUserId())) return false;
                $this->setAccess($name);
                return true;
@@ -218,7 +220,7 @@ function isLoggedIn($aLogin=null) {
         global $Login;
         $aLogin = $Login;
     }
-    return !empty($aLogin) && is_a($aLogin, 'Login') && $aLogin->canLogin();
+    return !empty($aLogin) && ($aLogin instanceof Login) && $aLogin->canLogin();
 }
 
 function isAdmin($aLogin=null) {
@@ -226,18 +228,27 @@ function isAdmin($aLogin=null) {
         global $Login;
         $aLogin = $Login;
     }
-    return !empty($aLogin) && is_a($aLogin, 'Login') && $aLogin->getUL()>=100;
+    return !empty($aLogin) && ($aLogin instanceof Login) && $aLogin->getUL()>=100;
 }
 
 function isImpersonating() {
        return isSess('_UserId') && isSess('UserId');
 }
 
+function isOffline() {
+       return (defined('OFFLINE') && OFFLINE);
+}
+
+function isOnline() {
+       return !isOffline();
+}
+
 function impersonate($userId=null) {
        $wasImpersonating = isImpersonating();
        if ($wasImpersonating) {
-               if (is_null($userId)) {
+               if (is_null($userId) || empty($userId)) {
                        sess('UserId',sess('_UserId'));
+                       sess('_UserId','');
                } elseif ($userId>0) {
                        sess('UserId',$userId);
                } else {
@@ -253,7 +264,7 @@ function impersonate($userId=null) {
 }
 
 function isSSL() {
-       return $_SERVER['SERVER_PORT'] == 443;
+       return isset($_SERVER['SERVER_PORT'])?($_SERVER['SERVER_PORT'] == 443):false;
 }
 
 function getSSLCert() {
@@ -263,7 +274,7 @@ function getSSLCert() {
         $email = trim($fu[1]);
     } else {
         $name = isset($_SERVER['SSL_CLIENT_S_DN_CN'])?$_SERVER['SSL_CLIENT_S_DN_CN']:null;
-        $email = isset($_SERVER['SSL_CLIENT_S_DN_Email'])?$_SERVER['SSL_CLIENT_S_DN_Email']:null;
+        $email = isset($_SERVER['REMOTE_USER'])?$_SERVER['REMOTE_USER']:null;
     }
     if (!is_null($email)) {
         $user = explode('@',$email);
@@ -274,21 +285,31 @@ function getSSLCert() {
        }
 }
 
+function getUsernameID($username) {
+       $sql = sprintf("SELECT UserId FROM User USE INDEX (UsernameID) WHERE Username = '%s'", mysql_escape_string($username));
+       $r = fetchRows(DBSelect($sql), 'UserId');
+       $r = array_shift($r);
+       return count($r)?$r['UserId']:null;
+}
+
 ## 302 REDIRECTS
 
 function redirect($target=null,$secure=null) {
-    $base = (is_null($target)||substr($target,0,1)=='?')?$_SERVER['REDIRECT_URL']:(dirname($_SERVER['REDIRECT_URL']).'/');
+    $base = (is_null($target)||substr($target,0,1)=='?')?URI:((strlen(dirname(URI))>1?dirname(URI).'/':'/'));
     redirectFull(is_null($target)?$base:($base.$target),$secure);
 }
+function redirectStart() {
+       redirectFull(BASE_URL,null);
+}
 function redirectFull($target,$secure) {
-       redirect2((((isSSL()&&is_null($secure))||$secure==true)?'https://':'http://').$_SERVER['SERVER_NAME'].$target);
+       redirect2((((isSSL()&&is_null($secure))||$secure==true)?BASE_HTTPS:BASE_HTTP).$target);
 }
 function redirect2($target) {
        header('Location: '.$target);
        exit;
 }
 function flipSSL() {
-       return (isSSL()?'http://':'https://').$_SERVER['SERVER_NAME'].$_SERVER['REDIRECT_URL'];
+       return (isSSL()?BASE_HTTP:BASE_HTTPS).URI;
 }
 
 ## USER SCRIPTS
@@ -320,6 +341,7 @@ function addDB($dbname,$userid) {
        global $_NEW_DB, $_NEW_DBQUOTA, $_NEW_DBOWNER;
 
        DBCreate(sprintf('CREATE DATABASE `%s`', mysql_escape_string($dbname)));
+       if (mysql_error()) return false;
 
        $newdb['Name'] = $dbname;
        $arr = array_merge($newdb, $_NEW_DB);
@@ -337,27 +359,29 @@ function addDB($dbname,$userid) {
                } else {
                        return false;
                }
-               $sql = sprintf("UPDATE DB %s WHERE DB.DatabaseId = '%s'",
+               $sql = sprintf("UPDATE DB SET %s WHERE DB.DatabaseId = '%s'",
                                                buildSQLSet($arr),
                                                $DBId);
                DBUpdate($sql);
-               return $DBId;
-       } else {
-               $arr = $_NEW_DBQUOTA;
-               $arr['DatabaseId'] = $DBId;
-               $sql = sprintf("INSERT IGNORE INTO DBQuota %s",
-                                               buildSQLInsert($arr));
-               DBInsert($sql);
-
-               $arr = $_NEW_DBOWNER;
-               $arr['DatabaseId'] = $DBId;
-               $arr['UserId'] = $userid;
-               $sql = sprintf("INSERT IGNORE INTO DBOwner %s",
-                                               buildSQLInsert($arr));
-               DBInsert($sql);
-
-               return $DBId;
        }
+
+       DBDelete(sprintf("DELETE FROM DBOwner WHERE DatabaseId = '%s'", mysql_escape_string($DBId)));
+       DBDelete(sprintf("DELETE FROM DBQuota WHERE DatabaseId = '%s'", mysql_escape_string($DBId)));
+       
+       $arr = $_NEW_DBQUOTA;
+       $arr['DatabaseId'] = $DBId;
+       $sql = sprintf("INSERT IGNORE INTO DBQuota %s",
+                                       buildSQLInsert($arr));
+       DBInsert($sql);
+
+       $arr = $_NEW_DBOWNER;
+       $arr['DatabaseId'] = $DBId;
+       $arr['UserId'] = $userid;
+       $sql = sprintf("INSERT IGNORE INTO DBOwner %s",
+                                       buildSQLInsert($arr));
+       DBInsert($sql);
+
+       return $DBId;
 }
 
 function delDB($dbname) {
@@ -366,9 +390,9 @@ function delDB($dbname) {
        DBCreate(sprintf('DROP DATABASE `%s`', mysql_escape_string($dbname)));
 
        $arr['bEnabled'] = 0;
-       $sql = sprintf("UPDATE DB %s WHERE DB.Name = '%s'",
+       $sql = sprintf("UPDATE DB SET %s WHERE DB.Name = '%s'",
                                        buildSQLSet($arr),
-                                       $dbname);
+                                       mysql_escape_string($dbname));
        DBUpdate($sql);
 
        return true;
This page took 0.040704 seconds and 4 git commands to generate.