18)添加引号转移函数,防止SQL注入
目录机构:

然后我的改动代码:
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注入的更多相关文章
- sql注入1
一.函数 1.version() MYsql版本 2.user() 数据库用户名 3.database() 数据库名 4.@@datadir 数据库路径 5.@@version_compi ...
- ASP.NET会员注册登录模块(MD5加密,Parameters防止SQL注入,判断是否注册)
MD5加密,Parameters防止SQL注入: protected void btnLog_Click(object sender, EventArgs e) { //获取验 ...
- SQL注入之PHP+Mysql
PHP+Mysql(GET方法+数值型+有错误回显)的注入方法 目标系统:PHP+MYSQL(GET方法+数值型+有错误信息) 环境说明: 后台地址:http://ip/cms/admin/login ...
- sql注入-推断是否存在SQL注入-单引号
来自:https://www.cnblogs.com/ichunqiu/p/5749347.html 首先我们需要了解数据是通过什么方式进行输入,这里我总结了三个: GET请求:该请求在URL中发送参 ...
- 黑马程序员_ADO.Net(ExecuteReader,Sql注入与参数添加,DataSet,总结DataSet与SqlDataReader )
转自https://blog.csdn.net/u010796875/article/details/17386131 一.执行有多行结果集的用ExecuteReader SqlDateReader ...
- SQL注入--反引号
反引号是个比较特别的字符,下面记录下怎么利用 0x00 SQL注入 反引号可利用在分隔符及注释作用,不过使用范围只于表名.数据库名.字段名.起别名这些场景,下面具体说下 1)表名 payload:se ...
- SQL注入攻防入门详解
=============安全性篇目录============== 本文转载 毕业开始从事winfrm到今年转到 web ,在码农届已经足足混了快接近3年了,但是对安全方面的知识依旧薄弱,事实上是没机 ...
- SQL注入攻防入门详解(2)
SQL注入攻防入门详解 =============安全性篇目录============== 毕业开始从事winfrm到今年转到 web ,在码农届已经足足混了快接近3年了,但是对安全方面的知识依旧薄弱 ...
- 代码审计之SQL注入
0x00概况说明 0x01报错注入及利用 环境说明 kali LAMP 0x0a 核心代码 现在注入的主要原因是程序员在写sql语句的时候还是通过最原始的语句拼接来完成,另外SQL语句有Select. ...
随机推荐
- Python—异步任务队列Celery简单使用
一.Celery简介 Celery是一个简单,灵活,可靠的分布式系统,用于处理大量消息,同时为操作提供维护此类系统所需的工具.它是一个任务队列,专注于实时处理,同时还支持任务调度. 中间人boker: ...
- 03 Mybatis:05.使用Mybatis完成CRUD
mybatis框架:共四天 明确:我们在实际开发中,都是越简便越好,所以都是采用不写dao实现类的方式.不管使用XML还是注解配置. 第二天:mybatis基本使用 mybatis的单表crud操作 ...
- JS变量、作用域及内存
1.动态属性var box = new Object();box.name = 'lee';alert(box.name); var box = 'lee';box.age = '28';alert( ...
- SpringBoot2中,怎么生成静态文档
SpringBoot2中,怎么生成静态文档 在实际开发过程中,我们通过swagger就可以生成我们的接口文档,这个文档就可以提供给前端人员开发使用的.但是,有时候,我们需要把我们的接口文档,提供给第三 ...
- Linux环境系列 之【配置虚拟机】
前言懒得讲, 不给人解决问题的程序员不是好的程序员,所有老规矩,直接上干货 This is 系列故事 如果你从这里单独看那是没有任何问题的,但是你是小白的话建议你跳去 ☞从头开始[环境概述] ☞本章节 ...
- long型长整数字在前端页面显示异常及其解决方法
文章目录 1.引子 2.解决问题 (1)初试EL表达式取long型数值 (2)再探EL表达式取字符串格式long型数值 (3)最后一试---给EL表达式加引号 3.总结 1.引子 在做项目中,发现了一 ...
- ZJNU 1422 - 碰撞的小球
完全弹性碰撞可以视作互相穿过 所以直接考虑只有单个小球的时候,从板子上滑下所需要的时间即可 最后以30000为界分开流读入与缓冲区优化的io方法 //Case4用缓冲区io优化会WA??? /* Wr ...
- mysql 不停机 短时间锁表 备份 主备同步 新增备份机器
刷新数据 [root@localhost ~]# mysql -e 'flush tables with read lock;' 锁表刷新表数据 [root@localhost ~]# mys ...
- BZOJ4059[Cerc2012]Non-boring sequences(扫描线/分治)
这题正解应该是扫描线,就是发现DP的区间在两个维度都为连续段,于是可以直接扫描线.但不幸的是,扫描线常数过大,无法通过本题. 考虑分治.对于分治区间[l,r],可以记录pre和nxt表示其前/后一次出 ...
- apache启动失败,提示80端口被占用
首先检查80端口被什么程序占用,方法:cmd进DOS,输入netstat -ano 80端口被为4的进程占用,有两种可能:一种情况是本机中安装了sqlserver 2008,80端口被SqlServe ...