共计 2485 个字符,预计需要花费 7 分钟才能阅读完成。
文章目录
1. 明确 web 攻打的危害。
2. 分享常见的 3 种攻打与对应的进攻办法
1.web 攻打的危害。
web 攻打有什么危害呢?
水平较轻微的攻打,或者会从你的网站上窃取到用户的信息。重大的 web 攻打能够删库,让网站瘫痪等等严重危害。
2. 分享攻打类型:sql 注入,xss,csrf 攻打
在此先分享 3 种攻打类型:sql 注入,XSS 攻打,csrf 攻打
2.1 sql 注入
什么是 sql 注入?
原本用户传了个 id 参数过去。如果咱们没有预防的话,产生 sql 注入。
举个例子。用户传了个 uid 参数(用户 id),个别状况下就会呈现,会传一个整数,比方:1
$uid = $_GET[‘uid’];//1
select * from member where id = $uid
这个 sql 没问题。
如果黑客成心穿 uid = ‘1 or 1=1’
那么 select * from member where id = 1 or 1=1;
就会查出所有用户的信息。这里简答举个例子,其实 sql 注入狠一点的还能造成更重大的问题。
在此分享两个进攻措施
1. 转化思路:对用户的提交的参数进行严格的过滤。
比方 uid 参数,咱们进行整形转化。$uid = intval($_GET[‘uid’]);//1 or 1= 1 会转化为 1。
框架中,用框架封装好的办法查问。不要本人写原生语句查问。框架底层会主动过滤参数,能够避免 sql 注入。如果有些场景要本人写原生语句时,本人肯定要过滤好参数。
2. 应用 mysql 的预处理机制 (也叫参数化查问)。
其实 sql 注入的基本问题是 mysql 执行语句时,是执行一条 sql 后间接返回数据的。这样子,只有 sql 有问题,就会呈现 sql 注入。如果拆开两条的话。
1. 而且一条有 sql 注入的 sql 语句,通过预处理后就会被拆成两条没有 sql 注入的语句。2. 还能够有一次机会给 mysql 校验和本义。比方执行了第一句预处理的 sql 后(`id` = :ThinkBind_1_454319113_),mysql 就晓得,你查的话是 id 字段,所以你第二条 sql 的数据,必须是数字。如果不是数字 mysql 就抛异样
上面以 thinkphp 为例子。
这样子有问题的 sql,被拆成两条 sql 独自执行,就不会呈现 sql 注入的问题。
比方:SELECT id
,name
FROM uf_member
WHERE id
= 12052 or 1 = 1
// 拆成第一条:SELECT `id`,`name` FROM `uf_member` WHERE `id` = :ThinkBind_1_454319113_
执行完第一条后,mysql 会期待你参数的传入。此时传入第二条 sql(是一些参数)
// 第二条:array(1) {["ThinkBind_1_454319113_"]=>
array(2) {[0]=>
string(14) "12052 or 1 = 1"
[1]=>
int(1)
}
即便是有 sql 注入问题,独自运行这条 sql 参数的话,也不会产生什么危害。
上面是一些演示的代码
// 没有进行预处理的版本,会被 sql 注入
header('content-type:text/html;charset=utf-8');
$username=$_POST['username'];
$psw=$_POST['psw'];
try {$pdo=new PDO('mysql:host=localhost;dbname=test','root','root');
$sql="select * from user where username='{$username}'and password='{$psw}'";
$stmt=$pdo->query($sql);// 返回后果集中的行数 echo
$stmt->rowCount();} catch (Exception $e) {echo $e->getMessage();
}
// 进行了预处理,能够避免 sql 注入
header('content-type:text/html;charset=utf-8');
$username=$_POST['username'];
$psw=$_POST['psw'];
try {$pdo=new PDO('mysql:host=localhost;dbname=test','root','root');
$sql="select * from user where username=? and password=?";
$stmt=$pdo->prepare($sql);
$stmt->execute(array($username,$psw));
echo $stmt->rowCount();} catch (Exception $e) {echo $e->getMessage();
}
2.2 XSS(Cross Site Scripting)缩写为 CSS,但这会与层叠样式表(Cascading Style Sheets,CSS)的缩写混同。所以个别称把跨站脚本攻打缩写为 XSS。
相似于 sql 注入,相当于 html 注入。在提交给服务器的 html 中,注入一段脚本。
XSS 即(Cross Site Scripting)中文名称为:跨站脚本攻打。XSS 的重点不在于跨站点,而在于脚本的执行。
那么 XSS 的原理是:歹意攻击者在 web 页面中会插入一些歹意的 script 代码。当用户浏览该页面的时候,那么嵌入到 web 页面中 script 代码会执行,因而会达到歹意攻打用户的目标。那么 XSS 攻打最次要有如下分类:反射型、存储型、及 DOM-based 型。反射性和 DOM-baseed 型能够归类为非持久性 XSS 攻打。存储型能够归类为持久性 XSS 攻打。
举个例子, 就好了解了
比方失常的用户名是张三李四啥的。如果黑客把用户名设置为“<script>while (true) alert(“this is xss”);}</script>”的话,在浏览器显示用户名的时候,会始终死循话弹出输入框。还有更重大的 xss 脚本能够入侵数据库等。
如果没有富文本编辑器的状况,能够应用转化的思维,用户 htmlspecialchars 函数,对数据进行转化。能够避免大部分 xss 攻打。但其实这个函数不能齐全防住 xss。