软件宝宝系列——SQL注入篇

今天,我给大家介绍的是软件宝宝如何防止SQL注入。
软件宝宝安全成长史系列的第二点:
“2、教会“软件宝宝”什么是好人,什么是坏人,什么东西可以吃,什么东西不能够吃!”
接下来,我们看看软件宝宝在未学会第二点之前所存在的危险,大家看了以后,一定要记得看看自己的软件宝宝是不是也存在这种威胁了?
public void UnsafeQuery (string name)
{
IDbConnection dbConnection = new SqlConnection ();
dbConnection.Open ();
IDbCommand dbCommand = dbConnection.CreateCommand ();
dbCommand.CommandText = "SELECT name, bank_account FROM customers WHERE name = '" + name + "'";
IDataReader dataReader = dbCommand.ExecuteReader ();
PrintAllValuesInReader (dataReader);
dataReader.Close ();
dbCommand.Dispose ();
dbConnection.Close ();
}
上面的代码,大家看出问题了吧,还没看出,打PP了。
假设我们的程序当中正在使用UnsafeQuery (txtInput.text.trim);
当我们在txtInput.text文本框中,我们给宝宝喂点“HappyQQ';drop table customers;--“
宝宝自从吃了这个东西以后,就生病了!
所以说,我们一定要教会软件宝宝什么东西该吃,什么不该吃?
好了,接下来,我们就教教软件宝宝什么东西能吃,什么不能够吃。
告诉宝宝第一种方法:(不能够吃的,全部都不吃)
 private string FormatRemoveSQL( string strSQL )
{
string strCleanSQL = strSQL;

if( strSQL != null )
{
Array BadCommands = ";,--,create,drop,select,insert,delete,update,union,sp_,xp_".Split( ',' );
//数组中保存了哪些是宝宝不能够吃的东西,这下可安全喽!

int intCommand;
for( intCommand = 0; intCommand <= BadCommands.Length - 1; intCommand++ )
{
strCleanSQL = Regex.Replace( strCleanSQL, Convert.ToString( BadCommands.GetValue( intCommand ) ), " ", RegexOptions.IgnoreCase );
}

strCleanSQL = strCleanSQL.Replace( "'", "''" );
}

return strCleanSQL;
}
好了,接下来,我们用UnsafeQuery (FormatRemoveSQL(txtInput.text.trim));
软件宝宝以后就不会再吃这个坏东西了!(SQL注入)
告诉软件宝宝,第二种方法,坏东西不要吃,但是还是可以看看的嘛!

public void SafeQuery (string name)
{
IDbConnection dbConnection = new SqlConnection ();
dbConnection.Open ();
IDbCommand dbCommand = dbConnection.CreateCommand ();
dbCommand.CommandText = "SELECT name, bank_account FROM customers WHERE name = @name";
dbCommand.Parameters.Add (new SqlParameter ("@name", DbType.String).Value = name);
IDataReader dataReader = dbCommand.ExecuteReader ();
PrintAllValuesInReader (dataReader);
dataReader.Close ();
dbCommand.Dispose ();
dbConnection.Close ();
}
当我们的程序中使用safeQuery (txtInput.text.trim);
 
最后总结:对付SQL注入,我们可以过滤其危险字符,或者采用参数化传值方式都可以。(文章中所介绍的方法同样可以应用到XSS漏洞的防护)

作者:黄启清

日期:2008-7-3

同时,谨以此文献给我最亲爱的妈妈(http://mama520.cn)

CNBLOGS安全团队欢迎您的加入!
 
posted @   HappyQQ  阅读(2935)  评论(21编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
点击右上角即可分享
微信分享提示