【从零开始】WEB后端php学习(3) -- 防SQL注入和XSS攻击--2019(HNU-MSC)

作为web开发人员,我们首先应当知道,不应当相信所有用户提交的数据,即,默认 用户提交的所有数据,我们都应将其视为恶意代码数据,应当对其进行相关处理,再进行数据的解析。


我们从php的学习开始,从几个小小的实例,分析一下可能的攻击


首先我们先了解一下两种比较常见的攻击

sql注入

sql注入,从名字来看,不难理解为,通过SQL语句,通过注入某些东西的手段,达到自己的目的

官方解释如下:
所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达骗服务器执行恶意的SQL命令。

SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统

我们本地数据库目前有数据如下
初数据
我们写基于菜鸟教程第一版的php如下

<?php
    $servername = "localhost";
    $username = "root";
    $password = "";
    $database="sql_test";
    // 创建连接
    $conn = new mysqli($servername, $username, $password,$database);
     
    // 检测连接
    if ($conn->connect_error) {
        die("连接失败: " . $conn->connect_error);
    } 
    $sql = "SELECT id, name, password FROM sql_attack";
    $result = $conn->query($sql);
    
    if ($result->num_rows > 0) {
        // 输出数据
        while($row = $result->fetch_assoc()) {
            echo "id: " . $row["id"]. " - Name: " . $row["name"]. " " . $row["password"]. "<br>";
        }
    } else {
        echo "0 结果";
    }
    $conn->close();
?>

可见,本php访问结果是,遍历输出所有数据库中的内容,
我们在浏览器跑本php结果如下
1
观察到,和我们想象中一样。
此时,我们不妨再写一个存入数据库的php文件

<?php
    $servername = "localhost";
    $username = "root";
    $password = "";
    $database="sql_test";
    // 创建连接
    $conn = new mysqli($servername, $username, $password,$database);
     
    // 检测连接
    if ($conn->connect_error) {
        die("连接失败: " . $conn->connect_error);
    } 
    $name=$_GET['name'];
    $password=$_GET['password'];
    $sql = "INSERT INTO sql_attack ( name, password)
    VALUES ('$name','$password')";
    if ($conn->query($sql) === TRUE) {
        echo "新记录插入成功";
    } else {
        echo "Error: " . $sql . "<br>" . $conn->error;
    }

get方式和post方式传参,是一样的效果,达到我们想要的效果即可,测试add成功
目前,数据库数据如下
2
现在我们开始模拟sql攻击
为了直观看出区别,我们略微修改第一个select的部分代码如下

$id = $_POST['id'];
$sql = "SELECT  name, password FROM sql_attack WHERE id='$id' and password ='asd'";

目前模拟执行如下,
3
现在,我们往数据库添加一个新的数据,

name = " 1 ’ or 1=1 #";
password = 1;
4
我们观察到,id为5,我们进行如下请求
在这里插入图片描述
id为5的password 和 asd 不匹配,因此,返回0.
但是,当我们提交id 为 5’#
在这里插入图片描述
看到,结果被返回了,这样想,如果不是5,换另外一个数,也可以被同步返回!

安全问题!暴露!

(甚至如果嵌入其他SQL代码,问题就大了)!!

分析一下,原因

打印一下sql语句,发现sql语句变成了
在这里插入图片描述
可能还不太显眼,放到php中,加个颜色,

SELECT name, password FROM sql_attack WHERE id='5'#' and password ='asd'

看到,原来#让它之后的语句被注释了,就相当于没作用!

从小小的实例,我们发现了它的原理,进行原理的推断,防sql注入,可以采用数据的检验,如果不是文本字段,QQ号,手机号,姓名,肯定是没有# ’ ,这种特殊符号,因此,可以进行简单的逻辑判断。

防御:

采用 预处理 的方法

原理是,先执行 SQL语句,再填参数,顺序变化,进行防御。

实例代码如下

	$sql = " Insert test SET title=? , u_url=? , content=? WHERE id=? " ;
    $stmt=$conn->prepare($sql);
    $stmt->bind_param("sssi", $title, $u_url, $content,$id);
    $stmt->execute();

其余代码,类似不再举例(举一反三,修改参数,自己测试,动手>看别人的结果)


XSS攻击

XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序

我们依然以一个最简单的实例来查看

<?php
    echo $_GET['name'];

ok,非常简单的例子
在这里插入图片描述
进行如上输入,就输出了错误的情况

如果嵌入代码,是破坏性更严重的代码,各种数据就可能泄露!

防御:

echo htmlspecialchars($str);

采用该函数,即可得到比较有效的防御


具体不再进行安全测试,本文章主要给萌新提供一种思路和解析情况,具体了解,请具体参照官方文档,安全第一!

Tips:
第一个php文件中,直接将数据库的各种信息暴露了,不如再看看如何在另一个文件中写,再引入该文件

(时间紧迫,思绪比较混乱,如有错误,请留言,谢谢)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值