sql注入攻击

白开水__学者 2014-07-11 10:51:30
第一种:
DAL层
public DataTable DengLu()
{
StringBuilder sql = new StringBuilder();
sql.Append("select * from T_manager");
return DAL.DbHelper.ChaXun(sql.ToString());
}

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
后置代码
private void btn_OK_Click(object sender, EventArgs e)
{
if (txt_M_id.Text.Trim() == "")
{
MessageBox.Show("请输入登陆账号!!!", "系统消息");
txt_M_id.Focus();
}
else if (txt_M_pass.Text.Trim() == "")
{
MessageBox.Show("请输入登陆密码!!!", "系统消息");
txt_M_pass.Focus();
}
else
{
BLL.T_manager bll = new BLL.T_manager();
DataTable dt = bll.DengLu();
for (int i = 0; i < dt.Rows.Count; i++)
{
if (txt_M_id.Text == dt.Rows[i]["M_id"].ToString() && txt_M_pass.Text == dt.Rows[i]["M_password"].ToString())
{
//MessageBox.Show("登陆成功!!!", "系统消息");
zhuchuangti zct = new zhuchuangti();
zct.Show();
this.Visible = false;
}
else
{
MessageBox.Show("账号或密码错误!!!", "系统消息");
}
}
}
}

第二种:
string sql = string.Format("select count(*) from biao where id='{0}' and name='{1}'",id,pwd);
SqlCommand cmd = new SqlCommand(sql,conn);
conn.Open();
int a =(int)cmd.ExecuteScalar();
if (a> 1)
{
MessageBox.Show("用户不存在");
}
else
{
MessageBox.Show("登录成功");
}
这两种写法还存在sql注入攻击么??如果可以求附上代码,求大神解答。
...全文
160 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tiger_Zhao 2014-07-11
  • 打赏
  • 举报
回复
一、不可注入
二、可能注入
比如 pwd 输入为 ';sp_xxx...;SELECT '
解决方法
A)用 SqlCommand.Parameter,不直接拼 SQL
B)拼SQL前先对 id、pwd 进行替换,将一个 ' 替换为两个 ''
SQL77 2014-07-11
  • 打赏
  • 举报
回复
别人一个人登录,你要把所有用户都去比一遍。几亿用户 你怎么办 第二 种。。 是最普通的。容易被人注入的。 用参数 化 ,还有处理一些特殊字符不让输入。 比哪-- ‘’ 这些,每种数据库类型都可能不太一样
白开水__学者 2014-07-11
  • 打赏
  • 举报
回复
如何防止sql注入攻击,还请大神附上代码
Tiger_Zhao 2014-07-11
  • 打赏
  • 举报
回复
注入≠登入

通过合适的 sp 调用可以给你的服务器加用户、开端口,然后根本不需要走你这个界面的。
强盗比骗子的危害大的多!
白开水__学者 2014-07-11
  • 打赏
  • 举报
回复
select count(*) from biao where id='{0}' and name='user' or '1'='1' 这个sql一直都是true,但是#4那里的 if(a==1)里面的a返回的就会比1大所以也不会成功的注入啊
猿猿相抱 2014-07-11
  • 打赏
  • 举报
回复
解决方法: 1.sql语句中变量用参数@Parameter。(最保险的方法) 2.在登录页面增加特殊字符过滤,单引号,双引号等特殊字符。
猿猿相抱 2014-07-11
  • 打赏
  • 举报
回复
第一种不能,但使用程序处理不合理。 第二种可以被注入攻击,加入你输入的地方没有去关键字,我可以在任意处填写:user' or '1'='1 连起来sql语句就成了:

select count(*) from biao where id='{0}' and  name='user' or  '1'='1 ‘
这个语句在任何时候都是真
Tiger_Zhao 2014-07-11
  • 打赏
  • 举报
回复
最后一句后面还有个配对的单引号,SQL 语法无错的。
Tiger_Zhao 2014-07-11
  • 打赏
  • 举报
回复
先去看看什么叫注入。

按我3楼的方式,把你预期中的
select count(*) from biao where id='aaa' and  name='bbb'

一句SQL变成了
select count(*) from biao where id='aaa' and  name='';
sp_xxx...;
SELECT '

三句SQL。
注入并不需要登录成功,sp 能执行就够了。
你改的代码起了什么作用?
白开水__学者 2014-07-11
  • 打赏
  • 举报
回复
string sql = string.Format("select count(*) from biao where id='{0}' and name='{1}'",id,pwd); SqlCommand cmd = new SqlCommand(sql,conn); conn.Open(); int a =(int)cmd.ExecuteScalar(); if (a == 1) { MessageBox.Show("登录成功"); } else { MessageBox.Show("用户不存在"); }
白开水__学者 2014-07-11
  • 打赏
  • 举报
回复
我觉得这样应该就不能注入了吧
Tiger_Zhao 2014-07-11
  • 打赏
  • 举报
回复
已经够细了。
再细说明你首先需要学会编程。
白开水__学者 2014-07-11
  • 打赏
  • 举报
回复
可以写详细点么,我是初学者,有点看不懂,谢谢哈
白开水__学者 2014-07-11
  • 打赏
  • 举报
回复
前面的写错了,应该是: string sql = string.Format("select count(*) from biao where id='{0}' and name='{1}'",id,pwd); SqlCommand cmd = new SqlCommand(sql,conn); conn.Open(); int a =(int)cmd.ExecuteScalar(); if (a == 1) { MessageBox.Show("登录成功"); } else { MessageBox.Show("用户不存在"); } conn.Close();

34,588

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