SQL注入简介
SQL注入(英语:SQL injection),也称SQLI或SQL注码,是发生于应用程序与数据库层的安全漏洞。简而言之,是在输入的字符串之中注入SQL指令,在设计不良的程序当中忽略了字符检查,那么这些注入进去的恶意指令就会被数据库服务器误认为是正常的SQL指令而执行,因此遭到破坏或是入侵。
产生原因
SQL注入漏洞产生的原因是网站应用程序在编写时未对用户提交至服务器的数据进行合法性校验(类型、长度、业务参数合法性、敏感字符等),同时没有对用户输入数据进行有效地特殊字符过滤,使得用户的输入直接带入数据库执行,超出了SQL语句原来设计的预期结果,导致了SQL注入漏洞。
实例代码
<?php
$conn = mysqli_connect($servername, $username, $password, $dbname);
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
$username = @$_POST['username'];
$password = @$_POST['password'];
$sql = "select * from users where username = '$username' and password='$password';";
$rs = mysqli_query($conn,$sql);
if($rs->fetch_row()){
echo "success";
}else{
echo "fail";
}
?>
户名username和密码password均来自于用户的直接传入,无任何过滤,后直接拼接到SQL语句中。
正常用户登录时,sql语句如下:
select * from users where username = 'admin' and password='password'
攻击者尝试登陆,输入用户名admin' or '1' = '1,输入密码123,因为是直接拼接,所以构造出的sql语句如下:
select * from users where username = 'admin' or '1' = '1' and password='123'
此时因为sql语句中存在or '1'='1',所以永为真,将会查询出所有的结果,也就会登录成功返回success。(这也是常说的万能密码之一)