SQL 注入绕过技术是一个老生常谈的话题,很多网站都接入了 WAF 等安全产品以此增强拦截和抵御 SQL 注入攻击的能力,另外从纵深防御的策略看还有在应用内部嵌入安全防护模块增强对请求输入参数进行过滤和拦截。下面提供两个防止注入漏洞产生的解决方案。
01.NET过滤单引号
ADO操作数据库时,如果输入的字符串不为空,方法继续执行 str.Replace("'", "''"),这是一个简单的SQL注入防范措施。它将字符串中的单引号 ' 替换为两个单引号 '',这样可以防止恶意用户通过在输入中插入单引号来破坏SQL查询语句的结构,从而实现SQL注入攻击。
public static string ChkSQL(string str)
{
if (string.IsNullOrEmpty(str))
{
return "";
}
str = str.Replace("'", "''");
return str;
}
DataTable dataTable = GetTable("select top 1 id from Info Where Id='" + Request["id"] + "'")
这个方法虽然简单,但是在防范基本的SQL注入方面提供了一定的保护。需要注意的是,此方法只针对字符串型的SQL过滤条件有效,对于更复杂的安全性要求,建议使用参数化查询或者ORM工具,而不仅仅依赖于字符串替换来防范SQL注入。
02.NET过滤多个值
下面这是一个名为 FilterIDs 的方法,用于处理字符串中包含的ID列表,并返回一个经过过滤的、用逗号分隔的字符串。
public static string FilterIDs(string strIDs)
{
string text = string.Empty;
strIDs = strIDs.Trim();
if (strIDs.Length == 0)
{
return "0";
}
string[] array;
if (strIDs.IndexOf("|") != -1)
{
array = strIDs.Split(new char[]
{
'|'
});
}
else
{
array = strIDs.Split(new char[]
{
','
});
}
foreach (string text2 in array)
{
if (Convert.ToInt32((text2)) != 0)
{
if (text == string.Empty)
{
text = text2;
}
else
{
text = text + "," + text2;
}
}
}
if (string.IsNullOrEmpty(text))
{
text = "0";
}
return text;
}
var Id = FilterIDs(Request["id"]);
DataTable dataTable = GetTable("select top 1 id from Info Where Id in(" + infoId + ")")
该方法的作用是从一个包含ID的字符串中提取有效的ID,并返回一个经过处理的字符串,用逗号分隔。在处理过程中,方法会忽略无效的ID,例如无法转换为整数的部分,确保返回的字符串中只包含有效的ID。
03.NET安全星球
星球汇聚了各行业安全攻防技术大咖,并且每日分享.NET安全技术干货以及交流解答各类技术等问题,社区中发布很多高质量的.NET安全资源,可以说市面上很少见,都是干货。
20+个专题栏目涵盖了点、线、面、体等知识面,助力师傅们快速成长!其中主题包括.NET Tricks、漏洞分析、内存马、代码审计、预编译、反序列化、webshell免杀、命令执行、C#工具库等等。
我们倾力打造专刊、视频等配套学习资源,循序渐进的方式引导加深安全攻防技术提高以及岗位内推等等服务。