Smart Friend Ответов: 3

Переход от байта к строке


Dim MemoryStream As New MemoryStream
PictureBox1.Image.Save(MemoryStream, System.Drawing.Imaging.ImageFormat.Bmp)
Dim Dgambar As Byte() = MemoryStream.GetBuffer
Dim Images As New SqlParameter("@Gambar", SqlDbType.Image)
Images.Value = Dgambar
Cmd.Parameters.Add(Images)


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

"INSERT INTO tbl_image VALUES('" & TextBox1.Text & "','" & ComboBox1.Text & "', '" & TextBox2.Text & "', '" & TextBox3.Text & "', @Gambar) "

3 Ответов

Рейтинг:
1

MadMyche

Никогда не создавайте команду, соединяя строки с пользовательскими записями; вы должны использовать параметры для всех введенных значений.

Все, что я действительно сделал, это избавился от уязвимости SQL-инъекции, которую вы имеете в исходном коде, и добавил некоторые вещи, которые вы можете попробовать; VB-это не мой родной язык, но именно так я бы в основном сделал это в C#

Dim MemoryStream As New MemoryStream
PictureBox1.Image.Save(MemoryStream, System.Drawing.Imaging.ImageFormat.Bmp)

' could try Dim Dgambar As Byte() = MemoryStream.ToArray() 
' and skip the next line
Dim Dgambar As Byte() = MemoryStream.GetBuffer


Dim cmd as New SqlCommand("INSERT tbl_image VALUES(@TB1, @CB1, @TB2, @TB3, @Gambar)", {connstring})

' could try Cmd.Parameters.AddWithValue("@Gambar", Dgambar)
' and skip the next three lines
Dim Images As New SqlParameter("@Gambar", SqlDbType.Image)
Images.Value = Dgambar
Cmd.Parameters.Add(Images)

Cmd.Parameters.AddWithValue("@TB1", TextBox1.Text)
Cmd.Parameters.AddWithValue("@CB2", ComboBox1.Text)
Cmd.Parameters.AddWithValue("@TB2", TextBox2.Text)
Cmd.Parameters.AddWithValue("@TB3", TextBox3.Text)


Maciej Los

5ed!

Рейтинг:
0

Patrice T

Почему вы делаете запрос подлежащим инъекции, когда знаете решение?

"INSERT INTO tbl_image VALUES('" & TextBox1.Text & "','" & ComboBox1.Text & "', '" & TextBox2.Text & "', '" & TextBox3.Text & "', @Gambar) "

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


Maciej Los

5ed!

Patrice T

Спасибо

Рейтинг:
0

OriginalGriff

Как уже говорили Патрис и Мадмич, никогда не объединяйте строку для формирования SQL-команд.
Но есть и другие вещи, о которых вам нужно подумать.

Вы всегда должны перечислять столбцы, в которые вы хотите вставить свои данные:

INSERT INTO MyTable (Column1, Column2) VALUES (@C1, @C2)
Потому что если вы этого не сделаете, то SQL будет "начинаться сверху" и работать вниз по списку, что делает ваш код уязвимым для проблем, если определение таблицы будет переупорядочено. А поскольку большинство таблиц начинаются с строки идентификатора, которая часто является либо IDENTITY, либо UNIQUEIDENTIFIER, вам нужно "пропустить" эту строку перед вставкой данных в новую строку, поскольку вы не можете указать значение строки идентификатора, которое предоставляется самой БД. Даже если эта таблица не включает столбец идентификатора (и он почти наверняка показывает!), это хорошая практика, чтобы быть конкретным об этих вещах, поскольку это предотвращает повреждение данных, которое может быть ужасной ручной работой, чтобы разобраться, когда это наконец замечено.

Сделайте себе одолжение и прекратите использовать имена Visual Studio по умолчанию для всего - вы можете помнить, что "TextBox8" - это номер мобильного телефона сегодня, но когда вам нужно будет изменить его через три недели, вы это сделаете? Используйте описательные имена - например, "tbMobileNo", - и ваш код станет легче читать, более самодокументируемым, легче поддерживать - и на удивление быстрее кодировать, потому что Intellisense может добраться до "tbMobile" за три нажатия клавиш, где "TextBox8" занимает размышление и 8 нажатий клавиш...