sql注入
概述:sql注入可以理解为入侵者通过sql语法漏洞来改变原sql执行语句来达到某种目的的行为。
举个例子:我们验证用户登陆的大多数sql差不多都是这样子写是由用户输入的
$sql = " select * from user where username = '{$username}' and password='{$password}' ";
假如用户输入username的值为:admin' or 1=1 -- password:123
那么后台组装成的sql为

$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在数据库执行得到的结果是整个用户表,这就是所谓的万能钥匙。

解决办法
- 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

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

解决办法
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;
只会过滤掉恶意的脚本

网友评论