【发布时间】:2012-05-11 12:24:05
【问题描述】:
在我的编程任务中,我走上了一条黑暗的小巷,但愿没有,但现在没有回头路了。
我正在构建一个 SQL 语句,其中表名、列名和 id 值是从查询字符串参数中检索的,即("SELECT [{0}] FROM [{1}] WHERE [Id] = {2};", c, t, id)
但它并不像看起来那么糟糕,我受到保护:
- 只有经过身份验证的用户(即登录用户)才能执行
Page_Load - 我正在检查表和列是否都存在
(使用
GetSchema等) - 我正在预先检查 Id 是否为整数
- 我所有的表都有 Id 列
- 数据库连接相当安全
字段值应为 NVARCHAR(4000) 或 NVARCHAR(MAX) 类型,因此我避免使用 ExecuteScalar,我正在尝试 LINQ ExecuteQuery,因为我喜欢 LINQ。但是我又有点不适应了。
我已经走到这一步了:
Dim db As New MyDataContext
Dim result = db.ExecuteQuery(Of ITable)("SELECT [{0}] FROM [{1}] WHERE [Id] = {2};", c, t, id)
- 这是正确的方法吗?
- 如何获取第一行和第一列的值?
- 有更好的选择吗?
附:这是一个 SQL Server 2005 数据库
任何帮助表示赞赏。 谢谢。
【问题讨论】:
-
如果表名或列名包含括号,则检查通过(存在),但导致SQL无效。使用
quotename。总是。 -
你说的是方括号还是花括号?
-
是的,它是有效的 SQL。现在假设该表名为
Web]Page。 100% 允许。 -
是的,只要表
Web]Page存在,它将起作用。也可以是WebPage[1]。或者类似的东西。关键是,你正在做的那种替代并不能保护你免受任何伤害。始终使用quotename作为对象名称(首先收集输入,然后为每个项目调用quotename,然后将经过清理的字符串替换为查询)。即使对于您当前的数据架构而言,这看起来有点过头了,但它会确保您将来不会遇到问题。 -
我会改用 oData 或 .Net Web API 之类的东西。
标签: asp.net sql-server vb.net linq-to-sql webforms