PowerShellでsqlite3を利用する記事を書いたが、SQLインジェクション対策を一切していなかった。PowerShellで作成するものの用途的に特にいらないかなと思っていたが、このご時世に対策できていないのもかっこ悪いのでSQLパラメータを利用するパターンのものを作成した。
#######################################################
# パラメータ変数格納用のクラス(SQLiteParameterだとインテリセンスやコードが長くなるため独自のクラスを作成)
#######################################################
Class clsSqlParameter {
[string]$ParameterName;
[object]$Value;
# コンストラクタ
clsSqlParameter(){
}
# コンストラクタ
clsSqlParameter([string]$_ParameterName,[object]$_Value){
$this.ParameterName = $_ParameterName;
$this.Value = $_Value;
}
}
############################################################
# SQLを実行しデータを取得する。戻り値はDataTable
# パラメータ変数を利用するので、System.Collections.Generic.List[clsSqlParameter]クラスのインスタンスを指定
# <例>
# $lstParameters = New-Object "System.Collections.Generic.List[clsSqlParameter]";
# $para = New-Object "clsSqlParameter" -ArgumentList "@para1", "060 ";
# #$para.ParameterName = "@para1";
# #$para.Value = "060 ";
# $lstParameters.Add($para);
# $dtResult = $dba.GetDataPara("SELECT * FROM KEN_ALL WHERE 郵便番号_5桁 = @para1 ",$lstParameters)
############################################################
[System.Data.DataTable]GetDataPara([string]$strSQL,$lstParas){
# エラーが発生した際に後続の処理を停止
$ErrorActionPreference = "Stop"
$sqlcmd = $null;
$sqliteConnection = $null;
$dataTable = $null;
try {
# SQLiteへの接続およびSQLステートメント発行用のSystem.Data.SQLite.SQLiteCommandの生成
$sqliteConnection = New-Object System.Data.SQLite.SQLiteConnection;
# .NETのライブラリのSQLiteは共有ファイルのデータベースへアクセスする場合、「\\SV-FOLDER\DataBase\Sample.sqlite3」のようなパスを指定したときに正常に接続できない
# この場合は、「\\\\SV-FOLDER\DataBase\Sample.sqlite3」とする必要があることがわかったため修正
$strConnectionString = "";
if ($this.fstrDBFilePath.ToString().Substring(0,4) -ne "\\\\" -and $this.fstrDBFilePath.ToString().Substring(0,2) -eq "\\") {
$strConnectionString = "Data Source = \\" + $this.fstrDBFilePath;
} else {
$strConnectionString = "Data Source = " + $this.fstrDBFilePath;
}
$sqliteConnection.ConnectionString = $strConnectionString ;
$sqlcmd = New-Object System.Data.SQLite.SQLiteCommand;
$sqlcmd.Connection = $sqliteConnection;
$sqliteConnection.Open();
# SELECT実行
$sqlcmd.CommandText = $strSQL;
foreach ($para in $lstParas) {
$sqlitePara = New-Object "System.Data.SQLite.SQLiteParameter" -ArgumentList $para.ParameterName, $para.Value;
$sqlcmd.Parameters.Add($sqlitePara);
}
$rs = $sqlcmd.ExecuteReader();
# Datatableにデータを取り込む
$dataTable = New-Object System.Data.DataTable;
$dataTable.Load($rs);
$dataTable | Format-Table ;
} catch {
Write-Host "【エラー発生】GetDataPara";
Write-Host ("エラーメッセージ:" + $_.Exception.Message);
Write-Host ("クエリ:" + $strSQL);
} finally {
# SQLiteの切断
$sqlcmd.Dispose()
$sqliteConnection.Close()
}
return $dataTable;
}