请选择 进入手机版 | 继续访问电脑版

[MsSql] 全能 暗码 的SQL注入弊端 其PHP环境搭建及防御本领

  [复制链接]
查看311 | 回复69 | 2021-9-17 13:20:26 | 显示全部楼层 |阅读模式
目次

全能 暗码 的SQL注入弊端 其PHP环境搭建及防御本领

一、环境搭建

这个渗出 环境的搭建有以下几点:

  • 基于session的会话
  • 登录界面
  • 登录成功界面
  • 注销界面
  • 数据库搭建
  • 数据库毗连

二、session会话

  • 服务器端利用 session_start()函数发起一次session的会话
  • 此时我们登录成功后用户的数据被保存在服务器端的Cookie: session= ,即sessionID
  • 假如 必要 再次访问
  • 服务器端的
    1. $_SESSION['...']
    复制代码
    会获取用户session
  • 然后与本来 存在于服务器的sessionID举行 比对,假如 比对成功,则证实 用户精确

三、环境搭建代码

1、创建数据库脚本

在MySQL中利用 source下令 即可运行脚本:

  1. drop database if exists lab;
  2. create database lab;
  3. use lab;
  4. create table users
  5. (
  6. id int not null auto_increment,
  7. username char(32) not null,
  8. passcode char(32) not null,
  9. primary key(id)
  10. );
  11. insert into users(username,passcode) values('admin','admin123');
  12. insert into users(username,passcode) values('alice','alice456');
复制代码

2、登录界面html

  1. <html>
  2. <head>
  3. <meta charset="UTF-8">
  4. <title>Login</title>
  5. <style>
  6. #a {
  7. width: 500px;
  8. text-align: center;
  9. }
  10. .b {
  11. width: 200px;
  12. height: 30px;
  13. }
  14. </style>
  15. </head>
  16. <body>
  17. <div id=a>
  18. <h2>Login!</h2>
  19. <form name="form_login" method="POST" action="check_login.php">
  20. Username:<input type="text" class="b" name="username" /><br> <br>
  21. Password:<input type="password" class="b" name="password" /><br>
  22. <input type="submit" name="Submit" value="Submit" />
  23. <input type="reset" name="reset" value="Reset" />
  24. </form>
  25. </div>
  26. </body>
  27. </html>
复制代码

3、查询数据库是否为精确 的账号暗码 php代码

  1. <?php
  2. include('con_database.php');
  3. $username=isset($_POST['username'])?$_POST['username']:'';
  4. $password=isset($_POST['password'])?$_POST['password']:'';
  5. if($username=='' || $password==''){
  6. echo "<script>alert('请输入账号和密码!')</script>";
  7. exit;
  8. }
  9. $sql="select * from users where username='$username' and passcode='$password'";
  10. $query=mysqli_query($con,$sql) or die('SQL语句执行失败'.mysqli_error($con));
  11. if ($row=mysqli_fetch_array($query)){
  12. session_start();
  13. $_SESSION['username']=$row[1];
  14. echo "<a href='welcome.php'>欢迎访问</a>";
  15. }else{
  16. echo "<script>alert('登录失败!');history.go(-1)</script>";
  17. }
  18. mysqli_close($con);
  19. ?>
复制代码

4、毗连 数据库php代码:

  1. <?php
  2. $con=mysqli_connect('127.0.0.1','root','root') or die("数据库连接失败!");
  3. mysqli_select_db($con,'lab')or die("数据库连接失败");
  4. ?>
复制代码

5、注销登录代码(即关闭session会话)

  1. <?php
  2. session_start();
  3. session_unset();
  4. session_destroy();
  5. echo "注销成功";
  6. ?>
复制代码

6、登录成功欢迎界面

  1. <?php
  2. session_start();
  3. if(isset($_SESSION['username'])){
  4. echo "欢迎用户".$_SESSION['username']."登录";
  5. echo "<br>";
  6. echo "<a href=logout.php>退出登录</a>";
  7. }else{
  8. echo "您没有权限访问";
  9. }
  10. ?>
复制代码

至此,我们的渗出 环境就构建好了

四、全能 暗码 弊端 分析

  • 用户名输
    1. 入' or 1=1 or'
    复制代码
    ,暗码 随意,发现可以登录进去
  • 暗码 输入
    1. 'or '1=1
    复制代码
    也可以登录进去

当然登录方法不止一种:

原来查询语句是如许 的:

  1. $sql="select * from users where username='$username' and passcode='$password'";
复制代码

颠末 注入之后,变成:

  1. $sql="select * from users where username='' or 1=1 or ' and passcode='****'";
复制代码

我们观察到,where后面呃字句中的username被闭合,并且字句分成三个句子并用or毗连 。
在SQL语句中 and的优先级要大于or,以是 1=1先判断 ,为真,即where后面的语句为真,即整个SQL语句为真,即表示查询精确
而形成的语句可以将整个users表查询,后面的

  1. $row=mysqli_fetch_array($query)
复制代码
选择的是查询的第一行值,如许 满意 了SQL语句并跳过了登录验证
由此可以引申出,只要where后面字句为真,即可跳过验证,有如下衍生方法:

    1. ' or 1=1 #
    复制代码
    1. ' or 1=1 --
    复制代码
    (后面有空格)
    1. 'or"="or'
    复制代码

五、全能 暗码 攻击防护

1、利用 正则表达式限定 用户输入

