一尘不染

防止在Oracle中进行SQL注入

sql

首先我尝试使用以下代码

strQuery = @"SELECT PASSWORD FROM IBK_USERS where upper(user_id) =upper('" + UserPrefix + "')";

try
{
    ocommand = new OracleCommand();
    if (db.GetConnection().State == ConnectionState.Open)
    {
        ocommand.CommandText = strQuery;
        ocommand.Connection = db.GetConnection();                       
        odatareader = ocommand.ExecuteReader();
        odatareader.Read();

最后我转换了上面的查询以防止像这样的SQL注入

strQuery = @"SELECT PASSWORD FROM IBK_USERS where upper(user_id) =upper(:UserPrefix)";
try
{
    ocommand = new OracleCommand();
    if (db.GetConnection().State == ConnectionState.Open)
    {
        ocommand.CommandText = strQuery;
        ocommand.Connection = db.GetConnection();

        ocommand.Parameters.Add(":UserPrefix",OracleDbType.Varchar2,ParameterDirection.Input);
        ocommand.Parameters[":UserPrefix"].Value = UserPrefix;
        odatareader = ocommand.ExecuteReader();

但这不起作用


阅读 237

收藏
2021-05-16

共1个答案

一尘不染

删除参数名称前面的冒号。所以代替…

ocommand.Parameters.Add(":UserPrefix", ...);

…做这个…

ocommand.Parameters.Add("UserPrefix", ...);

同上,用于设置参数值。


与您的问题没有直接关系:upper(user_id)在WHERE子句中使用可能需要基于函数的索引才能有效运行。另外,user_id真的需要一个字符串吗?您是否只能将其设置为整数?

2021-05-16