我正在将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
之后:
'ABC','XYZ','BLAH_BLAH'
SOLUTION:
发布它可能会对某人有所帮助..正如Antonio Bakula指出的那样,HtmlEncode
编码自ASP.NET 4.0以来的单引号
所以,我在strStateIDs = strStateIDs.Replace("'", "'")
之后HtmlEncode
解决了这个问题。
答案 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就会变成
"'ABC','XYZ','BLAH_BLAH'"
正如您所看到的,您的查询中有半冒号,因为它现在看起来像这样。
"SELECT <some columns> WHERE <some condition> AND <some column> IN ("'ABC','XYZ','BLAH_BLAH'") 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解决方案。