mysql注入攻击及防范


$createSqlGbk = "CREATE TABLE `user` (`id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '用户ID' ,`username` varchar(32) NOT NULL COMMENT '用户名' ,`password` varchar(32) NOT NULL ,`remark` text NULL ,PRIMARY KEY (`id`)) DEFAULT CHARACTER SET=gbk";$createSqlUtf8 = "CREATE TABLE `user` (`id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '用户ID' ,`username` varchar(32) NOT NULL COMMENT '用户名' ,`password` varchar(32) NOT NULL ,`remark` text NULL ,PRIMARY KEY (`id`)) DEFAULT CHARACTER SET=utf8";
$insertDataSql = "INSERT INTO `user` VALUES ('1', 'test', '123456', null), ('2', 'guest', '888888', null), ('3', 'admin', '888888', null)";
<html>
<head>
<title>SQL注入攻击与防范</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<style>
body{font-size:12px;margin:20px;}
h3{font-size:14px;margin:20px 0;}
a{font-size:12px;margin:10px 20px;}
</style>
</head>
<body>
<h3>SQL注入攻击(GBK)</h3>
<a href="./inject.php?type=gbk&id=1">正常取值</a>
<a href="./inject.php?type=gbk&id=2341 or 1 = 1 -- dasf">SQL注入(针对直接等于写法)</a>
<a href="./inject.php?type=gbk&id=2341' or 1 = 1 -- asdf">SQL注入(针对用引号包括写法)</a>
<a href="./inject.php?type=gbk&isslashes=1&id=2341<?php echo chr(0xbf) . chr(0x27); ?> or 1 = 1 -- asd">SQL注入(针对对特殊字符转义写法)</a>
<h3>SQL注入攻击(UTF8)</h3>
<a href="./inject.php?type=utf8&id=1">正常取值</a>
<a href="./inject.php?type=utf8&id=2341 or 1 = 1 -- dasf">SQL注入(针对直接等于写法)</a>
<a href="./inject.php?type=utf8&id=2341' or 1 = 1 -- asdf">SQL注入(针对用引号包括写法)</a>
<a href="./inject.php?type=utf8&isslashes=1&id=2341<?php echo chr(0xbf) . chr(0x27); ?> or 1 = 1 -- asd">SQL注入(针对对特殊字符转义写法)</a>
<div style="width:100%;height:5px;margin:10px 0px;clear:both;background-color:gray;"></div>
<?php
if (isset($_GET['type'])) {
$type = $_GET['type'];
} else {
exit();
}
echo "<h1 style='font-size:12px;'>CHARSET:: <b style='color:red;font-size:18px;'>" . $type . "</b></h1>";
// 建立mysql连接
$c = mysql_connect("localhost", "root", "");
echo "<h1 style='font-size:14px;color:red;'>SQL注入攻击及防范</h1>";
if (isset($_GET['id'])) {
if (isset($_GET['isslashes'])) {
$id = addslashes($_GET['id']);
} else {
$id = $_GET['id'];
}
// 三种sql写法
$sql1 = "SELECT * FROM user WHERE id = $id";
$sql2 = "SELECT * FROM user WHERE id = '{$id}'";
$sql = "SELECT * FROM user WHERE id = " . intval($id);
}
//根据编码不同,选择连接对应编码数据库
if ($type == 'gbk') {
mysql_select_db("testInjectionDb_gbk", $c);
// change our character set
mysql_query("SET CHARACTER SET 'gbk'", $c);
} else {
mysql_select_db("testInjectionDb_utf8", $c);
// change our character set
mysql_query("SET CHARACTER SET 'utf8'", $c);
}
// 依次执行三种写法的查询
echo "<div style='font-size:12px;'>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++</div>";
echo "<h1 style='font-size:12px;'>被攻击 SQL1:: <b style='color:red;font-size:14px;'>" . $sql1 . "</b></h1>";
$r1 = mysql_query($sql1, $c);
if ($r1) {
echo "<h1 style='font-size:12px;color:green;'>影响数据条数:: <b style='color:red;font-size:18px;'>" . mysql_num_rows($r1) . "</b></h1>";
} else {
echo "<h1 style='font-size:12px;color:red;'>语法错误!</h1>";
}
echo "<div style='font-size:12px;'>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++</div>";
echo "<h1 style='font-size:12px;'>被攻击 SQL2:: <b style='color:red;font-size:14px;'>" . $sql2 . "</b></h1>";
$r2 = mysql_query($sql2, $c);
if ($r2) {
echo "<h1 style='font-size:12px;color:green;'>影响数据条数:: <b style='color:red;font-size:18px;'>" . mysql_num_rows($r2) . "</b></h1>";
} else {
echo "<h1 style='font-size:12px;color:red;'>语法错误!</h1>";
}
echo "<div style='font-size:12px;'>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++</div>";
echo "<h1 style='font-size:12px;'>强制整型较验 SQL:: <b style='color:red;font-size:14px;'>" . $sql . "</b></h1>";
$r = mysql_query($sql, $c);
if ($r) {
echo "<h1 style='font-size:12px;color:green;'>影响数据条数:: <b style='color:red;font-size:18px;'>" . mysql_num_rows($r) . "</b></h1>";
} else {
echo "<h1 style='font-size:12px;color:red;'>语法错误!</h1>";
}
// 建立PDO的连接,万能防注入。
// 注意:
// 1. 参数 PDO::ATTR_EMULATE_PREPARES 设置为 false;
// 2. 你不能让占位符 ? 代替一组值,如:SELECT * FROM blog WHERE userid IN ( ? );
// 3. 你不能让占位符代替数据表名或列名,如:SELECT * FROM blog ORDER BY ?;
// 4. 你不能让占位符 ? 代替任何其他SQL语法,如:SELECT EXTRACT( ? FROM datetime_column) AS variable_datetime_element FROM blog;
echo "<div style='font-size:12px;'>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++</div>";
if ($type == 'gbk') {
$pdo = new PDO("mysql:host=localhost;dbname=testInjectionDb_gbk", "root", "");
} else {
$pdo = new PDO("mysql:host=localhost;dbname=testInjectionDb_utf8", "root", "");
}
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);
$st = $pdo->prepare("SELECT * FROM user WHERE id = ?");
$st->bindParam(1, $id);
$c = $st->execute();
echo "<h1 style='font-size:12px;'>PDO防注入(万能防注入) SQL:: <b style='color:red;font-size:14px;'>" . $st->queryString . "</b></h1>";
if ($c) {
$rs = $st->fetchAll();
echo "<h1 style='font-size:12px;color:green;'>影响数据条数:: <b style='color:red;font-size:18px;'>" . count($rs) . "</b></h1>";
var_dump($rs);
$st->debugDumpParams();
} else {
echo "<h1 style='font-size:12px;color:red;'>语法错误!</h1>";
}
?>
</body>
</html>

