sql注入-是否有一种方法可以在不产生安全问题的情况下从sql Server上的CREATE/ALTER DATABAS
本文关键字:sql 情况下 问题 安全 Server ALTER DATABAS CREATE 上的 是否 注入 | 更新日期: 2023-09-27 18:00:37
我有一个.NET应用程序,它正在使用SqlCommand运行以下语句:
DECLARE @SQL VARCHAR(100)
SELECT @SQL = 'CREATE DATABASE ' + @DB
EXEC(@SQL)
@DB参数来自用户输入,因此应用程序显然容易受到"X DROP DATABASE Y"之类的攻击。我肯定有一种明显的方式我错过了。。。
编辑:使用参数化语句无法工作,因为您不能在CREATE DATABASE中使用参数(CREATE DATABASE@DB返回语法错误)。
首先,您应该永远不要从web应用程序中执行此操作。曾经真正地我是认真的。除了部署包之外,我执行CREATE DATABASE
所需的唯一时间是来自SSMS中的查询分析器。此外,我怀疑任何代码会让用户输入数据库名称,然后去创建它
最重要的是,您发布的不是"参数化查询",而是连接的SQL,这是SQL注入漏洞的来源。如果它是一个参数化查询(或者一个存储过程,但我不认为您可以从存储过程中执行CREATE DATABASE
),SQL注入将是不成问题的。
你可以使用一个真正的参数化查询(这里有一个关于参数化查询的好教程。),也可以净化你的输入,但如果你正确地构建了命令和参数对象,ADO.NET或任何其他数据库库都会为你可靠地处理这一问题。
您可能想要指定参数-参数化查询几乎可以消除SQL注入攻击(只要您在接收存储过程中不连接字符串)。
正如我在评论中所说,我希望有一个非常好的理由来动态创建数据库/表,因为创建行似乎对大多数其他人都有效。
使用白名单方法:只允许字母。