Groovy,创建 MSSQL 数据库的安全方法

Posted

技术标签:

【中文标题】Groovy,创建 MSSQL 数据库的安全方法【英文标题】:Groovy, safe way to create MSSQL database 【发布时间】:2016-10-13 16:10:07 【问题描述】:

我正在尝试使用 groovy.sql.Sql 在 MSSQL (Microsoft SQL Server) 服务器中创建数据库。似乎准备好的语句在中断查询的最后一个参数周围添加了额外的引号。

这个测试代码:

import groovy.sql.Sql
import com.microsoft.sqlserver.jdbc.SQLServerDataSource

def host = 'myhost'
def port = '1433'
def database = 'mydatabasename'
def usernameName = 'myusername'
def password = 'mypassword'

def dataSource = new SQLServerDataSource()
dataSource.setURL("jdbc:sqlserver://$host:$port")
dataSource.setUser(username)
dataSource.setPassword(password)

def connection new Sql(dataSource)
connection.execute(
    'IF EXISTS (SELECT * FROM master.dbo.sysdatabases WHERE name = ?) DROP DATABASE ?',
    [ databaseName, databaseName ]
)

给出错误:

Failed to execute: IF EXISTS (SELECT * FROM master.dbo.sysdatabases WHERE name = ?) DROP DATABASE ? because: Incorrect syntax near '@P1'.

如何使用准备好的语句而不在参数一周围添加单引号(DROP DATABASE 似乎被重写为 DROP DATABASE '?')或者我可以以不同的方式编写查询,以便添加的单引号不会产生语法错误?

如果有人能给我一个工作示例,我也可以使用其他框架。

【问题讨论】:

【参考方案1】:

你可以试试:

connection.execute(
    "IF EXISTS (SELECT * FROM master.dbo.sysdatabases WHERE name = $databaseName) DROP DATABASE $Sql.expand(databseName)"
) 

【讨论】:

谢谢,Sql.expand 会让查询注入安全吗? 不,不是靠它自己,但它会使查询工作。 :) 好吧,那不是我要找的,那我也可以做串联,我会继续找的。​​span>

以上是关于Groovy,创建 MSSQL 数据库的安全方法的主要内容,如果未能解决你的问题,请参考以下文章

Groovy 安全导航(safe-navigation)操作符(?.)

创建动态MSSQL数据库表的方法

Oracle 存储过程的全局临时表的替代方法

GroovyGroovy 脚本调用 ( Groovy 类中调用 Groovy 脚本 | 参考 Script#evaluate 方法 | 创建 Binding 对象并设置 args 参数 )

MSSQL数据库安全

网络安全从入门到精通 (第五章-3) MSSQL反弹注入