Member 11856456 Ответов: 2

Может заявление хранимую процедуру sp_rename использоваться с параметрами?


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

вот мой код:

Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click

       Dim ipb As String
       ipb = InputBox("New column name")

       Try

           Dim sqlcon As New SqlConnection("sqlconnectionstring")

           sqlcon.Open()
           Dim cmd As SqlClient.SqlCommand

           Dim sql As String = "EXEC sp_rename " + "'" + Form4.ListView1.SelectedItems.Item(0).Text.ToString + "." + ListView1.SelectedItems.Item(0).Text.ToString + "'" + ", '" + ipb.ToString + "', " + "'COLUMN'"
           cmd = New SqlClient.SqlCommand(sql, sqlcon)

           MessageBox.Show(sql.ToString)

           cmd.ExecuteNonQuery()
           sqlcon.Close()

       Catch ex As Exception

       End Try

   End Sub


Что я уже пробовал:

пробовал использовать cmd. parameters.addwithvalue(@columnname, ipd. tostring), но я предполагаю, что он не работает, потому что у него есть ссылка?

ZurdoDev

Я вас не совсем понимаю.

Member 11856456

Я пытаюсь преобразовать свой SQL-оператор в параметры, чтобы у меня не было никаких шансов на sql-инъекции. Я хочу включить addwithvalue с помощью поля ввода (ipb).

2 Ответов

Рейтинг:
20

OriginalGriff

Да, они могут. Все, что вам нужно сделать, это сопоставить имена параметров.
Если у вас есть эта хранимая процедура:

CREATE PROC [dbo].Sample
@Name varchar(100)
AS
BEGIN
SELECT * FROM myTable WHERE @Name=Username;
END

Тогда вы можете назвать это так:
using (SqlConnection con = new SqlConnection(strConnect))
    {
    con.Open();
    using (SqlCommand com = new SqlCommand("Sample", con))
        {
        com.CommandType = CommandType.StoredProcedure;
        com.Parameters.AddWithValue("@Name", myNameTextBox.Text);
        using (SqlDataReader read = com.ExecuteReader())
            {
            while (read.Read())
                {
                ...
                }
            }
        }
    }


Рейтинг:
2

Patrice T

Не решение вашего вопроса, а еще одна проблема, которая у вас есть.
Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь уязвимости под названием "SQL injection", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа рухнет. Если пользователь вводит имя типа "Брайан О'Коннер", это может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция-Википедия[^]
SQL-инъекция[^]


Richard Deeming

Это на самом деле проблема, которую пытается решить ОП! :Д

Patrice T

Упс, не уверен, что первая версия была явной.