SQL注入是什么以及如何简单的防止SQL注入

2020-02-04 15:44:13 济南网站建设
网站安全系列之SQL注入是一个漏洞,攻击者可以利用该漏洞在数据库上执行欺诈性的SQL代码,从而不管用户的权限如何,都可以访问,修改或删除数据。成功的注入攻击可以允许篡改帐户,创建具有管理员权限的帐户,访问服务器的所有数据或对数据进行修改/破坏以使其无法使用。
当用户输入传递到可以更改查询方向的基础SQL查询时,就会出现此漏洞。例如,在下面的代码中,该代码应列出所有具有特定名称(userName)的用户,并且这些代码均来自HTML表单:
语句=“ SELECT * FROM用户,其中name ='” + userName +“';”
如果用户输入正确的名称,它将按预期工作。但是,恶意用户可以完全通过更改此SQL查询的含义来获得以下查询,只需添加以下粗体字作为名称即可,此修改后的查询将创建一个有效的SQL查询,该查询将删除该SQL查询的名称。表格,users然后选择表格中的所有数据userinfo(显示每个用户的信息)。由于注入的文本('a';)的开始将完成原始查询(这' 是在SQL中用于分隔文本字符串的符号),因此所有这一切都成为可能。
SELECT * FROM users where where name =' a'; DROP TABLE users; SELECT * FROM userinfo WHERE't'='t ';
避免这种攻击的方法是确保从用户传输到SQL查询的任何输入都不会更改此查询的性质。一种方法是在SQL中具有特殊含义的情况下,从用户输入中转义所有字符。
注意:SQL查询将符号'作为文本字符串的开头和结尾。通过添加字符,我们将“转义”该符号,并告诉SQL将其视为字符串的简单部分。
在下面的请求中,我们对字符'进行了转义。因此,SQL将把完整的字符串(粗体)解释为一个名称(确实是一个奇怪的名称,但无害)。
SELECT * FROM users where where name =' a '; DROP TABLE users; SELECT * FROM userinfo WHERE 't '= 't' ;
网站框架通常负责为您转义这些字符。例如,Django确保从用户传递到模型的任何输入均被转义。
 
下面介绍一些简单的防止sql注入的方法
 
SQL注入的主要原因是程序没有严格过滤用户输入的数据,导致非法数据侵入系统。
 
1) 对用户输入的特殊字符进行严格过滤,如’、”、<、>、/、*、;、+、-、&、|、(、)、and、or、select、union。
2) 使用参数化查询(PreparedStatement),避免将未经过滤的输入直接拼接到SQL查询语句中。
3) Web应用中用于连接数据库的用户与数据库的系统管理员用户的权限有严格的区分(如不能执行drop等),并设置Web应用中用于连接数据库的用户不允许操作其他数据库。
4) 设置Web应用中用于连接数据库的用户对Web目录不允许有写权限。使用Web应用防火墙。

SQL注入

相关文章