目录机构:

    

然后我的改动代码:

    MysqlDB.class.php

    

 <?php

     /**
* Created by PhpStorm.
* User: Interact
* Date: 2017/8/19
* Time: 19:32
*/
class MysqlDB {
private static $link;
public $host;
public $port;
public $username;
public $passsword;
public $charset;
//数据库连接对象
public $dbname;//防止未接破坏这个连接对象,这个link就是MysqlDB 对象
private $resourc; /**
* @param $config,你的配置数组
* @return 获取数据库连接对象$link,同时作为返回值
*/
private function __construct($config) {
$this->host = isset($config['host']) ? $config['host'] : 'localhost';
$this->port = isset($config['port']) ? $config['port'] : '';
$this->username = isset($config['username']) ? $config['username'] : 'root';
$this->password = isset($config['password']) ? $config['password'] : '';
$this->charset = isset($config['charset']) ? $config['charset'] : 'utf8';
$this->dbname = isset($config['dbname']) ? $config['dbname'] : '';
//连接数据库
$this->connect();
//设定连接编码
//$this->setCharset($this->charset);//这个执行不了,可能新的php有了更改
//选定数据库
$this->selectDb($this->dbname);
} //构造函数,禁止new,这样可以用工厂函数来创造类
public function connect() {
$this->resourc = mysqli_connect("$this->host",
"$this->username", "$this->password") or die("连接数据库失败!");
} //禁止克隆
public function selectDb($dbname) {
mysqli_select_db($this->resourc, $dbname);
} public static function getInstance($config) {
if (!isset(self::$link)) {
self::$link = new self($config);
//或者是 self::$link=$this->__construct($config);
} return self::$link;
} /**
* 功能:执行select语句,返回2维数组
* 参数:$sql 字符串类型 select语句
*/
public function getAll($sql) {
$result = $this->query($sql);
$arr = array(); //空数组
while ($rec = mysqli_fetch_assoc($result)) {
$arr[] = $rec;//这样就形成二维数组
} return $arr;
} /**
* 功能:执行最基本(任何)sql语句
* 返回:如果失败直接结束,如果成功,返回执行结果
*/
public function query($sql) {
if (!$result = mysqli_query($this->resourc, $sql)) {
echo("<br />执行失败。");
echo "<br />失败的sql语句为:".$sql;
echo "<br />出错信息为:".mysqli_error($this->resourc);
echo "<br />错误代号为:".mysqli_errno($this->resourc);
die();
} return $result;
} public function getRow($sql) {
$result = $this->query($sql);
//$rec = array();
if ($rec2 = mysqli_fetch_assoc($result)) {//返回下标为字段名的数组
//如果fetch出来有数据(也就是取得了一行数据),结果自然是数组
return $rec2;
} return false;
} //返回一行数据(作为一维数组) public function getOne($sql) {
$result = $this->query($sql);
$rec = mysqli_fetch_row($result);//返回下标为数字的数组,且下标一定是0,1,2, 3.....
//如果没有数据,返回false
if ($result === false) {
return false;
} return $rec[]; //该数组的第一项。 }
//返回一个数据(select语句的第一行第一列)
//比如常见的:select count(*) as c from XXX where ... private function __clone() {
}
/**
* 转义用户数据,防止SQL注入
* @param $data string 带转换的字符串
* @return string
* 转换后的字符串
*/
public function escapeString($data){
return mysqli_real_escape_string(self::$link,$data);
}
}

    AdminModel.class.php

      

 <?php
/**
* Created by PhpStorm.
* User: Interact
* Date: 2017/8/21
* Time: 8:39
*/
class AdminModel extends Model{
/**
* @param $admin_name
* @param $admin_pass
*后台登录验证函数
* @return bool
*/
public function check($admin_name, $admin_pass) {
$admin_name=$this->_dao->escapeString($admin_name);
$admin_pass=$this->_dao->escapeString($admin_pass);
$sql = "SELECT * FROM `admin` WHERE admin_name='$admin_name' and admin_pass=md5('$admin_pass')";
$row = $this->_dao->getRow($sql); return (bool) $row;
}
}

  AdminC.controller.class.php

    

    

 <?php
/**
* Created by PhpStorm.
* User: Interact
* Date: 2017/8/20
* Time: 14:22
*/
class AdminC extends Controller{ public function login(){
// require
require APPLICATION_PATH.'back/view/login.html';
}
/**
* 验证管理员是否合法
*/
public function check() {
// echo "MC天佑MC天佑MC天佑";
// echo $_REQUEST['username'];
// 获得表单数据
/*echo $_REQUEST['username'];
echo '\n';
echo $_REQUEST['password'];*/
$admin_name = $_REQUEST['username'];
$admin_pass = $_REQUEST['password'];
$admin_name=addslashes($admin_name);
$admin_pass=addslashes($admin_pass); //从数据库中验证管理员信息是否存在合法
$m_admin = Factory::M('AdminModel');
if ($m_admin->check($admin_name, $admin_pass)) {
// //验证通过,合法
// echo '合法,直接跳转到后台首页';
session_start();
// $_SESSION['is_login']='yes';
new SessionDB();
$this->_jump('index.php?p=back&c=BACkC&a=index');
} else {
// 非法
// echo '非法, 提示,跳转到后台登陆页面index.php?p=back&c=Admin&a=login';
$this->_jump('index.php?p=back&c=AdminC&a=login','用户名或密码错误');
}
//
}
}

