这种代码的设计目的是将一个特定的用户从其用户表中取出,但是,如果用户名被一个恶意的用户用一种特定的方式伪造,这个语句所执行的操作可能就不仅仅是代码的作者所期望的那样了。例如,将用户名变量(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 W
HERE name LIKE '%';
select * from [User] where username='"+name+"' and password='"+pwd+"'";
比如我知道用户名为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 = place("'","''")"'"变成"''" 参数化的语句使用参数而不是将用户输入嵌入到语句中。在多数情况中,SQL语句就得以修正。然后,用户输入就被限于一个参数1drop table if exists user使用全局文件:
再在Global文件里里加入
protected void Application_BeginRequest(Object sender, EventArgs e)
{
/
/SQL防注入
string Sql_1 = "exec|insert+|select+|delete+|update+|count|chr|mid|master+|truncate|char|declare|drop+|drop+table|creat+|creat+table";
string Sql_2 = "exec+|insert|insert+|delete+|update+|count(|count+|chr+|+mid(|+mid+|+master+|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["SERVER_NAME"].Trim();//服务器名称
if (Request.ServerVariables["HTTP_REFERER"] != null)
{
string s2 = Request.ServerVariables["HTTP_REFERER"].Trim();//http接收的名称
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 bool Updatainfo(Logindemo.Model.Studentinfo model)
laravel migration 默认值
« 上一篇
oraclepartition维护操作()
下一篇 »

发表评论

推荐文章

热门文章

最新文章

标签列表