SQL注入防止のパラメトリッククエリー
2901 ワード
機械室の料金徴収システムを作る時、かつてパラメータを伝達する形式を利用してSQL文あるいは記憶過程に値を伝達したことがあって、このようにパラメータ化のクエリーを通じて“SQL注入”式の攻撃を防ぐことができるため、このような攻撃者は命令をSQL文に挿入して、危機のサーバーの安全から.
SqlParameter Param = new SqlParameter("@CourseID", 4);
これでSQL注入をある程度防ぐことができますが、まだよくできていません.注意すると、SqlParameterというクラスには7つの構造関数があり、構造関数ごとにパラメータが違います.SQL文にパラメータを渡して値を割り当てる以上、整合性を最高にするために、データベースに格納されているデータ型とサイズを一致させることもできます.これにより、データベース・サーバが適切なキャッシュ・プランと正確に一致するように命令するのを助けることができるため、クエリーの実行性能を向上させることができます.
SqlParameter Params = new SqlParameter("@CourseID", SqlDbType.VarChar, 50, "CourseID");
注記:SqlParameterコンストラクション関数の形式を採用しています.最初のパラメータは注入されたパラメータ、2番目はタイプ、3番目のパラメータはサイズ、4番目のパラメータはデータベース内の対応するカラムの名前です.
改善
ParameterDirectionを使用します(クエリー内のDataSetに関するパラメータのタイプを指定します).列挙型タイプは、上記を改善するために使用される.
ここでParameterDirectionには、Input(入力パラメータ)、OutPut(出力パラメータ)、InOutPut(入出力パラメータ)、ReturnValue(操作の戻り値)の4つのメンバーがあります.
パラメータ伝達プロセス
SqlParameter[] Params = new SqlParameter[2];
DataBase DB = new DataBase();
string strsql = "DELETE From UserAnswermr WHERE UserID= @UserID and PaperID=@PaperID";
Params[0] = DB.MakeInParam("@UserID", SqlDbType.VarChar, 50, userid); // ID
Params[1] = DB.MakeInParam("@PaperID", SqlDbType.Int, 4, paperid);
パラメータディレクトリの導入
// ,
// :
// ParamName -
// DbType -
// Size -
// Direction -
// Value -
public SqlParameter MakeParam(string ParamName, SqlDbType DbType, Int32 Size, ParameterDirection Direction, object Value)
{
SqlParameter Param;
if(Size > 0)
Param = new SqlParameter(ParamName, DbType, Size);
else Param = new SqlParameter(ParamName, DbType);
Param.Direction = Direction;
if (Value != null)
Param.Value = Value;
return Param;
}
// ,
// :
// ParamName -
// DbType -
// Size -
// Value -
public SqlParameter MakeInParam(string ParamName, SqlDbType DbType, int Size, object Value)
{
return MakeParam(ParamName, DbType, Size, ParameterDirection.Input, Value);
}
まとめ
ParameterDirectionを導入することで、クエリーの効率性が向上する一方で、伝達価値のセキュリティが向上します.