sql注入与防范 | 青训营笔记

205 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 6 天。

大作业里有涉及到sql注入的相关的评分点,今天对相关的概念和防范措施进行一个学习的整理。

1. SQL注入攻击

SQL注⼊攻击是Web开发中最常见的⼀种安全漏洞。可以⽤它来从数据库获取敏感信息等⼀系列恶意操作。

他的主要原理是通过前端将恶意数据或代码传送到服务器,恶意代码拼接到sql语句中作为sql语句的一部分被执行时,会改变原有的逻辑,从而轻则产生错误数据,重则会导致脱库甚至删库的风险使得数据库受损,甚⾄有可能获取数据库乃⾄系统⽤户最⾼权限。

以一个简单的用户登录举个例子,可能的前端代码如下:

<form action="/login" method="POST">
<p>Username: <input type="text" name="username" /></p>
<p>Password: <input type="password" name="password" /></p>;
<p><input type="submit" value="登陆" /></p>
</form>;

后端代码可能是这样的:

username:=r.Form.Get("username")
password:=r.Form.Get("password")
sql:="SELECT * FROM user WHERE username='"+username+"' AND password='"+password+"'"

如果⽤户的输⼊的⽤户名如下,密码任意:
myuser' or 'foo' = 'foo' --
那么我们的SQL变成了如下所⽰:
SELECT * FROM user WHERE username='myuser' or 'foo'=='foo' --'' AND password='xxx'

在MySQL⾥⾯-- 是注释的标记,这意味着用户在不知道合法用户名和密码的情况下就成功进行了登录。这还只是最简单的例子,严重的SQL攻击会导致更严重的后果。

2. SQL注入的防范措施

  1. 严格限制Web应⽤的数据库的操作权限,给此⽤户提供仅仅能够满⾜其⼯作的最低权限,对用户进行分级管理,严格控制用户的权限等级。
  2. 检查输⼊的数据是否具有所期望的数据格式,严格限制变量的类型。
  3. 生成SQL语言时,严禁将变量直接写入到SQL语句,必须通过设置相应的参数来传递相关的变量,从而抑制SQL注入。
  4. 在应⽤发布之前建议使⽤专业的SQL注⼊检测⼯具进⾏检测。
  5. 避免⽹站打印出SQL错误信息,⽐如类型错误、字段不匹配等,把代码⾥的SQL语句暴露出来,以防⽌攻击者利⽤这些错误信息进⾏SQL注⼊。