$sql1 = "SELECT * FROM user WHERE id = $id";$sql2 = "SELECT * FROM user WHERE id = '{$id}'";$sql = "SELECT * FROM user WHERE id = " . intval($id);$st = $pdo->prepare("SELECT * FROM user WHERE id = ?");$st->bindParam(1, $id);$c = $st->execute();
<a href="./inject.php?type=gbk&id=2341 or 1 = 1 -- dasf">SQL注入(针对直接等于写法)</a><a href="./inject.php?type=utf8&id=2341 or 1 = 1 -- dasf">SQL注入(针对直接等于写法)</a>


<a href="./inject.php?type=gbk&id=2341' or 1 = 1 -- asdf">SQL注入(针对用引号包括写法)</a><a href="./inject.php?type=utf8&id=2341' or 1 = 1 -- asdf">SQL注入(针对用引号包括写法)</a>
<a href="./inject.php?type=gbk&isslashes=1&id=2341<?php echo chr(0xbf) . chr(0x27); ?> or 1 = 1 -- asd">SQL注入(针对对特殊字符转义写法)</a><a href="./inject.php?type=utf8&isslashes=1&id=2341<?php echo chr(0xbf) . chr(0x27); ?> or 1 = 1 -- asd">SQL注入(针对对特殊字符转义写法)</a>


