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
欢迎加入我们的知识库
dot.Net应用安全建设星球是dot.Net安全矩阵星球的卫星星球,我们的定位是帮助企业和研发同学建设和加固.NET应用,对于.NET应用安全风险我们结合自己的最佳实践提供全面有效的修复解决方案!
经过运营团队成员商议一致同意给到师傅们最大优惠力度,提供20元代金卷,只需79元就可以加入我们。
星球汇聚了各行业安全攻防技术大咖,并且每日分享.NET安全技术干货以及交流解答各类技术等问题,社区中发布很多高质量的.NET安全资源,可以说市面上很少见,都是干货。
星球文化始终认为授人以鱼不如授人以渔!加入星球后可以跟星主和嘉宾们一对一提问交流,20+个专题栏目涵盖了点、线、面、体等知识面,助力师傅们快速成长!
星球全面覆盖 >=12 种.NET下的OWASP漏洞类型,并提供针对这些安全风险的修复方案。
星球提供.NET安全编码规范和安全组件,达到纵深防御的效果!
学会使用.NET代码评估工具,在应用上线前做安全扫描,及时修复代码漏洞。
加入费用,我们现在提供早鸟价¥79元便可加入,价格随着内容沉淀和成员数量适当提高,越早加入越好。另外随着加入的星友们越来越多,问题也越来越变得多样化,因此星主压力也越来越大,为了保证内容质量的同时,会适当提高门槛,如果你还在犹豫要不要加入星球的话,可以扫码领取优惠卷加入我们,以优惠价(dot.Net安全矩阵粉丝专属福利)加入肯定不亏,期待感兴趣的师傅们加入!