我有一个.NET应用程序,它使用SqlCommand运行以下语句:
DECLARE @SQL VARCHAR(100)
SELECT @SQL = 'CREATE DATABASE ' + @DB
EXEC(@SQL)
Run Code Online (Sandbox Code Playgroud)
@DB参数来自用户输入,因此很明显应用程序容易受到"X DROP DATABASE Y"之类的攻击.我敢肯定一定有一种我想念的明显方式......
编辑:使用参数化语句无法工作,因为您无法在CREATE DATABASE中使用参数(CREATE DATABASE @DB返回语法错误).
首先,您永远不应该从Web应用程序执行此操作.永远.真.我是认真的.除了部署包之外,我唯一需要执行的CREATE DATABASE是来自SSMS中的查询分析器.此外,我怀疑任何允许用户输入数据库名称的代码,然后去创建它.
最重要的是,您发布的内容不是"参数化查询".它是连接SQL,它是SQL注入漏洞的来源..如果它是一个参数化查询(或存储过程,但我不认为你可以CREATE DATABASE从一个sproc执行),SQL注入将是一个非问题.
您可以使用真正的参数化查询(这是一个关于参数化查询的好教程.),或者清理您的输入,但是如果您正确构建命令和参数对象,ADO.NET或其他任何其他数据库都可以为您可靠地处理此问题.
| 归档时间: |
|
| 查看次数: |
275 次 |
| 最近记录: |