シンプルな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版で、その中に間違いがあれば、コメントエリアで指摘してください.