18)添加引號轉移函數,防止SQL註入
阿新 • • 發佈:2017-08-21
factor isset art .com md5 ati 出錯 pri 取數據
目錄機構:
然後我的改動代碼:
MysqlDB.class.php
1 <?php 2 3 /** 4 * Created by PhpStorm. 5 * User: Interact 6 * Date: 2017/8/19 7 * Time: 19:32 8 */ 9 class MysqlDB { 10 private static $link; 11 public $host; 12 public$port; 13 public $username; 14 public $passsword; 15 public $charset; 16 //數據庫連接對象 17 public $dbname;//防止未接破壞這個連接對象,這個link就是MysqlDB 對象 18 private $resourc; 19 20 /** 21 * @param $config,你的配置數組 22 * @return 獲取數據庫連接對象$link,同時作為返回值23 */ 24 private function __construct($config) { 25 $this->host = isset($config[‘host‘]) ? $config[‘host‘] : ‘localhost‘; 26 $this->port = isset($config[‘port‘]) ? $config[‘port‘] : ‘3306‘; 27 $this->username = isset($config[‘username‘]) ? $config[‘username‘] : ‘root‘; 28 $this->password = isset($config[‘password‘]) ? $config[‘password‘] : ‘‘; 29 $this->charset = isset($config[‘charset‘]) ? $config[‘charset‘] : ‘utf8‘; 30 $this->dbname = isset($config[‘dbname‘]) ? $config[‘dbname‘] : ‘‘; 31 //連接數據庫 32 $this->connect(); 33 //設定連接編碼 34 //$this->setCharset($this->charset);//這個執行不了,可能新的php有了更改 35 //選定數據庫 36 $this->selectDb($this->dbname); 37 } 38 39 //構造函數,禁止new,這樣可以用工廠函數來創造類 40 public function connect() { 41 $this->resourc = mysqli_connect("$this->host", 42 "$this->username", "$this->password") or die("連接數據庫失敗!"); 43 } 44 45 //禁止克隆 46 public function selectDb($dbname) { 47 mysqli_select_db($this->resourc, $dbname); 48 } 49 50 public static function getInstance($config) { 51 if (!isset(self::$link)) { 52 self::$link = new self($config); 53 //或者是 self::$link=$this->__construct($config); 54 } 55 56 return self::$link; 57 } 58 59 /** 60 * 功能:執行select語句,返回2維數組 61 * 參數:$sql 字符串類型 select語句 62 */ 63 public function getAll($sql) { 64 $result = $this->query($sql); 65 $arr = array(); //空數組 66 while ($rec = mysqli_fetch_assoc($result)) { 67 $arr[] = $rec;//這樣就形成二維數組 68 } 69 70 return $arr; 71 } 72 73 /** 74 * 功能:執行最基本(任何)sql語句 75 * 返回:如果失敗直接結束,如果成功,返回執行結果 76 */ 77 public function query($sql) { 78 if (!$result = mysqli_query($this->resourc, $sql)) { 79 echo("<br />執行失敗。"); 80 echo "<br />失敗的sql語句為:".$sql; 81 echo "<br />出錯信息為:".mysqli_error($this->resourc); 82 echo "<br />錯誤代號為:".mysqli_errno($this->resourc); 83 die(); 84 } 85 86 return $result; 87 } 88 89 public function getRow($sql) { 90 $result = $this->query($sql); 91 //$rec = array(); 92 if ($rec2 = mysqli_fetch_assoc($result)) {//返回下標為字段名的數組 93 //如果fetch出來有數據(也就是取得了一行數據),結果自然是數組 94 return $rec2; 95 } 96 97 return false; 98 } 99 100 //返回一行數據(作為一維數組) 101 102 public function getOne($sql) { 103 $result = $this->query($sql); 104 $rec = mysqli_fetch_row($result);//返回下標為數字的數組,且下標一定是0,1,2, 3..... 105 //如果沒有數據,返回false 106 if ($result === false) { 107 return false; 108 } 109 110 return $rec[0]; //該數組的第一項。 111 112 } 113 //返回一個數據(select語句的第一行第一列) 114 //比如常見的:select count(*) as c from XXX where ... 115 116 private function __clone() { 117 } 118 /** 119 * 轉義用戶數據,防止SQL註入 120 * @param $data string 帶轉換的字符串 121 * @return string 122 * 轉換後的字符串 123 */ 124 public function escapeString($data){ 125 return mysqli_real_escape_string(self::$link,$data); 126 } 127 }
AdminModel.class.php
1 <?php 2 /** 3 * Created by PhpStorm. 4 * User: Interact 5 * Date: 2017/8/21 6 * Time: 8:39 7 */ 8 class AdminModel extends Model{ 9 /** 10 * @param $admin_name 11 * @param $admin_pass 12 *後臺登錄驗證函數 13 * @return bool 14 */ 15 public function check($admin_name, $admin_pass) { 16 $admin_name=$this->_dao->escapeString($admin_name); 17 $admin_pass=$this->_dao->escapeString($admin_pass); 18 $sql = "SELECT * FROM `admin` WHERE admin_name=‘$admin_name‘ and admin_pass=md5(‘$admin_pass‘)"; 19 $row = $this->_dao->getRow($sql); 20 21 return (bool) $row; 22 } 23 }
AdminC.controller.class.php
1 <?php 2 /** 3 * Created by PhpStorm. 4 * User: Interact 5 * Date: 2017/8/20 6 * Time: 14:22 7 */ 8 class AdminC extends Controller{ 9 10 11 public function login(){ 12 // require 13 require APPLICATION_PATH.‘back/view/login.html‘; 14 } 15 /** 16 * 驗證管理員是否合法 17 */ 18 public function check() { 19 // echo "MC天佑MC天佑MC天佑"; 20 // echo $_REQUEST[‘username‘]; 21 // 獲得表單數據 22 /*echo $_REQUEST[‘username‘]; 23 echo ‘\n‘; 24 echo $_REQUEST[‘password‘];*/ 25 $admin_name = $_REQUEST[‘username‘]; 26 $admin_pass = $_REQUEST[‘password‘]; 27 $admin_name=addslashes($admin_name); 28 $admin_pass=addslashes($admin_pass); 29 30 31 32 //從數據庫中驗證管理員信息是否存在合法 33 $m_admin = Factory::M(‘AdminModel‘); 34 if ($m_admin->check($admin_name, $admin_pass)) { 35 // //驗證通過,合法 36 // echo ‘合法,直接跳轉到後臺首頁‘; 37 session_start(); 38 // $_SESSION[‘is_login‘]=‘yes‘; 39 new SessionDB(); 40 $this->_jump(‘index.php?p=back&c=BACkC&a=index‘); 41 } else { 42 // 非法 43 // echo ‘非法, 提示,跳轉到後臺登陸頁面index.php?p=back&c=Admin&a=login‘; 44 $this->_jump(‘index.php?p=back&c=AdminC&a=login‘,‘用戶名或密碼錯誤‘); 45 } 46 // 47 } 48 }
結果展示:
18)添加引號轉移函數,防止SQL註入