可以利用 正则表达式限定 用户的用户名输入,比如:/^[a-z0-9A-Z_]{5,16}$/
这个限定 了用户5位以上16位以下的字母数字下划线为用户名的输入
这个限定 在check_login.php中添加

  1. <?php
  2. include('con_database.php');
  3. $username=isset($_POST['username'])?$_POST['username']:'';
  4. $password=isset($_POST['password'])?$_POST['password']:'';
  5. if (!preg_match("/^[a-Z0-9A-Z_]{5,16}$/",$username)){
  6. echo "<script>alert('用户名格式错误')</script>";
  7. exit;
  8. if($username=='' || $password==''){
  9. echo "<script>alert('请输入账号和密码!')</script>";
  10. exit;
  11. }
  12. $sql="select * from users where username='$username' and passcode='$password'";
  13. $query=mysqli_query($con,$sql) or die('SQL语句执行失败'.mysqli_error($con));
  14. if ($row=mysqli_fetch_array($query)){
  15. session_start();
  16. $_SESSION['username']=$row[1];
  17. echo "<a href='welcome.php'>欢迎访问</a>";
  18. }else{
  19. echo "<script>alert('登录失败!');history.go(-1)</script>";
  20. }
  21. mysqli_close($con);
  22. }
  23. ?>
复制代码

2、利用 PHP转义函数

  • addslashes()函数:可以或许 将单引号、双引号、反斜杠和null转义
  • mysql_escape_string()函数、mysql_real_escape_string()函数这个是转义SQL语句中的符号,php7.x版本的都要变成mysqli
  1. $username=isset($_POST['username'])?addslashes($_POST['username']):'';
  2. $password=isset($_POST['password'])?mysqli_real_escape_string($con,$_POST['password']):'';
复制代码

3、转义函数的弊端

由于 利用 的是UTF-8编码,不是宽字节编码,形成的'会被变成%5c%27
Windows下默认的是宽字节的gbk编码
假如 在%5c前面加上一个字符形成一个复杂的汉字,那么单引号仍然 会被输出

六、MySQLi 参数化查询

在利用 参数化查询的环境 下,服务器不会将参数的内容是为SQL指令中的一部分
而是在数据库完成SQL指令的编译之后,再代入参数运行
此时就算参数内里 有恶意数据
但是此时SQL语句以及编译完成
就不会被数据库运行

PHP提供了三种访问mysql数据库的拓展:

  • MySQL (PHP5.5起,已经废除)
  • MySQLi
  • PDO(PHP Data Object PHP数据对象)

PDO和MySQLi提供面向对象的api
MySQLi也存在面向过程的api,以是 容易 从MySQL转换到MySQLi

下面是mysqli情势 的check_login.php 写法,新建check_login_mysqli.php

  1. <?php
  2. include('con_database.php');
  3. $username=isset($_POST['username'])?$_POST['username']:'';
  4. $password=isset($_POST['password'])?$_POST['password']:'';
  5. if($username==''||$password==''){
  6. echo "<script>alert('错误!');history.go(-1);</script>";
  7. exit;
  8. }
  9. $sql="select * from users where username=? and passcode=? ;";//问号表示需要一个参数
  10. $stmt=$con->prepare($sql);//预编译SQL语句
  11. if(!$stmt){
  12. echo 'prepare 执行错误';
  13. }
  14. else{
  15. $stmt->bind_param("ss",$username,$password); //为预编译绑定SQL参数,ss表示两个字符串
  16. //i——int d——double s——string b——boolean
  17. $stmt->execute();
  18. $result=$stmt->get_result();
  19. $row=$result->fetch_row();
  20. if($row){
  21. session_start();
  22. $_SESSION['username']=$row[1];
  23. echo $row[1]."<a href='welcome.php'>欢迎访问</a>";
  24. }else{
  25. echo "<script>alert('登录失败!!');history.go(-1);</script>";
  26. }
  27. $stmt->close();
  28. }
  29. $con->close();
  30. ?>
复制代码

一些内容已经标记在代码的表明 内里
参数化的PHP代码真的可以或许 很有用 地防止SQL注入。

以上就是全能 暗码 的SQL注入弊端 其PHP环境搭建及防御本领 的具体 内容,更多关于全能 暗码 的SQL注入 PHP环境搭建 防御本领 的资料请关注脚本之家别的 干系 文章!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

avatar 康乃馨老太 | 2021-9-18 03:12:29 | 显示全部楼层
admin楼主,我告诉你一个你不知道的的秘密,有一个牛逼的源码论坛他的站点都是商业源码,还是免费下载的那种!特别好用。访问地址:http://www.mxswl.com 猫先森网络
回复

使用道具 举报

avatar 梨波儿 | 2021-9-18 21:31:05 | 显示全部楼层
突然觉得admin楼主说的很有道理,赞一个!
回复

使用道具 举报

avatar 岳兄弟散养家鸡 | 2021-9-20 08:34:51 | 显示全部楼层
admin楼主的帖子提神醒脑啊!
回复

使用道具 举报

avatar 123456868 | 2021-9-20 08:34:55 | 显示全部楼层
admin楼主,您提前出院了?
回复

使用道具 举报

avatar lkbt123 | 2021-9-22 12:16:20 | 显示全部楼层
楼上的刚出院吧?
回复

使用道具 举报

avatar 康乃馨老太 | 2021-9-22 12:16:23 | 显示全部楼层
这一年啥事没干,光研究admin楼主的帖子了!
回复

使用道具 举报

avatar 123456881 | 2021-9-23 20:49:34 | 显示全部楼层
经典!
回复

使用道具 举报

avatar gui57 | 2021-9-25 13:01:16 | 显示全部楼层
admin楼主,我告诉你一个你不知道的的秘密,有一个牛逼的网站,运动刷步数还是免费刷的,QQ和微信都可以刷,特别好用。访问地址:http://yd.mxswl.com 猫先森网络
回复

使用道具 举报

avatar vvvvvvyb | 2021-9-26 16:45:33 | 显示全部楼层
admin楼主的头像能辟邪啊!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则