附件列表
mysql注入攻击及防范的更多相关文章
- [转载] MySQL 注入攻击与防御
MySQL 注入攻击与防御 2017-04-21 16:19:3454921次阅读0 作者:rootclay 预估稿费:500RMB 投稿方式:发送邮件至linwei#360.cn,或登陆网页 ...
- 个人网站对xss跨站脚本攻击(重点是富文本编辑器情况)和sql注入攻击的防范
昨天本博客受到了xss跨站脚本注入攻击,3分钟攻陷--其实攻击者进攻的手法很简单,没啥技术含量.只能感叹自己之前竟然完全没防范. 这是数据库里留下的一些记录.最后那人弄了一个无限循环弹出框的脚本,估计 ...
- SQL注入攻击及防范
一.什么是SQL注入1.SQL注入的定义 SQL注入(SQL Injection) 利用了程序中的SQL的漏洞,进行攻击的方法. 2.SQL注入举例 1)利用SQL语法错误获取数据库表的结构 ...
- mySql 注入攻击
注入攻击 1.原理: a.只要是带有参数的动态网页且此网页访问了数据库,那么就有可能存在SQL注入; b.字符串拼接和没有判断用户输入是否合法------>导致用户可以玩填字游戏-----> ...
- Mysql注入攻击与防御(思维导图笔记)
- SQL注入攻击
SQL注入攻击是黑客对数据库进行攻击的常用手段之一.随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多.但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候, ...
- ASP.NET中的SQL注入攻击与防护
什么是SQL注入攻击? 它是在执行SQL查询的时候,由于接收了用户的非法参数从而导致,所执行的SQL语义与业务逻辑原本所要查询的语义不相符,从而实现的攻击. 例如我们经常使用的用户登录,通常会出现这样 ...
- 【数据库】SQL注入攻击
背景: 机房收费系统验收的时候,师父提到SQL注入攻击.自己以前看过类似的博客大概知道一些这方面的事情,于是自己动手查了查. 定义: 所谓SQL注入,通过SQL命令插入到Web表单提交或者输入域名或页 ...
- SQL注入攻击的种类和防范手段
观察近来的一些安全事件及其后果,安全专家们已经得到一个结论,这些威胁主要是通过SQL注入造成的.虽然前面有许多文章讨论了SQL注入,但今天所讨论的内容也许可帮助你检查自己的服务器,并采取相应防范措施. ...
随机推荐
- Ganymed SSH-2 for Java
Ganymed SSH-2 for Java是一个纯Java实现的SHH2库,官网为http://www.ganymed.ethz.ch/ssh2/,最新的更新时间为2006年10月,在用之前,请仔细 ...
- 鸭子类型duck typing(动态)
在程序设计中,鸭子类型(duck typing)是动态类型的一种风格.在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由当前方法和属性的集合决定.这个概念的名字来源于由Ja ...
- eclipse上传显示svn上传者名
这里来记录下eclipse上传显示svn上传者名. 如图所示,修改即可.
- Asp.net 上传文件小叙(修改FileUpload显示文字等)
想要在asp.net网站上上传文件就得用到FileUpload,可是这个控件中“浏览”没法修改,可以使用html中<input type="file" 来解决该问题. 首先页 ...
- RazorEngine在非MVC下的使用,以及使用自定义模板
---恢复内容开始--- RazorEngine模板引擎大大的帮助了我们简化字符串的拼接与方法的调用,开源之后,现在在简单的web程序,winform程序,甚至控制台程序都可以利用它来完成. 但如何在 ...
- [python]魔术方法
一.初始化: 1.__new__方法,初始化过程中第一个用到的方法(用处不大). 2.之后,__init__方法,构造方法. 3.最后,在对象回收时,调用__del__方法.如果解释器退出时,对象还存 ...
- Cesium的api之关于viewer
1.viewer是用来构建三维的主要的部件:通过创建viewer可以完成三维的图片.地形的展示等 2.属性 * @param {Element|String} container :指定的是在html ...
- 【笔记】mongodb启动不了:child process failed, exited with error number 100
今天在启动mongodb的时候,发现起不来,报错:child process failed, exited with error number 100然后先去/var/log/mongo/mongod ...
- RIME输入法
RIME输入法 1.可以输入汉语拼音. (1) RIME内置的「地球拼音」可以在选择完字之后按下「Shift+Enter」键,直接输入汉语拼音,并且是带声调的. (2) 自己配置汉语拼音方案. 2.五 ...
- [USACO1.1.4]坏掉的项链Broken Necklace
P1203 [USACO1.1]坏掉的项链Broken Necklace 标签 搜索/枚举 USACO 难度 普及- 题目描述 你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N&l ...