Server.HtmlEncode导致ODP.NET错误

时间:2015-05-07 12:32:04

标签: asp.net vb.net oracle odp.net html-encode

我正在将Framework v3.5版本迁移到v4.5并使用ODP.NET从Oracle更新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;

SOLUTION:

发布它可能会对某人有所帮助..正如Antonio Bakula指出的那样,HtmlEncode编码自ASP.NET 4.0以来的单引号

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

2 个答案:

答案 0 :(得分:1)

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

此处不再使用此原因的原因如下: http://www.asp.net/whitepapers/aspnet4/breaking-changes#0.1__Toc256770143

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

答案 1 :(得分:0)

一旦你对内容进行了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>" 

这使得db假设您正在终止语句并开始新语句。

我假设你没有使用SqlParameter或他们的Oracle等价物。假设您想继续使用这个基于字符串的选项,我会在C#中执行此操作。

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

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