SQL-запрос должен выглядеть примерно так:
UPDATE MyTable SET Name='Artyom' WHERE id=10
У тебя одинарные кавычки неставятся, перед received нет пробела с запятой, плюс код легко пробиваем через SQL Injection (если интересно, потом покажу как можно через этот безобидный код поудалять все таблицы из твоей БД (ты ж с правами db_owner работаешь, не так ли? )
Короче вот как надо:
Dim Comm As New SqlCommand("UPDATE Accident SET AcceptedBy=@AcceptedBy, Received=GetDate() WHERE Accident_ID=@ID", Conn)
Comm.Parameters.Add("@AcceptedBy", Data.SqlDbType.VarChar, 64).Value = TextBox1.Text
Comm.Parameters.Add("@ID", Data.SqlDbType.Int).Value = ListBox1.SelectedValue
Comm.ExecuteNonQuery()
Dim SQL As String = "SELECT * FROM Users WHERE UserName='" + UserName.Text + "'"
' Выполняем запрос
Если в поле UserName я ввожу Artyom, то реально мы получаем такой запрос:
SELECT * FROM Users WHERE UserName='Artyom'
Совершенно ничего криминального.
Но в поле UserName мне никто не мешает ввести какую-нибудь бяку, например: ' OR 1=1 --
Реально после конкатенции мы получаем:
SELECT * FROM Users WHERE UserName='' OR 1=1 --'
Как видим, не большая модификация запроса - в результате запрос нам выберет информацию обо всех пользователях (так как 1 всегода равно 1). То что идет после -- в SQL считается комментарием и игнорируется.
Это в принципе не самый вредоносный код, тем не менее уже неприятен.
Можно пойти дальше - ввести в поле следующее:
'; DELETE FROM Users --
После конкатенции получаем:
SELECT * FROM Users WHERE UserName=''; DELETE FROM Users --'
Два запроса (разделенные символом ; SQL Server без проблем последовательно выполнит, первая часть ничего криминального не сделает, вторая - поудаляет все записи из БД - неприятно так сказать...
Если само веб-приложение сделано через заднее место и не дай бог выводит при появлении исключения полную информацию о нему - описание ошибки, содержимое стека и кусок кода в котором произошла ошибка, то, запясясь терпением и знанием SQL можно поочередными запросами получить информацию о схеме базы данных, делать Select интерисующих полей, к примеру - получить список пользователей на сайте, из E-mail'ы, пароли (если они хранятся не дай бог в чистом виде, а не зашифроваными или захешироваными)...
Как защититься от этого - проще всего использовать параметризованые запросы (см #1) - при этом что бы не ввели в поле, вредоносный код выполнен не будет, тк конкатенция не происходит.
Навесное альтернативное решение - использовать конкатенцию, но в строках заменять все символы одинарной кавычки двумя символами одинарной кавычки. Это работает как дублирование кавычек в VB, чтоб вставить в строку кавычку.
типа:
[CODE]Dim SQL As String = "SELECT * FROM Users WHERE UserName='" + UserName.Text.Replace("'", "''" + "'"
Решение не совсем удачное, но защищает от атак, самый удачный вариант, как я и говорил, использование параметризированых запросов - они и выглядят красивее, читаются легче, и от SQLI защищают, и работают быстрее.
Пожалуйста, не пытайтесь повторить описаное здесь дома - эти приемы выполняются только професиональными программистами исключительно в демонстрационных целях на тестовых приложениях!!!
Сижу я ночю, хакаю сайт пентагона, допиваю чашку кофе... Удивительно, но как только кофе закончилось, пришла вдруг мысль, что запросы к бд не фильтруются... И тут я конечно побежал... за ещё одной чашкой кофе. Но об порог я споткнулся и упал сильно ударившись головой, после чего потерял сознание. Пока я был без сознания, мне приснился запрос к бд, позволяющий выполнить sql инъекцию на сайте пантагона. Когда я проснулся, было уже утро, и я мигом сел за комп, воссоздать этот запрос из сна. Сейчас объясню вкраце в чем была суть этого запроса.
<предыдущий пост Brand'a>
Вот так и взломал сайт пентагона. Оказывается и в таких защищеных системах есть дыры, и это не единственная... продолжайте искать, кто ищет то всегда найдет! Желаю удачи Удачного взлома всмысле.
HACKER, смех-смехом.. а между тем-это вполне реальные дыры... и для мало-мальски разбирающегося в SQL чела не составит никакого труда дропнуть всю базу, хотя бы по частям ... Дело лишь за малым - найти поле, где запрос идет через конкатеацию...
Да уж... вот конкурс глючных историй был , а вот статей ещё не было
Надо вот топ создать куда будем кидать свои идеи в два -три абзаца, которые вобщем то такие же глючные как те истории про черепашку или мою идею, пришедшую во сне кстати, о том как можно закрепить плоскость на двух точках...
Ну вот я попробую первый... то есть второй после хакера, которого от всего сердца ксатит поздравляем с преобретением нового титула...
Короче, идея вот в чём, что в интервале, у которго одна из границ - бесконечность - надо ставить не круглые скобки, а квадратные, иначе одно число (самое крайнее, равное лимиту от н=инфинити) не войдёт в этот интервал, так что... завтра начнём перепечатывать все учебники...
Так же может и добавим метод проверки числа на тот факт , является ли оно простым или нет
Dim Post As Post = Posts.GetByTopicIDAndNumber(122460, 5)
Posts.Text = Posts.Text.Replace("сайт пентагона", "сайт VBNET"
Posts.Save(Post)
Зачетный пост получится Гарантирую что снимают две звезды и ставят череп
HACKER, смех-смехом.. а между тем-это вполне реальные дыры... и для мало-мальски разбирающегося в SQL чела не составит никакого труда дропнуть всю базу, хотя бы по частям ... Дело лишь за малым - найти поле, где запрос идет через конкатеацию...
Ага. Даже на крупных сайтах с огромной посещаемостью остаются еще кучи таких дыр, особенно это касается сайтов написанных на asp - даже на этом сайте ранше были дыры SQL Injection
все сделала имеено так
Dim Comm As New SqlCommand("UPDATE Accident SET AcceptedBy=@AcceptedBy, Received=GetDate() WHERE Accident_ID=@ID", Conn)
Comm.Parameters.Add("@AcceptedBy", Data.SqlDbType.VarChar, 64).Value = TextBox1.Text
Comm.Parameters.Add("@ID", Data.SqlDbType.Int).Value = ListBox1.SelectedValue
Comm.ExecuteNonQuery()
не запучкает страницу и ругается что input string was not in correct format. уже все преобразования перепробовала..