В MySQL / SQL возможно ли использовать параметры в качестве имени поля / столбца? - PullRequest
1 голос
/ 24 января 2020

Я пытаюсь преобразовать некоторые из моих операторов SQL для использования параметров вместо простого добавления значений, а некоторые из моих операторов требуют ввода используемого столбца, а также значения для поиска.

Вот несколько примеров: на других языках, однако я должен написать это в ASP Classi c, и я не очень знаком с тем, как на самом деле работают параметры в ADODB.Command

Это упрощенная функция, которую я пробовал сделать ...

Function GetUser(environment, key, value)
    Dim statement, cmd
    Set cmd = Server.CreateObject("ADODB.Command")

    statement = "SELECT * FROM USERS WHERE "
    cmd.Parameters.Append cmd.CreateParameter(, adChar, adParamInput, 50, key)
    cmd.Parameters.Append cmd.CreateParameter(, adChar, adParamInput, 50, value)
    statement = statement & " ? = ? "

    cmd.Parameters.Append cmd.CreateParameter(, adInteger, adParamInput, , environment)
    statement = statement & " AND user_environment = ?"

    cmd.ActiveConnection = conn
    cmd.CommandType = adCmdText
    cmd.CommandTimeout = 900
    cmd.CommandText = statement

    Set GetUser = cmd.Execute

    Set cmd = Nothing
End Function

Я понимаю, что при нормальном использовании параметров он в основном сохраняет значение в формате, заданном типом ввода. При этом, насколько мне известно, подготовленный оператор будет выглядеть примерно так:

SELECT * FROM users WHERE 'user_id' = '1' AND user_environment = 2;

Этот оператор, включенный в sql, работает, однако при выполнении я всегда получаю 0 результатов.

При этом, мой вопрос, есть ли способ достичь того, что я пытаюсь сделать? Мне в значительной степени нужно иметь возможность отправить имя столбца, а также значение, которое будет найдено для этой функции, но я должен быть в состоянии защитить его от sql инъекций.

1 Ответ

0 голосов
/ 25 марта 2020

Как правило, предложение WHERE 'user_id' = '1' AND user_environment = 2

предписывает базе данных возвращать записи, где

  1. абстрактная строка 'user_id' равна абстрактной строке '1' (FALSE)
  2. user_environment = 2 (может быть ИСТИНА или ЛОЖЬ в зависимости от данных)
  3. И оператор требует, чтобы оба условия были ИСТИНА, то есть ЛОЖЬ из-за 1

Это может потенциально " работать "только когда есть ИЛИ вместо ИЛИ, или 'user_id' = 'user_id'.

Есть несколько вариантов, чтобы сделать то, что вы хотите, и самый простой способ, вероятно, это использовать ASP для подготовьте правильное утверждение, то есть

'statement = statement & " ? = ? " <-- comment this out

if (key="user_id" OR key="column2") then 
   statement = statement & " " & key & " = ? "
else
   Response.Write "Error"
   Response.End
end if   

, поэтому оно будет работать только в том случае, если ключ имеет значение user_id или column2.

Другим вариантом будет использование определения другой функции, например

Function GetUser(environment, value1, value2, value3)
...

где вы снова можете проверить, какое значение не равно нулю, и подготовить требуемое предложение WHERE.

Еще одна идея - использовать предложение dynamici c WHERE, т.е. оно будет работать как

where 
(user_id=@v1 OR @v1 IS NULL)
and (othercolumn=@v2 OR @v2 IS NULL)
...

, но это будет излишним и, вероятно, не имеет смысла, если вы используете adCmdText.

...