WEB安全解决方案一之SQL注入防范
一、SQL注入防范
在一个WEB动态页面中(例如aspx或者jsp),这个页面允许用户在输入框中输入字符,这个字符可以被引入到数据库中去进行查询(这里的查询是通用的说法,实际上包括了增删改查)操作。一个黑客在这个输入框中输入了一个畸形查询字符串,从而改变了原有的查询,这可以被用来插入,改变,或损害后台数据库。怎么可能呢?请看下面的例子。
以登陆为例,后台代码通过构造SQL语句“select * from user where username = 'txtUserName.Text.Trim() 'and password ='txtPwd.Text.Trim()';如果用户在输入框中输入用户名为admin'or'1'='1, 让后任意输入比如123为密码,则后台执行的SQL语句为select * from user where username='admin'or'1'='1'and password='123';这是,无论密码是否正确,最终SQL语句查询结果都不为空,这便是一个典型的SQL注入攻击,通过此种方式,攻击者成功绕过密码验证,登陆系统。一个典型的解决方案是构造“select count(*) from user where username='txtUserName.Text.Trim() 'and password = 'txtPwd.Text.Trim()'这样的SQL语句,这样如果攻击者采取上述攻击方式,则会因为返回的count值大于1而验证失败。
但问题并不会因此结束,如果攻击者构造如下的攻击语句呢?比如“select count(*) from user where username=’txtUserName.Text.Trim() ‘--and password =’txtPwd.Text.Trim’,注意加粗的部分实际上是被注释掉了,也就是说验证将会成功。更厉害的,攻击者会构造出“select count(*) from user where username ='txtUserName.Text.Trim() ';drop table user ;--’ and password ='txtPwd.Text.Trim';注意到不仅验证通过,而且user表被删除,这下子谁都不要想再登陆了。
类似的,黑客们通过精巧的构造,可以达到绕过密码认证,修改破坏关键数据,乃至获取系统完全控制权的目的。这里你也许会问攻击者如何得到数据库中的表名和字段,这里一种方法是暴力破解,根据规律尝试,比如系统多存在user表,用来存放用户信息。另外一种方法是利用SQL注入攻击猜解,通过构造一些能够使数据库产生错误信息的SQL语句,获取数据库的敏感信息,进行表名和字段的猜解,密码破解等。
解决方法
1. 避免使用动态生成的SQL语句
通过字符串相加的方式动态生成的SQL语句正是SQL注入的万恶之源,
相关文档:
,SQL有个超级用户sa,此用户默认情况下,它指派给固定服务器角色 sysadmin,并不能进行更改。一般懂点安全问题的技术人员都会把这个密码修改掉,但修改再复杂的密码都不是绝对安全的,一些暴力破解软件,菜鸟都会用。
那怎么办呢,最好的办法就是删除或改名,下面提供方法.
修改SA用户名:
一:在企业管理器中右击:(lo ......
用SQL查询分析器操纵Excel及导入导出数据
http://www.delphibbs.com/keylife/iblog_show.asp?xid=32983
SQL SERVER 和EXCEL的数据导入导出
通常的方法是使用图形界面的dts工具,但发觉有些使用命令行界面的方式更简单
1、在SQL SERVER里查询Excel数据:
-- ======================================================
SE ......
今天在调试的过程中发现 在vb中拼SQL的时候发现"()" 作用很大
eg: table: T_TEST col : T_KB int ,S_CD int ,Z_SU int
dim gcstrT_1 ,gcstrT_3 as integer
gcstrT_1 = 1
gcstrT_3 = 3
strWhere = strWhere & "……"
strWhere = strWhere & "AND ((T_K ......
1 TOP
这是一个大家经常问到的问题,例如在SQLSERVER中可以使用如下语句来取得记录集中的前十条记录:
SELECT TOP 10 * from [index] ORDER BY indexid DESC;
但是这条SQL语句在SQLite中是无法执行的,应该改为:
SELECT * from [index] ORDER BY indexid DESC limit 0,10;
其中limit 0,10表示从第0条记录开始,往后 ......