如下简单储存过程能被SQL注入吗?

遊戲王千金 2011-01-18 03:53:19
该储存过程的参数是一个查询条件,假如该拼凑的查询条件被恶意注入SQL,那么执行会如何?求解!

CREATE proc [dbo].[t_user_GetJoinTask]
@strWhere nvarchar(1000)
as
declare @sql nvarchar(1500)
set @sql = 'SELECT u.Uid,u.Username,u.Tel,u.Call, t_task.*
FROM t_user as u INNER JOIN
t_task ON u.Uid= t_task.UserID '+@strWhere
exec (@sql)


假如能被注入,有什么方法可以避免,以上的储存过程该如何修正,求解!!
...全文
208 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Shawn 2011-01-20
  • 打赏
  • 举报
回复
#1. 要过滤所有的关键字的话,比如AND,写代码不太好做吧?因为你的字符串中也有可能包括AND,如'BRAND'.情况太多了……
#2. 看一下5楼的链接,都是美丽的防止SQL注入的方法
dawugui 2011-01-20
  • 打赏
  • 举报
回复
SQL注入专题
http://topic.csdn.net/u/20081205/09/3dd06076-bcbe-45d4-998c-8999fdbe6fae.html
遊戲王千金 2011-01-20
  • 打赏
  • 举报
回复
这种写法防注入如何?@strWhere指之前储存过程参数.

SqlParameter[] parameters = {
new SqlParameter("@strWhere",SqlDbType.NVarChar,1000)
};
parameters[0].Value = "SQL注入语句";
之后执行储存过程代码我就忽略了
-- SqlCommand cmd = new SqlCommand(procName, Conn);

遊戲王千金 2011-01-20
  • 打赏
  • 举报
回复
解释的详细,谢谢wwwwgou的回复。
试问一下,若在查询条件作过滤SQL关键字,能起到防注入作用吗。wwwgou看懂net代码?发出来指导下.

public class SqlQuery
{
private string sql;
public SqlQuery()
{
sql = string.Empty;
}

//列为字符串
public void Add(string fieldName, ArrayList value, string oper)
{
if (value == null||value.Count==0)
return;
if (sql != string.Empty)
sql += " and ";
switch (oper)
{
case "Eq":
sql += string.Format("{0} ='{1}'", fieldName, value);
break;
case "In":
sql += string.Format(" {0} In({1}) ", fieldName, DobConvert.ArrayListToString(value));
break;
case "NotIn":
sql += string.Format(" {0} Not In({1}) ", fieldName, DobConvert.ArrayListToString(value));
break;
}
}
/// <summary>
/// 取得sql(无Where关键字)
/// </summary>
public string GetSql
{
get {
string str = FiltrateSql(sql);
return str;
}
}

/// 过滤sql
public static string FiltrateSql(string sql)
{
ArrayList f = new ArrayList();
f.Add("INSERT");
f.Add("UPDATE");
f.Add("DELETE");
string strSql = sql.ToUpper();
foreach (string s in f)
{
strSql.Replace(s, string.Empty);
}
return strSql.Replace("'", string.Empty);
}
}

程序在调用的时候

SqlQuery sql = new SqlQuery();
sql.Add("username", "+txtTrueName.Text+", "Eq");
DataTable dt2 = user.GetDataTableList(sql.GetWhere);

那在文本框txtTrueName,里输入注入攻击,还能起作用吗?
Shawn 2011-01-20
  • 打赏
  • 举报
回复
--@strWhere可以被注入成任何合法的SQL语句,如
SELECT u.Uid ,
u.Username ,
u.Tel ,
u.Call ,
t_task.*
FROM t_user AS u
INNER JOIN t_task ON u.Uid = t_task.UserID
--#1
CROSS JOIN table_password --如果黑客猜到你的密码表的名称,那你的密码将一览无余
--#1
WHERE 1 = 1 --不进行任何过滤,显示所有信息
Shawn 2011-01-20
  • 打赏
  • 举报
回复
上面的SQL当然可以被注入.用参数传递
CREATE PROC [dbo].[t_user_GetJoinTask]
@para1 NVARCHAR(1000) = NULL,
@para2 NVARCHAR(1000) = NULL
AS

SELECT u.Uid ,
u.Username ,
u.Tel ,
u.Call ,
t_task.*
FROM t_user AS u
INNER JOIN t_task ON u.Uid = t_task.UserID
WHERE 1 = 1
AND (@para1 IS NULL OR field1 = @para1)
AND (@para2 IS NULL OR field2 = @para2)

34,575

社区成员

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

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