龙空技术网

sql注入浅析

一起web编程 137

前言:

眼前兄弟们对“mysql sql注入”大致比较注重,你们都需要学习一些“mysql sql注入”的相关文章。那么小编同时在网摘上搜集了一些有关“mysql sql注入””的相关资讯,希望你们能喜欢,兄弟们快快来学习一下吧!

Sql注入是一个老问题了,虽然现在的主流前后端框架都已经处理了此问题,但是弄明白原理有利于我们更好的分析解决问题;

SQL注入:

看下面简单的登录示例

<body>  <div class="content">		<form enctype="multipart/form-data" method="POST" action="server.php">		<input type="text" name="username" value="" placehold="用户名">		<input type="password" name="password" value="" placehold="密码">     <input type="submit" value="登录" /> </form>   </div> </body>

服务端代码:

<?php $name = $_POST['username'];$password = $_POST['password'];$conn = new mysqli('localhost', 'root', 'root@2022');if($conn->connect_errno){	echo "mysql连接错误" . $conn->connect_errno;}$conn->query('set names "utf8"');$conn->select_db('fd_test1');$sql = "select * from fd_admin where username='" .$name. "' and password= '" . $password . "'";echo $sql;$rs = $conn->query($sql);if(!$rs){	echo 'sql 错误' . $conn->error;}else{	if(mysqli_num_rows($rs)){		$row = $rs->fetch_assoc();		echo $row['username'] . '登录成功';	}else{		echo '用户不存在';	}	}?>

数据表结构:

表结构

我们输入admin和123456,是可以登录成功的;生成的sql如下:

select * from fd_admin where username='admin' and password= '123456'

如果输入admin' or '1'='1 ,

生成的sql为:

select * from fd_admin where username='admin' or '1'='1' and password= '12345678'

虽然密码不正确,但还是执行成功了,登录成功,这就是简单的sql注入的原理;

当然,这是最简单的情况,我们也是为了演示原理,实际情况肯定不这复杂很多,而且现在后端服务开发,基本都是使用框架,也很少直接拼接sql来执行,框架已经对sql进行了处理,一般不会有sql注入情况,这也是为什么我们推荐使用框架来开发的原因。

但是也有少量特殊情况,需要手动写sql代码,这时就要注意了,下面说下如何避免sql注入:

前端:

前端界面直接给用户使用,永远不要相信用户的输入,所以前端要做好数据验证,前端验证的原则就是,让用户输入的数据类型、格式等尽量符合系统的要求,对不规范的数据进行提示和过滤,前端避免sql注入最基本的方法是过滤,Escape函数:

escape("admin' or '1'='1");

服务器获取到

"admin%27%20or%20%271%27%3D%271"

服务器端获取到需要做处理;

后端:

有些后端开发,认为加了前端验证就不需要后端了,增加代码量还容易出问题,其实

前端验证更多的为了限制普通用户的不规范使用,通过页面能发现的漏洞有限;而且前端验证是可以绕过的,绝大部分攻击者都是通过工具进行的,通过工具直接访问接口、获取数据,这样前端验证就失效了,所以后端面对的是更专业的人士,所以后端的安全防护显得更加重要。

书归正传,后端防护涉及面很广,今天只说下sql注入,mysqli类库执行查询前先绑定

修改后的代码如下:

$sql = "select * from fd_admin where username=? and password= ?";$stmt = $conn->prepare($sql);$stmt->bind_param("ss", $name, $password);$rs = $stmt->execute();if(!$rs){echo 'sql 错误' . $conn->error;}else{$result = $stmt->get_result();while ($row = $result->fetch_array(MYSQLI_NUM)) {echo '登录成功';print "\n";}}

除了代码层面,MySQL使用独立用户,并分配最小权限等,也能有效防治sql问题;

标签: #mysql sql注入