1. 程式人生 > >18)添加引號轉移函數,防止SQL註入

18)添加引號轉移函數,防止SQL註入

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註入