2

总结常见web安全问题(分享常见的12攻击类型与防御措施)第一篇

 2 years ago
source link: https://segmentfault.com/a/1190000040995044
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK