美文网首页网络安全
谈谈sql注入与XSS跨站攻击

谈谈sql注入与XSS跨站攻击

作者: 胡乱唱歌ing | 来源:发表于2019-01-17 10:45 被阅读106次

sql注入

概述:sql注入可以理解为入侵者通过sql语法漏洞来改变原sql执行语句来达到某种目的的行为。
举个例子:我们验证用户登陆的大多数sql差不多都是这样子写是由用户输入的

$sql = " select * from user where username = '{$username}' and password='{$password}' ";

假如用户输入username的值为:admin' or 1=1 -- password:123
那么后台组装成的sql为


image.png
$username = $_GET['username'];
$password = $_GET['password'];
$sql = " select * from user where username = '{$username}' and password='{$password}' ";
echo $sql;
//select * from user where username = 'admin ' or 1=1 -- ' and password='123456' 

此sql在数据库执行得到的结果是整个用户表,这就是所谓的万能钥匙。


image.png

解决办法

  1. addcslashes 函数对特殊字符转义
<?php 
#对数组进行递归转义处理
function addslashes_deep($value)
{
    return is_array($value)?array_map("addslashes_deep",$value):addslashes($value);
    
}
#是否开启了转义避免重复转义
if(!get_magic_quotes_gpc())
{
    $_GET = addslashes_deep($_GET);
}
$username = $_GET['username'];
$password = $_GET['password'];
$sql = " select * from user where username = '{$username}' and password='{$password}' ";
echo $sql;
//select * from user where username = 'admin\' or 1=1 -- ' and password='123'

2.使用mysqli的 real_escape_string函数

$mysqli = new mysqli("127.0.0.1", "root", "root", "yii2advanced");

/* 检查连接 */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}
$username = $_GET['username'];
$password = $_GET['password'];

$username = $mysqli->real_escape_string($username);
$password = $mysqli->real_escape_string($password);
$sql = " select * from user where username = '{$username}' and password='{$password}' ";
echo $sql;
//select * from user where username = 'admin\' or 1=1 -- ' and password='123'

3.使用mysqli/PDO 的预处理

XSS跨站攻击

概述:XSS跨站攻击是指入侵者往目标服务器注入可执行脚本来达到某种目的的行为。

如:让页面弹个OK


image.png

如:让页面加载一个恶意的js脚本


image.png

解决办法

1.使用htmlspecialchars函数单会把所有的html,js标签转义,如果我们的文本域原本就是要求用户输入html代码的则此函数不适用
2.使用第三方库htmlpurifier
参考http://htmlpurifier.org/docs

<?php 
require_once './htmlpurifier-4.10.0/library/HTMLPurifier.auto.php';

$config = HTMLPurifier_Config::createDefault();
$purifier = new HTMLPurifier($config);
$clean_html = $purifier->purify($_GET['username']);
echo $clean_html;

只会过滤掉恶意的脚本


image.png

相关文章

网友评论

    本文标题:谈谈sql注入与XSS跨站攻击

    本文链接:https://www.haomeiwen.com/subject/admbdqtx.html