シンプルなWeb 3階層アーキテクチャシステム【第2版】

44536 ワード


昨日web 3層アーキテクチャの第1版を書いて、正確には3層アーキテクチャの前期で、せいぜい2層アーキテクチャで、ゆっくりと完備しなければなりません.
 
第1版では、プログラムが実行できるとはいえ、中のSQL文は、使用するスペル文字で実行されるという欠陥があります.このような安全係数は低く、心ある人がいれば、SQLに注入され、文字を再接続し、私たちのデータベースの内容を改ざんし、取り返しのつかない損失を招く可能性があります.
 
第2版、つまりこの版の中で、私はもとのSQL文に対して再構築を行って、パラメータのSQL文を使ってデータベースに対して操作を行って、このようにする利点は、ユーザーがどんなフォーマットの文字を入力しても、SQL文はすべてそのままこれらの文字をデータベースの中に書き込むことができて、このように心ある人が文字に対してつなぎ合わせることを免れて、データベースエラーが発生しました.
 
SQL注入を防ぐコアコードを別の例で説明します.最後に再構築した第1版プログラム、つまり今日第2版プログラムを書きます.
 
これはDAOクラスのinsertメソッドです.
 1         public bool insert(string name, string sex, string salary)  2  {  3             bool flag = false;  4 

 5             SqlParameter[] paras = new 6  {  7                 new SqlParameter("@name", name),  8                 new SqlParameter("@sex", sex),  9                 new SqlParameter("@salary", salary) 10  }; 11 

12             string sql = "insert into person ([name], sex, salary) values (@name, @sex, @salary)"; 13 

14             if (sq.ExecuteNonQuery(sql, paras) > 0)    // SQL   SQL      SQLHelper ExecuteNonQuery   。

15  {                   //16                 flag = true; 17  } 18 

19             return flag; 20    }

 
SQLhelperクラスのExecuteNonQueryメソッドです.
 1         public int ExecuteNonQuery(string sql, SqlParameter[] paras)  2  {  3             int result;  4 

 5             cmd = new SqlCommand(sql, getcon());    //  SQLcommand  cmd

 6 

 7             cmd.Parameters.AddRange(paras);         // SQLcommand  cmd ,    。

 8                               //        ,      ,      ,           ,   。

 9             result = cmd.ExecuteNonQuery();         //      cmd,       SQL        

10 

11             return result; 12       }

 
上の例では、テーブルを作成し、テーブルのNAME SEX SALARYの3つのフィールドにコンテンツを追加します.
 
 
 
次は、Web 3階層アーキテクチャの第2版です.
 
SQLhelperアシスタントクラス:
  1 using System;

  2 using System.Collections.Generic;

  3 using System.Linq;

  4 using System.Text;

  5 using System.Threading.Tasks;

  6 

  7 using System.Data;

  8 using System.Data.SqlClient;

  9 using System.Configuration;

 10 

 11 namespace DAL

 12 {

 13     public class SQLHelper

 14     {

 15         SqlCommand cmd = null;

 16 

 17         public string strcon()

 18         {

 19             string strcon = ConfigurationManager.ConnectionStrings["strcon"].ConnectionString;

 20 

 21             return strcon;

 22         }

 23 

 24         public SqlConnection getcon()

 25         {

 26             SqlConnection con = new SqlConnection(strcon());

 27 

 28             if (con.State == ConnectionState.Closed)

 29             {

 30                 con.Open();

 31             }

 32 

 33             return con;

 34         }

 35 

 36         #region        SQL  

 37         /// <summary>

 38         ///        SQL  

 39         /// </summary>

 40         /// <param name="sql">    SQL</param>

 41         /// <returns>    SQL        </returns>

 42         public int ExecuteNonQuery(string sql)

 43         {

 44             int res;

 45 

 46             try

 47             {

 48                 cmd = new SqlCommand(sql, getcon());

 49 

 50                 res = cmd.ExecuteNonQuery();

 51             }

 52             catch (Exception ex)

 53             {

 54                 throw ex;

 55             }

 56             finally

 57             {

 58                 if (getcon().State == ConnectionState.Open)

 59                 {

 60                     getcon().Close();

 61                 }

 62             }

 63 

 64             return res;

 65         }

 66         #endregion

 67 

 68         #region          SQL  

 69         /// <summary>

 70         ///          SQL  

 71         /// </summary>

 72         /// <param name="sql">    SQL  </param>

 73         /// <param name="paras">     </param>

 74         /// <returns>        </returns>

 75         public int ExecuteNonQuery(string sql, SqlParameter[] paras)//    ExecuteNonQuery          ,      ,        ExecuteNonQuery,            ,           ExecuteNonQuery  。

 76         {

 77             int res;

 78 

 79             cmd = new SqlCommand(sql, getcon());//  1  

 80 

 81             cmd.Parameters.AddRange(paras);//  2  

 84 

 85             res = cmd.ExecuteNonQuery();

 86 

 87             return res;

 88         }

 89         #endregion

 90 

 91         #region      SQL    

 92         /// <summary>

 93         ///      SQL    

 94         /// </summary>

 95         /// <param name="sql">      SQL</param>

 96         /// <returns>    SQL      </returns>

 97         public DataTable ExecuteQuery(string sql)

 98         {

 99             DataTable dt = new DataTable();

100 

101             //    SqlCommand  cmd,       ,   sql  。//    ,             ,   。

102             cmd = new SqlCommand(sql, getcon());

103 

104             //  cmd      .  using       ,    sdr。    sdr.closed.

105             using (SqlDataReader sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))//     CommandBehavior.CloseConnection   ,               getcon().Close(),      。

106             {

107                 dt.Load(sdr);// Load        SqlDataReader。   SqlDataAdapter,     Fill   。

108             }

109 

110             return dt;

111         }

112         #endregion

113 

114         #region         SQL    

115         /// <summary>

116         ///          SQL    

117         /// </summary>

118         /// <param name="sql">    SQL  </param>

119         /// <param name="paras">     </param>

120         /// <returns>        </returns>

121         public DataTable ExecuteQuery(string sql, SqlParameter[] paras)

122         {

123             DataTable dt = new DataTable();

124 

125             cmd = new SqlCommand("sql", getcon());

126 

127             cmd.Parameters.AddRange(paras);

128 

129             using (SqlDataReader sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))

130             {

131                 dt.Load(sdr);

132             }

133 

134             return dt;

135         }

136         #endregion

137     }

