Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - ASP и VBScript

Страница: 1 |

 

  Вопрос: В чем прблема? помогите новичку) Добавлено: 11.11.06 17:17  

Автор вопроса:  angelnl

       
 strsql = "update accident set accepted_by= " + TextBox1.Text + "received=Getdate() where accident_id=" + ListBox1.SelectedValue
 objcommand = New Data.SqlClient.SqlCommand(strsql, objconnection)
objcommand.ExecuteNonQuery()

Вот! ругается на incorrect syntax near "=". методом проб и ошибок, выяснила что на на этот:
accepted_by= " + TextBox1.Text
Подскажите,как правильно

Ответить

  Ответы Всего ответов: 11  

Номер ответа: 1
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #1 Добавлено: 11.11.06 17:37
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()

Ответить

Номер ответа: 2
Автор ответа:
 angelnl



Вопросов: 17
Ответов: 33
 Профиль | | #2 Добавлено: 11.11.06 18:01
вот спасибо, буду сейчас пробовать. а вот не очень поняла, как через код update можно все таблицы поудалять))?

Ответить

Номер ответа: 3
Автор ответа:
 Sacred Phoenix



ICQ: 304238252 

Вопросов: 52
Ответов: 927
 Профиль | | #3 Добавлено: 11.11.06 21:13
Brand, кстати правда, расскажи о SQL Injection

Ответить

Номер ответа: 4
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #4 Добавлено: 12.11.06 02:25
Ну к примеру есть у нас такой код:
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 защищают, и работают быстрее.

Пожалуйста, не пытайтесь повторить описаное здесь дома - эти приемы выполняются только професиональными программистами исключительно в демонстрационных целях на тестовых приложениях!!!

Ответить

Номер ответа: 5
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #5 Добавлено: 12.11.06 03:47
Целая статья получилась, нехватает только красок:

Сижу я ночю, хакаю сайт пентагона, допиваю чашку кофе... Удивительно, но как только кофе закончилось, пришла вдруг мысль, что запросы к бд не фильтруются... И тут я конечно побежал... за ещё одной чашкой кофе. Но об порог я споткнулся и упал сильно ударившись головой, после чего потерял сознание. Пока я был без сознания, мне приснился запрос к бд, позволяющий выполнить sql инъекцию на сайте пантагона. Когда я проснулся, было уже утро, и я мигом сел за комп, воссоздать этот запрос из сна. Сейчас объясню вкраце в чем была суть этого запроса.

<предыдущий пост Brand'a>

Вот так и взломал сайт пентагона. Оказывается и в таких защищеных системах есть дыры, и это не единственная... продолжайте искать, кто ищет то всегда найдет! Желаю удачи :) Удачного взлома всмысле.

:)))))

ну как? :) На лучшую статью вбнета тянет?

Ответить

Номер ответа: 6
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #6 Добавлено: 12.11.06 04:35
HACKER, смех-смехом.. а между тем-это вполне реальные дыры... и для мало-мальски разбирающегося в SQL чела не составит никакого труда дропнуть всю базу, хотя бы по частям ... Дело лишь за малым - найти поле, где запрос идет через конкатеацию...

Ответить

Номер ответа: 7
Автор ответа:
 Morpheus



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #7
Добавлено: 12.11.06 05:09
Да уж... вот конкурс глючных историй был , а вот статей ещё не было :-)
Надо вот топ создать куда будем кидать свои идеи в два -три абзаца, которые вобщем то такие же глючные как те истории про черепашку или мою идею, пришедшую во сне кстати, о том как можно закрепить плоскость на двух точках...

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

Короче, идея вот в чём, что в интервале, у которго одна из границ - бесконечность - надо ставить не круглые скобки, а квадратные, иначе одно число (самое крайнее, равное лимиту от н=инфинити) не войдёт в этот интервал, так что... завтра начнём перепечатывать все учебники...

Так же может и добавим метод проверки числа на тот факт , является ли оно простым или нет :)

Ответить

Номер ответа: 8
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #8 Добавлено: 12.11.06 13:43
2 Hacker: Гыгыгы

Dim Post As Post = Posts.GetByTopicIDAndNumber(122460, 5)
Posts.Text = Posts.Text.Replace("сайт пентагона", "сайт VBNET";)
Posts.Save(Post)

Зачетный пост получится :) Гарантирую что снимают две звезды и ставят череп :)

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

Ага. Даже на крупных сайтах с огромной посещаемостью остаются еще кучи таких дыр, особенно это касается сайтов написанных на asp - даже на этом сайте ранше были дыры SQL Injection :)

Ответить

Номер ответа: 9
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #9 Добавлено: 12.11.06 16:53
:) Интересно, сайт пентагона тоже на asp ? )))

Ответить

Номер ответа: 10
Автор ответа:
 angelnl



Вопросов: 17
Ответов: 33
 Профиль | | #10 Добавлено: 12.11.06 20:35
все сделала имеено так
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. уже все преобразования перепробовала..

Ответить

Номер ответа: 11
Автор ответа:
 angelnl



Вопросов: 17
Ответов: 33
 Профиль | | #11 Добавлено: 12.11.06 22:42
уже все ок..

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам