SQLインジェクションとは何ですか?
SQL インジェクションについて私が理解していることは、一部の人々が悪意のあるパラメーターを入力してバックグラウンドでこの SQL を実行させ、データを取得したりデータベースを破壊したりするという目的を達成できるということです。
簡単なクエリの例を挙げると、バックグラウンド SQL が結合されています: select * from Test where name='+parameter transfer+'; フロント ページでは名前の入力が必要で、ハッカーは次のように入力できます: ';DROP TABLE Test;-- Don' SQL コードの一部:
select * from Test where name=' ';DROP TABLE Test;--'; は正しく、SQL で実行可能ですが、実行後、Test テーブル全体が削除され、Web サイトがクラッシュします。
最良の解決策
最良の方法は、スプライシング SQL を作成するのではなく、パラメーター化された SQL を使用することです。新しいプロジェクトにはこれをお勧めします。ここには紹介がありません。興味のある方はご自身で検索してください。この記事で紹介されている方法は、パラメータ化された SQL を使用して開発されたプログラムが存在しない古いプロジェクトに適しています。
フィルター機能を使用してフィルターします
SQL 内のいくつかの危険なキーワード、およびコメントのパーセンテージとセミコロン (通常のコードを作成する場合にはまったく表示されない文字) をフィルターで除外することで、SQL の実行を最大限に高めることができます。は安全です。コードは次のとおりです:
public class SqlFilter { public static void Filter() { string fileter_sql = "execute,exec,select,insert,update,delete,create,drop,alter,exists,table,sysobjects,truncate,union,and,order,xor,or,mid,cast,where,asc,desc,xp_cmdshell,join,declare,nvarchar,varchar,char,sp_oacreate,wscript.shell,xp_regwrite,',%,;,--"; try { // -----------------------防 Post 注入----------------------- if (HttpContext.Current.Request.Form != null) { PropertyInfo isreadonly = typeof(System.Collections.Specialized.NameValueCollection).GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic); //把 Form 属性改为可读写 isreadonly.SetValue(HttpContext.Current.Request.Form, false, null); for (int k = 0; k < System.Web.HttpContext.Current.Request.Form.Count; k++) { string getsqlkey = HttpContext.Current.Request.Form.Keys[k]; string sqlstr = HttpContext.Current.Request.Form[getsqlkey]; string[] replace_sqls = fileter_sql.Split(','); foreach (string replace_sql in replace_sqls) { sqlstr = Regex.Replace(sqlstr, replace_sql, "", RegexOptions.IgnoreCase); } HttpContext.Current.Request.Form[getsqlkey] = sqlstr; } } // -----------------------防 GET 注入----------------------- if (HttpContext.Current.Request.QueryString != null) { PropertyInfo isreadonly = typeof(System.Collections.Specialized.NameValueCollection).GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic); //把 QueryString 属性改为可读写 isreadonly.SetValue(HttpContext.Current.Request.QueryString, false, null); for (int k = 0; k < System.Web.HttpContext.Current.Request.QueryString.Count; k++) { string getsqlkey = HttpContext.Current.Request.QueryString.Keys[k]; string sqlstr = HttpContext.Current.Request.QueryString[getsqlkey]; string[] replace_sqls = fileter_sql.Split(','); foreach (string replace_sql in replace_sqls) { sqlstr = Regex.Replace(sqlstr, replace_sql, "", RegexOptions.IgnoreCase); } HttpContext.Current.Request.QueryString[getsqlkey] = sqlstr; } } // -----------------------防 Cookies 注入----------------------- if (HttpContext.Current.Request.Cookies != null) { PropertyInfo isreadonly = typeof(System.Collections.Specialized.NameValueCollection).GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic); //把 Cookies 属性改为可读写 isreadonly.SetValue(HttpContext.Current.Request.Cookies, false, null); for (int k = 0; k < System.Web.HttpContext.Current.Request.Cookies.Count; k++) { string getsqlkey = HttpContext.Current.Request.Cookies.Keys[k]; string sqlstr = HttpContext.Current.Request.Cookies[getsqlkey].Value; string[] replace_sqls = fileter_sql.Split(','); foreach (string replace_sql in replace_sqls) { sqlstr = Regex.Replace(sqlstr, replace_sql, "", RegexOptions.IgnoreCase); } HttpContext.Current.Request.Cookies[getsqlkey].Value = sqlstr; } } } catch (Exception ex) { Console.WriteLine(ex.Message); } } }
SQL インジェクションを防ぐための ASP.NET フィルタリング クラス SqlFilter の詳細については、PHP 中国語 Web サイトの関連記事に注目してください。