目录机构:

    

然后我的改动代码:

    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. github新建一个单页

    比如可以在github上打开的网页是这种网址形式的:https://01xunsicheng.github.io/yumeihua/ 1.登录后首页找到 New repository 2.新建一个文件 ...

  2. 利用salt-stack 对多台分布式应用进行简单部署jar包项目:

    /appsystems/JQM-SERVER/shell/stopServer.sh:                                         ----用脚本停止应用 cmd. ...

  3. 微信官方小程序示例demo 微信开发者工具打开不显示云开发按钮

    如果直接打开官方的demo,微信开发者工具上是不显示云开发按钮的. 是因为默认appid是测试号.要换成一个正式appid就会显示云开发按钮了. 分享一个朋友的人工智能教程.零基础!通俗易懂!风趣幽默 ...

  4. 当初对"软件工程"这个专业的期待和想象是什么?

    很多期待,很多幻想 印象很深刻的初中语文老师让我们背诵的一首诗<错误>: <错误> 作 者:郑愁予 我打江南走过 那等在季节里的容颜如莲花的开落 东风不来,三月的柳絮不飞 你底 ...

  5. Activity组件:(一)通过显式意图和隐式意图来实现Activity间的跳转

    一.通过显式意图来实现Activity间的跳转 显式意图是指在创建Intent对象时就指定接受者组件 /** * 下面是通过显式意图进行跳转,即明确写出要跳转到SecondActivity.class ...

  6. share团队冲刺2

    团队冲刺第二天 昨天:在网上学习app开发的简单操作代码,实现了简单的输出界面,学会了添加按钮控件. 今天:继续昨天的进度,先进行登陆界面窗口的制作. 问题:目前只能在activity添加简单代码,复 ...

  7. Java使用Sftp实现对跨服务器上传、下载、打包、写入相关操作

    1.Maven引入jar <dependency> <groupId>com.jcraft</groupId> <artifactId>jsch< ...

  8. 17.3.10--C语言运行的步骤

    编译-->生成-->调试-->链接-->运行 编译就是:将你编写的C语言程序翻译成机器能识别运行的指令集 生成就是:根据编译完成的指令集制造出机器可以具体执行的指令序列 调试就 ...

  9. 从[Greenplum 6.0] 1分钟安装尝鲜开始

    Greenplum目前6版本目前已经迭代了几个小版本了,随着版本的更新,不断的有bug被修复. 打算试用的朋友可以入手了. 作为开年的第一个工作日的第一个帖子,必须从“开天辟地”的6.0开始.以下内容 ...

  10. Linux下切换用户出现su: Authentication failure的解决办法

    在切换用户时,密码没有输错,但始终无法成功地切换,还报出身份验证失败的错误,下面是具体解决方案: 在终端上输入指令sudo passwd root 此时输入你的密码 重复再次输入你的密码 再次用su指 ...