结果展示:

    

18)添加引号转移函数,防止SQL注入的更多相关文章

  1. sql注入1

    一.函数 1.version() MYsql版本 2.user()    数据库用户名 3.database()   数据库名 4.@@datadir  数据库路径 5.@@version_compi ...

  2. ASP.NET会员注册登录模块(MD5加密,Parameters防止SQL注入,判断是否注册)

    MD5加密,Parameters防止SQL注入: protected void btnLog_Click(object sender, EventArgs e)     {         //获取验 ...

  3. SQL注入之PHP+Mysql

    PHP+Mysql(GET方法+数值型+有错误回显)的注入方法 目标系统:PHP+MYSQL(GET方法+数值型+有错误信息) 环境说明: 后台地址:http://ip/cms/admin/login ...

  4. sql注入-推断是否存在SQL注入-单引号

    来自:https://www.cnblogs.com/ichunqiu/p/5749347.html 首先我们需要了解数据是通过什么方式进行输入,这里我总结了三个: GET请求:该请求在URL中发送参 ...

  5. 黑马程序员_ADO.Net(ExecuteReader,Sql注入与参数添加,DataSet,总结DataSet与SqlDataReader )

    转自https://blog.csdn.net/u010796875/article/details/17386131 一.执行有多行结果集的用ExecuteReader SqlDateReader  ...

  6. SQL注入--反引号

    反引号是个比较特别的字符,下面记录下怎么利用 0x00 SQL注入 反引号可利用在分隔符及注释作用,不过使用范围只于表名.数据库名.字段名.起别名这些场景,下面具体说下 1)表名 payload:se ...

  7. SQL注入攻防入门详解

    =============安全性篇目录============== 本文转载 毕业开始从事winfrm到今年转到 web ,在码农届已经足足混了快接近3年了,但是对安全方面的知识依旧薄弱,事实上是没机 ...

  8. SQL注入攻防入门详解(2)

    SQL注入攻防入门详解 =============安全性篇目录============== 毕业开始从事winfrm到今年转到 web ,在码农届已经足足混了快接近3年了,但是对安全方面的知识依旧薄弱 ...

  9. 代码审计之SQL注入

    0x00概况说明 0x01报错注入及利用 环境说明 kali LAMP 0x0a 核心代码 现在注入的主要原因是程序员在写sql语句的时候还是通过最原始的语句拼接来完成,另外SQL语句有Select. ...

随机推荐

  1. OpenMP笔记(六)

    OpenMP有三种常见的加锁操作: critical是OpenMP的指令,它规定其后的代码为临界块,任何时候只允许一个线程访问: omp_set_lock是OpenMP的库函数,要跟omp_unset ...

  2. OpenMP笔记(五)

    任务调度主要用于并行的for循环中,当循环中每次迭代的计算量不相等时,如果简单地给各个线程分配相同次数的迭代的话,会造成各个线程计算负载不均衡,这会使得有些线程先执行完,有些后执行完,造成某些CPU核 ...

  3. main函数的参数(int argc,char *argv[])

    一般的main函数都是不带参数的,因此main 后的括号都是空括号.实际上,main函数可以带参数,这个参数可以认为是 main函数的形式参数.C语言规定main函数的参数只能有两个, 习惯上这两个参 ...

  4. 1.where子句的优化

    不需要在牺牲可读性的情况下重写sql,因为mysql会自动进行类似的优化. 1.去掉无用的括号 ((a AND b) AND c OR (((a AND b) AND (c AND d)))) -&g ...

  5. MyBatis从入门到精通(第2章):MyBatis XML方式的基本用法【insert用法、update用法、delete用法】

    2.4  insert 用法 2.4.1  简单的 insert方法 在接口 UserMapper.java 中添加如下方法. /** * 新增用户 * @param sysUser * @retur ...

  6. 帝国CMS7.5后台美化模板 后台风格修改 帝国CMS后台模板

    都知道帝国CMS功能强悍,生成静态html也非常好用.可是有时候他的后台样式,丑的让你不想用,dede呢,漏洞太多,PHPCMS好看,可是门槛要求高,你会写PHP才行. 帝国CMS后台美化模板:全面美 ...

  7. linux 信号量sem实现 生产者—消费者(线程间通信)

    #include<pthread.h> #include<stdlib.h> #include<stdio.h> #include<unistd.h> ...

  8. 多对多的三种创建方式-forms相关组件-钩子函数-cookie与session

    多对多的三种创建方式 1.全自动(推荐使用的**) 优势:第三张可以任意的扩展字段 缺点:ORM查询不方便,如果后续字段增加更改时不便添加修改 manyToManyField创建的第三张表属于虚拟的, ...

  9. Mutation|DNM|

    生命组学 DNA序列改变的分子基础 变异来源 据研究对象,可分为两类mutation:个体上的变异和群体上的变异,群体上的变异是关联研究,eg喝酒人群vs非喝酒人群相比. 造成mutation的三类机 ...

  10. ZJNU 1133 - Subset sequence——中级

    推出n=1到4时,An排列的种类数分别为1 4 15 64可得(1+1)*2=4(4+1)*3=15(15+1)*4=64...故用一数列r[n]记录An的种类总数当n=3时,列举出以下15种从大到小 ...