6

ファイルとフォルダーからデータを収集し、それを SQL データベースにアップロードする非常に単純なスクリプトを作成しました。私の問題はパラメータ化された sqlの問題に関連していると思いますが、その方法や理由がわかりません。

私がする必要があるのは、SQL文字列を再フォーマットして、一部の文字が入り込まないようにすることだと思います.

どんな助けでも感謝します。

コードは次のとおりです。

$Command = New-Object System.Data.SQLClient.SQLCommand
$Command.Connection = $dbConnection
$Command.CommandText = "INSERT INTO FileSizeTable (FileName,FileSize,FileNameLength,Date) VALUES ('$i','$items','$temp','$currentDate')" 

$Command.ExecuteNonQuery()

"INSERT INTO FileSizeTable (FileName,FileSize,FileNameLength,Date) VALUES ('$i','$items','$temp','$currentDate')"

出力は次のとおりです(テストとしてSQLコマンド文字列をプッシュしました):

INSERT INTO FileSizeTable (FileName,FileSize,FileNameLength,Date) VALUES ('ATI Te
chnologies','61.16 MB','39','05/24/2013 21:05:56')
ATI Technologies            61.16 MB                                           39
1
INSERT INTO FileSizeTable (FileName,FileSize,FileNameLength,Date) VALUES ('ATIToo
l','0.00 MB','30','05/24/2013 21:05:56')
ATITool                     0.00 MB                                            30
1
INSERT INTO FileSizeTable (FileName,FileSize,FileNameLength,Date) VALUES ('Auran'
,'7,496.04 MB','28','05/24/2013 21:05:56')
Auran                       7,496.04 MB                                        28
Exception calling "ExecuteNonQuery" with "0" argument(s): "Incorrect syntax near 
's'.
Unclosed quotation mark after the character string ')'."
At line:143 char:25
+                         $Command.ExecuteNonQuery()
+                         ~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : SqlException
4

1 に答える 1

10

「Auran」レコードの後に​​挿入しようとしているデータには、単一引用符/アポストロフィが含まれています。文字列の連結を使用してクエリを作成する場合、これは大きなリスクであり、SQL インジェクション攻撃を受ける可能性があります。

作成している文字列を SSMS または SQL 構文を強調表示できるその他のツールに貼り付けると、それが表示されます。

Coding Horror で見つけた投稿は、正しいアドバイス/回答を提供します。パラメーター化されたクエリを使用すると、これはなくなります。最近では、パフォーマンスとセキュリティ上の理由から、SQL ステートメントの文字列連結はお勧めできません。ソースコードとして読みやすくなることは言うまでもありません。

$Command = New-Object System.Data.SQLClient.SQLCommand
$Command.Connection = $dbConnection
$Command.CommandText = "INSERT INTO FileSizeTable (FileName,FileSize,FileNameLength,Date) VALUES (@name,@size,@length,@dt)";
$Command.Parameters.Add("@name", $i);
$Command.Parameters.Add("@size", $items);
$Command.Parameters.Add("@length", $temp);
$Command.Parameters.Add("@dt", $currentdate);
$Command.ExecuteNonQuery();
于 2013-05-24T12:40:41.063 に答える