目录机构:

    

然后我的改动代码:

    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. php empty,isset,is_null判断比较(差异与异同)

    php empty,isset,is_null判断比较(差异与异同) 作者: 字体:[增加 减小] 类型:转载 做php开发时候,想必在使用:empty,isset,is_null 这几个函数时候,遇 ...

  2. mod_rewrite是Apache的一个非常强大的功能

    mod_rewrite是Apache的一个非常强大的功能,它可以实现伪静态页面.下面我详细说说它的使用方法!对初学者很有用的哦! 1.检测Apache是否支持mod_rewrite 通过php提供的p ...

  3. 提示Asp.net4.5未在web服务器上注册

    在用vs2012代开项目时, 每回都显示Asp.net4.5未在web服务器上注册,最后是由于没有下载一个补丁的原因,只需要下载安装补丁 VS11-KB3002339.exe ,下载地址:https: ...

  4. spring获取当前动态代理对象

    由于spring中的aop拦截的是代理对象 当拦截的目标方法被本类的另一个方法调用时,会出现拦截失效 最佳实践: 例如拦截RegulationService的update(regulation)方法, ...

  5. c语言中多维数组和指针的关系

    如图: 执行结果: 说明:由执行结果可知,三个输出的结果相等(可能在不同的平台执行结果不相同,但三个的结果是相等的),数组multi的地址与数组multi[0]的地址相同,都等于存储的第一个整数的地址 ...

  6. List和Map集合详细分析

    1.Java集合主要三种类型(两部分): 第一部分:Collection(存单个数据,只能存取引用类型) (1).List :是一个有序集合,可以放重复的数据:(存顺序和取顺序相同) (2).Set ...

  7. Java之线程通信的方法

    /** * 线程通信的例子:使用两个线程打印 1-100.线程1, 线程2 交替打印 * * 涉及到的三个方法: * wait():一旦执行此方法,当前线程就进入阻塞状态,并释放同步监视器. * no ...

  8. c语言删除文件的指定行,更新文件

    有时候我们需要删除文件的某一行,来更新文件,在这我个人扩展了一个函数,以删除指定条件的行. static void UpdateHistoryFile(void) { FILE *fin,*fout; ...

  9. 【转】 java类的加载和执行顺序

    1.先执行Test类的静态代码块后执行Test类的main方法,说明要执行类的方法需要先加载这个类. 2.在创建ClassB的对象时,先去加载了父类ClassA.说明加载子类时如果没有加载父类,会先加 ...

  10. hdu 1246

    很久没有写题解了~因为懒(年纪大了就是脸皮厚,还有脸说) 这道题今天花了很长时间去推,一开始以为是规律题,没推出来,直接模拟也TLE了,接着考虑实在是没思路,看了题解. 思路大概就是这样: 先上代码( ...