SQL是Structured Query Language(结构化查询语言)的缩写。SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言。在使用它时,只需要发出“做什么”的命令,“怎么做”是不用使用者考虑的。SQL功能强大、简单易学、使用方便,已经成为了数据库操作的基础,并且现在几乎所有的数据库均支持SQL。
概述
??sql注入就是利用某些数据库的外接接口将用户数据插入到实际的数据库操作语言当中,从而达到入侵数据库乃至操作系统的目的。在安全领域,我们永远不要信任用户的输入
,我们必须认定用户输入的数据都是不安全的,我们都需要对用户输入的数据进行过滤处理。没有(运行时)编译,就没有注入。
所以从根本上防止上述类型攻击的手段,还是避免数据变成代码被执行,时刻分清代码和数据的界限。而具体到SQL注入来说,被执行的恶意代码是通过数据库的SQL解释引擎编译得到的,所以只要避免用户输入的数据被数据库系统编译就可以了。
??与其他数据库不同,MySQL可以运行在不同的SQL Mode(SQL服务器模式)下,并且可以为不同客户端应用不同模式。这样每个应用程序可以根据自己的需求来定制服务器的操作模式。模式定义MySQL应支持哪些SQL语法,以及应执行哪种数据验证检查。这有点类似于apache配置不同级别的错误日志,报告哪些错误,又不报告哪些错误。
SQL注入
1.注入实例
//php代码
$unsafe_variable = $_POST['user_input'];
mysql_query("INSERT INTO `table` (`column`) VALUES ('{$unsafe_variable}')");
当post中代码如下时候:
value'); DROP TABLE table;--
查询代码变成
INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')
这样会直接删除table表,你的数据被破坏了。
2.防止sql注入
方法一
prepareStatement+Bind-Variable:SQL语句和查询的参数分别发送给数据库服务器进行解析。
对于php来说有两种实现方式。
//使用PDO(PHP data object)
$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');
$stmt->execute(array('name' => $name));
foreach ($stmt as $row) {
// do something with $row
}
//使用mysql扩展-mysqli
$stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?');
$stmt->bind_param('s', $name);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
// do something with $row
}
方式二
对查询语句进行转义(最常见的方式):使用应用程序提供的转换函数。
关键词:sql注入案例以及如何防sql注入