文章目录

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参数的话,也不会产生什么危害。

下面是一些预处理演示的代码

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。

如果用户提交的数据是有富文本编辑器的话,含有html标签是正常的,此时不能用转化的思想了。应该使用过滤的思想。此时我们用htmlpurifier(第三方包)的remove_xss函数即可。

composer require ezyang/htmlpurifier

富文本编辑器内容,使用过滤的思想进行处理。

2.3 csrf攻击(CSRF(Cross-site request forgery),中文名称:跨站请求伪造)
什么是csrf攻击?看下图的顺序。1,2,3,4

image.png
比如上图中的招行网站收到一个来自钓鱼网站的表单请求。其实这个请求不是来自招行的网站,但用户被钓鱼网站诱导了,在钓鱼网站输入了对应的账号密码,并携带这样账户信息对真正的招行请求。如果没有防范的话钱,就被黑了。
防范措施:我们对应每个表单填充一个唯一的标识即可。一般的做法是给表单生成一个唯一的token。laravel框架中

Laravel提供了一个全局帮助函数csrf_token来获取该Token值,因此只需在视图提交表单中添加如下HTML代码即可在请求中带上Token:
<input type="hidden" name="_token" value="<?php echo csrf_token(); ?>">
<input type="hidden" name="_token" value="{{csrf_token()}}">

表单,带一个token即可。

在thinkphp中的话,也同理。在ThinkPHP中称之为表单令牌。

好啦,下一篇我们分享cookies安全,前端点击劫持,传输层数据安全问题。

本文为夜雨闻铃原创文章,转载无需和我联系,但必须注明文章出处!!!
文章出处:夜雨闻铃的思否文章(https://segmentfault.com/a/11...)


夜雨闻铃
50 声望12 粉丝

分享和记录自己成长之路遇到学习到的经验和遇到的坑(偏php和go)。为了更好更活跃的社区,尽一份自己的微薄之力。