Sql注入例子
一没有正确过滤转义字符
■SELECT * FROM users WHERE name = '\
这种代码的设计目的是将一个特定的用户从其用户表中取出,但是,如果用户名被一个恶意的用户用一种特定的方式伪造,这个语句所执行的操作可能就不仅仅是代码的作者所期望的那样了。例如,将用户名变量(即username)设置为:a' or '1'='1那么原语句就变成 SELECT * FROM users WHERE name = 'a' or 't'='t';
如果这种代码被用于一个认证过程,那么这个例子就能够强迫选择一个合法的用户名,因为赋值't'='t永远是正确的。
如果userName设置为a'; DROP TABLE users; SELECT * FROM DATA WHERE name LIKE '% 就执行以下操作:
SELECT * FROM users WHERE name = 'a'; DROP TABLE users; SELECT * FROM DATA WHERE name LIKE '%';
■ select * from [User] where username='\
password='\
比如我知道用户名为student,那么输入:student;‘--’ - -用于注释掉后面的内容,原语句就变成:
select * from [User] where username=student;--and password=;语句执行成功。
■ 其它的SQL执行不会将执行同样查询中的多个命令作为一项安全措施。这会防止攻击者注入完全独立的查询,不过却不会阻止攻
击者修改查询。 2绕过程序限制继续注入
在上文中提到,有很多人喜欢用’号测试注入漏洞,所以也有很多人用过滤’号的方法来“防止”注入漏洞,这也许能挡住一些入门者的攻击,但对SQL注入比较熟悉的人,还是可以利用相关的函数,达到绕过程序限制的目的。
有些语句包含有’号,我们举个例子来看看怎么改造这些语句:
简单的如where xtype=’U’,字符U对应的ASCII码是85,所以可以用where xtype=char(85)代替;如果字符是中文的,比如where name=’用
户’,可以用where name=nchar(29992)+nchar(25143)代替。
解决方案:
使用参数化的过滤性语句
要防御SQL注入,用户的输入就绝对不能直接被嵌入到SQL语句中。恰恰相反,用户的输入必须进行过滤,或者使用参数化的语句。
输入过滤包括过滤敏感字符,敏感数据等。可以用rstrSQL = strSQL.replace(\把\变成\
参数化的语句使用参数而不是将用户输入嵌入到语句中。在多数情况中,SQL语句就得以修正。然后,用户输入就被限于一个参数。
1使用全局文件:
再在Global文件里里加入
protected void Application_BeginRequest(Object sender, EventArgs e) {
//SQL防注入 string Sql_1 =
\clare|drop+|drop+table|creat+|creat+table\ string Sql_2 =
\r+|truncate+|char+|+char(|declare+|drop+|creat+|drop+table|creat+table\ string[] sql_c = Sql_1.Split('|'); string[] sql_c1 = Sql_2.Split('|');
if (Request.QueryString != null) {
foreach (string sl in sql_c) {
if (Request.QueryString.ToString().ToLower().IndexOf(sl.Trim()) >= 0) {
Response.Write(\警告!你的IP已经被记录!不要使用敏感字符!\ Response.Write(sl);
Response.Write(Request.QueryString.ToString()); Response.End(); break; } } }
if (Request.Form.Count > 0) {
string s1 = Request.ServerVariables[\服务器名称 if (Request.ServerVariables[\ {
string s2 = Request.ServerVariables[\接收的名称
string s3 = \
if (s1.Length > (s2.Length - 7)) {
s3 = s2.Substring(7); } else {
s3 = s2.Substring(7, s1.Length); }
if (s3 != s1) {
Response.Write(\警告!你的IP已经被记录!不要使用敏感字符!\ Response.End(); } } } }
注意:过滤关键字时要考虑到关键字的多种形式,比如:select,可能的注入词为selecT. SelEct. 等形式。
2使用参数化语句
Public model) {
StringBuilder strSql = new StringBuilder(); strSql.Append(\Academy=@Studept,Class=@Stuclass,Stu_Name=@Studentname,Stu_Sex=@Studentsex,\);
strSql.Append(\where Study_Num=@Studynum\);
SqlParameter []parameters=
bool
Updatainfo(Logindemo.Model.Studentinfo
new SqlParameter(\, SqlDbType.NChar ,10) , new SqlParameter(\, SqlDbType.NChar,10),
new SqlParameter(\, SqlDbType.NChar ,11) , new SqlParameter(\, SqlDbType.BigInt), new SqlParameter(\, SqlDbType.NChar,10), new SqlParameter(\, SqlDbType.VarChar,50)}; parameters[0].Value = model.Studept; parameters[1].Value = model.Stuclass; parameters[2].Value = model.Studynum; parameters[3].Value = model.Stutelephone; parameters[4].Value = model.Studentsex; parameters[5].Value = model.Studentname;
int rows= SqlHelper.ExecuteSql (strSql.ToString(), parameters);
if (rows > 0) {
return true; } else {
return false; }
二:Incorrect type handling
如果一个用户提供的字段并非一个强类型,或者没有实施