作为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结果如下
观察到,和我们想象中一样。
此时,我们不妨再写一个存入数据库的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成功
目前,数据库数据如下
现在我们开始模拟sql攻击
为了直观看出区别,我们略微修改第一个select的部分代码如下
$id = $_POST['id'];
$sql = "SELECT name, password FROM sql_attack WHERE id='$id' and password ='asd'";
目前模拟执行如下,
现在,我们往数据库添加一个新的数据,
name = " 1 ’ or 1=1 #";
password = 1;
我们观察到,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文件中,直接将数据库的各种信息暴露了,不如再看看如何在另一个文件中写,再引入该文件
(时间紧迫,思绪比较混乱,如有错误,请留言,谢谢)