Server.HtmlEncode 导致 ODP.NET 出错

Server.HtmlEncode is causing error to ODP.NET

我正在将 Framework v3.5 版本迁移到 v4.5 并使用来自 Oracle 的 ODP.NET 更新 System.Data.OracleClient

在应用程序的一部分,它从 QueryString 获取一些值,执行 Server.HtmlEncode 并推入 oracle select 语句 where 子句和 运行 通过 ODP.NET.

现在的问题是,它以前使用 System.Data.OracleClient,但使用 ODP.NET 从 Oracle 获取无效标识符。如果我删除 Server.HtmlEncode 运行正常,但出于安全考虑我不允许将原始数据公开给 Oracle。

需要帮助!

Imports Oracle.DataAccess.Client

strStateIDs = Trim(Server.HtmlEncode(Context.Request.QueryString("STATE_IDS")))

strLVQuery = "SELECT <some columns> WHERE <some condition> AND <some column> IN (" & strInitStateIDs & ") ORDER BY <some columns>"
OracleDA.SelectCommand.CommandType = CommandType.Text
OracleDA.Fill(dataTable)

strStateIDs中的示例数据:

没有Server.HtmlEncode:

'ABC','XYZ','BLAH_BLAH'

Server.HtmlEncode之后:

&#39;ABC&#39;,&#39;XYZ&#39;,&#39;BLAH_BLAH&#39;

解决方案:

发布它,因为它可能对以后的人有所帮助。正如 Antonio Bakula 指出的那样,HtmlEncode 自 ASP.NET 4.0

以来对单引号进行编码

所以,我在 HtmlEncode 之后做了 strStateIDs = strStateIDs.Replace("&#39;", "'") 来解决这个问题。

一旦你对内容进行 HtmlEncode,它就变成了

"&#39;ABC&#39;,&#39;XYZ&#39;,&#39;BLAH_BLAH&#39;"

如您所见,查询中有分号,现在看起来像这样。

"SELECT <some columns> WHERE <some condition> AND <some column> IN ("&#39;ABC&#39;,&#39;XYZ&#39;,&#39;BLAH_BLAH&#39;") ORDER BY <some columns>" 

这使数据库假设您正在终止语句并开始新语句。

我假设您没有使用 SqlParameters 或其 Oracle 等效项是有原因的。假设您想继续使用这个基于字符串的选项,我会在 C# 中执行此操作。

   strLVQuery = string.Format(@"SELECT <some columns> WHERE <some condition> AND <some column> IN ('{0}') ORDER BY <some columns>",strStateIDs);

也许这会帮助您想出一个 VB 解决方案。

我真的不认为将在 SQL select 中使用的字符串需要 HtmlEncode。所以我的建议是删除 HtmlEncode。

此处记录了此功能不再起作用的原因: http://www.asp.net/whitepapers/aspnet4/breaking-changes#0.1__Toc256770143

顺便说一句。你的代码开放了SQL注入,请使用参数,详情在这里: https://msdn.microsoft.com/en-us/library/ff648339.aspx