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 回答