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. ...
随机推荐
- Linux-线程同步之互斥锁
1.互斥锁又叫互斥量(mutex) 2.相关函数:pthread_mutex_init pthread_mutex_destroy pthread_mutex_lock pthread_mute ...
- HttpClient4.x 上传文件
https://blog.csdn.net/wsdtq123/article/details/78888734
- Scanner方式输入小写字母转换成大写字母
import java.util.Scanner; /** * 小写字母转换成大写字母 * @author zzu119 * */ public class letterTransfe ...
- redis基本指令
1.键值相关命令 keys * 取出当前所有的key exists name 查看n是否有name这个key del name 删除key name e ...
- beta函数与置信度估计
可信度的估计 二项分布中的\(p\) 服从Beta分布 $ {\rm beta}(\alpha, \beta)$, 密度函数 \(\frac1{B(\alpha, \beta)} x^{\alpha- ...
- 吴裕雄--天生自然 JAVA开发学习:正则表达式
import java.util.regex.*; class RegexExample1{ public static void main(String args[]){ String conten ...
- IOC与AOP的理解
转自 https://blog.csdn.net/qq_38006047/article/details/80797386 1,理解“控制反转” 控制反转,也叫依赖注入,是面向对象编程中的一种设计理念 ...
- keyword排序-Es问题
问题:mapping索引registerordercount字段设置为keyword,但是在进行倒序排的视乎发现,没有按预期排序. keyword类型: "registerordercoun ...
- dht算法原理描述
dht原理 dht是P2P网络(结构化P2P)核心路由算法,主要是利用一致性hash,把节点和资源都表示成一个hash值,放入到这个大的hash环中,每个节点负责路由靠近它的资源. 一.重要概念: ...
- 初次运行Git前的配置
初次运行Git前的配置 一.初次运行 Git 前的配置 一般在新的系统上,我们都需要先配置下自己的 Git 工作环境.配置工作只需一次,以后升级时还会沿用现在的配置.当然,如果需要,你随时可以用相同的 ...