138 }

 
 
PersonDAO従業員操作クラス:
  1 using System;

  2 using System.Collections.Generic;

  3 using System.Linq;

  4 using System.Text;

  5 using System.Threading.Tasks;

  6 

  7 using System.Data;

  8 using System.Data.SqlClient;

  9 

 10 namespace DAL

 11 {

 12     public class personDAO

 13     {

 14         SQLHelper sq = null;

 15 

 16         public personDAO()

 17         {

 18             sq = new SQLHelper();

 19         }

 20 

 21         #region       

 22         /// <summary>

 23         ///       

 24         /// </summary>

 25         /// <param name="name">        </param>

 26         /// <param name="sex">        </param>

 27         /// <param name="salary">        </param>

 28         /// <returns>     :          ,          </returns>

 29         public bool insert(string name, string sex, string salary)

 30         {

 31             bool flag = false;

 32 

 33             SqlParameter[] paras = new SqlParameter[]

 34             {

 35                 new SqlParameter("@name", name),

 36                 new SqlParameter("@sex", sex),

 37                 new SqlParameter("@salary", salary)

 38             };

 39 

 40             string sql = "insert into person ([name], sex, salary) values (@name, @sex, @salary)";//  ,       ,              。

 41 

 42             if (sq.ExecuteNonQuery(sql, paras) > 0)// sql          ,      ExecuteNonQuery     。

 43             {

 44                 flag = true;

 45             }

 46 

 47             return flag;

 48         }

 49         #endregion

 50 

 51         #region       

 52         /// <summary>

 53         ///       

 54         /// </summary>

 55         /// <param name="id">      id</param>

 56         /// <returns>     :          ,          </returns>

 57         public bool delete(string id)

 58         {

 59             bool flag = false;

 60 

 61             SqlParameter[] paras = new SqlParameter[]

 62             {

 63                 new SqlParameter("@id", id)

 64             };

 65 

 66             string sql = "delete from person where id = @id";//  ,       ,              。

 67 

 68             if (sq.ExecuteNonQuery(sql, paras) > 0)

 69             {

 70                 flag = true;

 71             }

 72 

 73             return flag;

 74         }

 75         #endregion

 76 

 77         #region       

 78         /// <summary>

 79         ///       

 80         /// </summary>

 81         /// <param name="id">        </param>

 82         /// <param name="name">        </param>

 83         /// <param name="sex">        </param>

 84         /// <param name="salary">        </param>

 85         /// <returns>     :          ,          </returns>

 86         public bool update(string id, string name, string sex, string salary)

 87         {

 88             bool flag = false;

 89 

 90             SqlParameter[] paras = new SqlParameter[]//      

 91             {

 92                 new SqlParameter("@id", id),//

 93                 new SqlParameter("@name", name),

 94                 new SqlParameter("@sex", sex),

 95                 new SqlParameter("@salary", salary)

 96             };

 97 

 98             //      

 99             string sql = "update person set [name] = @id, sex = @name, salary = @sex where id = salary";//  ,       ,              。

100 

101             if (sq.ExecuteNonQuery(sql, paras) > 0)

102             {

103                 flag = true;

104             }

105 

106             return flag;

107         }

108         #endregion

109 

110         #region           

111         /// <summary>

112         ///           

113         /// </summary>

114         /// <param name="name">          </param>

115         /// <returns>     :        ,        </returns>

116         public bool repeat(string name)

117         {

118             bool flag = false;

119 

120             SqlParameter[] paras = new SqlParameter[]

121             {

122                 new SqlParameter("@name", name)

123             };

124 

125             string sql = "select * from person where [name] = @name";//  ,       ,              。

126 

127             #region        ,           ,          ,             。

128             //DataTable dt = sq.ExecuteQuery(sql);

129 

130             //if (dt.Rows.Count > 0)//dt.Rows.Count                     ,           。           。

131             //{

132             //    flag = true;

133             //}

134             #endregion

135 

136             if (sq.ExecuteQuery(sql, paras).Rows.Count > 0)//dt.Rows.Count                     ,           。           。

137             {

138                 flag = true;

139             }

140 

141             return flag;

142         }

143         #endregion

144     }

145 }

 
 
上は再構築された第1版のコード、つまり第2版で、その中に間違いがあれば、コメントエリアで指摘してください.