我正在尝试运行以下查询,该查询采用某人的名字并尝试将其插入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("'", "''")
那里有更优雅的解决方案,还是我似乎无法找到的功能?
谢谢。
答案 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。