sql-server - 防止单引号破坏sql命令

标签 sql-server powershell

我有一个 powershell 模块,它从几个变量中构建一个字符串,以便插入到 sql server 中。

$QueryInsert =
"
insert into dbo.Table
(
    data
)
values
(
    '$data'
)
"

Invoke-Sqlcmd -ServerInstance 'server_name' `
        -Database db_name `
        -Query $QueryInsert `
        -QueryTimeout 20 `
        -OutputSqlErrors $True `
        -ConnectionTimeout 5 `
        -ErrorAction Continue

这种方法的问题在于它不是特别安全,如果变量 $data 包含任何单引号,它就会失败。有没有办法防止这种情况?有没有办法将其参数化以确保其安全?

最佳答案

如果您有权访问数据库,则可以将查询编写为存储过程,然后使用 PowerShell 调用该存储过程。您可以以一种安全的方式将参数传递给存储过程,这种方式不允许像上面的代码那样通过字符串注入(inject)代码。

您可能想看看 this question查看如何编写存储过程以及this one.

为了从 PowerShell 调用 SPROC,您可以使用与此类似的代码。

    $sql='NameOfSprocBeingCalled'
    $sqlConnection = new-object System.Data.SqlClient.SqlConnection
    $sqlConnection.ConnectionString = $SqlConnectionString
    $sqlConnection.Open()

    $sqlCommand = new-object System.Data.SqlClient.SqlCommand
    $sqlCommand.Connection = $sqlConnection
    $sqlCommand.CommandText= $sql
    $sqlCommand.CommandType = [System.Data.CommandType]::StoredProcedure
    $sqlCommand.Parameters.Add("@Param1",[system.data.SqlDbType]::VarChar).value =$Param1
    $sqlCommand.Parameters.Add("@Param2",[system.data.SqlDbType]::VarChar).value =  $EventType


    $Datatable = New-Object System.Data.DataTable
    $DataReader = $sqlCommand.ExecuteReader()
    $Datatable.Load($DataReader)

    $sqlConnection.Close()

您只需要使用 [System.Data.SqlDbType]::确保传入正确的参数类型即可:

这是一个具有以下可用类型的枚举:
# [enum]::GetValues([System.Data.SqlDbType])
BigInt
Binary
Bit
Char
DateTime
Decimal
Float
Image
Int
Money
NChar
NText
NVarChar
Real
UniqueIdentifier
SmallDateTime
SmallInt
SmallMoney
Text
Timestamp
TinyInt
VarBinary
VarChar
Variant
Xml
Udt
Structured
Date
Time
DateTime2

关于sql-server - 防止单引号破坏sql命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49563684/

相关文章:

sql-server - 无法加载 Microsoft.SqlServer.BatchParser 或其依赖项之一

c# - 如何使用 Entity Framework Core 可视化设计我的数据库?

sql - 关于本地数据库与基于服务的数据库的问题

PowerShell 错误以首选语言输出

powershell - 互斥的Powershell参数

sockets - 枚举耗尽 TCP 端口的 AD 组和成员的脚本

sql - 向 Azure 数据工厂中的表添加新列

sql-server - 分区主明细表

windows - 在 -ArgumentList 中启动进程变量

windows - 如何使用 PowerShell 安装 CMake? (自动安装)