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
之后:
'ABC','XYZ','BLAH_BLAH'
解决方案:
发布它,因为它可能对以后的人有所帮助。正如 Antonio Bakula 指出的那样,HtmlEncode
自 ASP.NET 4.0
以来对单引号进行编码
所以,我在 HtmlEncode
之后做了 strStateIDs = strStateIDs.Replace("'", "'")
来解决这个问题。
一旦你对内容进行 HtmlEncode,它就变成了
"'ABC','XYZ','BLAH_BLAH'"
如您所见,查询中有分号,现在看起来像这样。
"SELECT <some columns> WHERE <some condition> AND <some column> IN ("'ABC','XYZ','BLAH_BLAH'") ORDER BY <some columns>"
这使数据库假设您正在终止语句并开始新语句。
我假设您没有使用 SqlParameter
s 或其 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
我正在将 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
之后:
'ABC','XYZ','BLAH_BLAH'
解决方案:
发布它,因为它可能对以后的人有所帮助。正如 Antonio Bakula 指出的那样,HtmlEncode
自 ASP.NET 4.0
所以,我在 HtmlEncode
之后做了 strStateIDs = strStateIDs.Replace("'", "'")
来解决这个问题。
一旦你对内容进行 HtmlEncode,它就变成了
"'ABC','XYZ','BLAH_BLAH'"
如您所见,查询中有分号,现在看起来像这样。
"SELECT <some columns> WHERE <some condition> AND <some column> IN ("'ABC','XYZ','BLAH_BLAH'") ORDER BY <some columns>"
这使数据库假设您正在终止语句并开始新语句。
我假设您没有使用 SqlParameter
s 或其 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