防范Sql注入式攻击

       Sql注入式攻击是指利用设计上的漏洞,在目标服务器上运行Sql 命令以及进行其余方式的攻击

动态生成Sql命令时没有对用户输入的数据进行验证是Sql注入攻击得逞的主要缘由
好比一个在线书店,能够根据用户的输入关键字搜索相关的图书。
html

string name = GetUserInput("BookName"); string script = "select table_book where book_name like '%" + name + RunSql(script) RunSql(script);

若是sql

name= "'; select @@servername where ''='";

这样就能够获得DB Server的名字.
还以在线书店为例,用户只有登录后才能察看本身的账户信息,这样作是不容置疑的,然而用户验证的代码以下
shell

//id和password直接来自用户的输入。未作处理
数据库

string id = GetUserInput("UserID"); string password = GetUserInput("UserPassword"); tring script = "select * from table_user where User_ID = '" + id + "' and User_Password? = '" + password + "' "; RunSql(script);

若是用户输入的password为“' or ''=' ”,那么生成的script就为:安全

select * from table_user where User_ID = 'UserID' and User_Password = '' or ''=''

这样一来,即便不知道用户的密码也能够察看该用户的账户信息了服务器

再好比,入侵者会把一些巧妙假装的代码嵌入到你动态生成的Sql命令中,好比:
数据库设计

Delete table_Book where 1 = 1 use master--

上面的例子都是一些简单的示例,攻击者还可能经过sql的漏洞对操做系统进行攻击,好比运行
[xp_cmdshell],[xp_regread]
spa

固然实际上的攻击没有这么简单,攻击者还会利用系统设计的其余漏洞。好比程序把数据库返回的出错信息没有进行转换就直接输出给用户看,那么攻击者就设计一些sql语句诱导系统返回须要的信息操作系统


从上面的这些例子能够看出,对数据库访问权限的设计不当,给与每个数据库链接太多的权限,甚至dbo或sa的权限,也是sql注入式攻击利用的主要漏洞之一。设计

 

防范sql注入式攻击

 

最小权限原则。特别是不要用dbo或者sa帐户,为不一样的类型的动做或者组建使用不一样的帐户,最小权限原则适用于全部与安全有关的场合

对用户输入进行检查。对一些特殊字符,好比单引号,双引号,分号,逗号,冒号,链接号等进行转换或者过滤;使用强数据类型,好比你须要用户输入一个整数,就要把用户输入的数据转换成整数形式;限制用户输入的长度等等。这些检查要放在server运行,client提交的任何东西都是不可信的

使用存储过程。若是必定要使用sq语句,那么用标准的方式组建sql语句,好比能够利用parameters对象,避免用字符串直接拼sq命令。

当sql运行出错时,不要把数据库返回的错误信息所有显示给用户,错误信息常常会透露一些数据库设计的细节

针对经常使用的sql注入式攻击方式对症下药

相关文章
相关标签/搜索