转义PowerShell中包含单引号的字符串,以便为SQL查询做好准备

时间:2014-02-20 14:44:25

标签: sql sql-server powershell

我正在尝试运行以下查询,该查询采用某人的名字并尝试将其插入SQL Server数据库表。

$name = "Ronnie O'Sullivan"

$dataSource = "127.0.0.1"
$database = "Danny"
$connectionString = "Server=$dataSource;Database=$database;Integrated Security=True;"

$connection = New-Object System.Data.SqlClient.SqlConnection
$connection.ConnectionString = $connectionString
$connection.Open()

$query = "INSERT INTO People(name) VALUES('$name')"

$command = $connection.CreateCommand()
$command.CommandText = $query
$command.ExecuteNonQuery()

$connection.Close()

我面临的问题是单引号导致我的查询出现问题。查询正在执行

INSERT INTO People(name) VALUES('Ronnie O'Sullivan')

导致SQL语法错误。

我的问题是我如何转义我的$ name变量,以便它在SQL端呈现。

一种解决方案是在我的$ name变量上进行查找和替换,找到:'replace:''

$name.Replace("'", "''")

那里有更优雅的解决方案,还是我似乎无法找到的功能?

谢谢。

2 个答案:

答案 0 :(得分:13)

您可以尝试更新代码,以使用能够处理字符串中引号的参数化值:

$query = "INSERT INTO People(name) VALUES(@name)"

$command = $connection.CreateCommand()
$command.CommandText = $query
$command.Parameters.Add("@name", $name)  -- | Out-Null (may be required on the end)
$command.ExecuteNonQuery()

我对powershell没有经验,但引用了parametrised query的这篇文章:

答案 1 :(得分:0)

Tanner's helpful answer绝对是最可靠,最安全的解决方案,因为使用[参数化/准备好的语句(查询)消除了{{3 }}攻击。

但是,在这种受限的情况下,如果您想将值插入单引号的SQL字符串('...'中,就可以逃脱只需将值中的嵌入 '个字符加倍

$query = "INSERT INTO People(name) VALUES('$($name -replace "'", "''")')"

以上内容通过SQL injection通过$(...)string interpolation使用PowerShell的subexpression operator来嵌入一个表达式,该表达式使用-replace operator来将所有嵌入的'实例加倍。值$name

注意:您还可以使用上面的$name.Replace("'", "''"),在这种简单情况下,它的性能更好,但是通常首选PowerShell的-replace运算符,不仅因为它是PowerShell本地用户,而且还提供了卓越的功能,因为它是基于正则表达式的并且支持数组作为其LHS-请参见this comment on GitHub