Edward Mergel Ответов: 1

Регулярное выражение валидатор выражение валидации


Страница формы для отправки вопросов постоянно выдает мне сообщение об ошибке, и я не могу понять почему. Единственное, что мне не нужны такие "Н1 - Н4" атрибутами, &ЛТ;вход &ЛТ;A и . С вопросами и ответами нужно уметь разрешать все остальное. Однако, введя следующее в текстовое поле, я получаю сообщение об ошибке, сообщающее мне, что мой вопрос не вейлд.

Вводится вопрос: как лучше всего остановить звон, жужжание, которое я слышу

Выдает сообщение об ошибке postNewQuestion.aspx RegularExpressionValidator.

Если я удалю RegularExpressionValidator со страницы и попытаюсь отправить вопрос в базу данных access, то вместо этого получу следующую ошибку:

Ошибка сервера в приложении'/'.

Несоответствие типов данных в выражении критериев.

Описание: необработанное исключение возникло во время выполнения текущего веб-запроса. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.

Сведения Об Исключении: System.Данных.Oledb. OleDbException: несоответствие типов данных в выражении критериев.

Ошибка Источника:


Строка 26: com.Свойства commandtext = "вставить в значения QuestionList('" + qid по + "','" + текстовое поле textbox1.Текст + "','" + DropDownList1.SelectedValue + "','" + Датавремя.Сейчас.ToLongDateString() + "','" + сессии("участник") + "')"
Строка 27: кон.Открыть()
Строка 28: com.Метод executenonquery()
Строка 29: Dim pointCnt как новый DataTable
Строка 30: pointDs = New OleDbDataAdapter ("select [points] from Points where Member='" + Session ("member") +"'", con)

Исходный Файл: E:\hosting\blueeyeweb\postNewQuestion.aspx.vb Строка: 28

трассировка стека:


[OleDbException (0x80040e07): несоответствие типов данных в выражении критериев.]
Системы.Данных.Oledb для.Объект oledbcommand.ExecuteCommandTextErrorHandling(OleDbHResult hr) +1007584
Системы.Данных.Oledb для.Объект oledbcommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult) +255
Системы.Данных.Oledb для.Объект oledbcommand.ExecuteCommandText (Object&executeResult) +188
Системы.Данных.Oledb для.Объект oledbcommand.ExecuteCommand(CommandBehavior behavior, Object&executeResult) +58
Системы.Данных.Oledb для.Объект oledbcommand.ExecuteReaderInternal(CommandBehavior behavior, String method) +161
Системы.Данных.Oledb для.Объект oledbcommand.ExecuteNonQuery() +113
postNewQuestion.Обработчика button1_click(объект отправителя, EventArgs В Е) в E:\hosting\blueeyeweb\postNewQuestion.aspx.vb:28
Системы.Веб.Пользовательского интерфейса.WebControls.Кнопка.OnClick(EventArgs e) +111
Системы.Веб.Пользовательского интерфейса.WebControls.Кнопка.RaisePostBackEvent(String eventArgument) +110
Системы.Веб.Пользовательского интерфейса.WebControls.Кнопка.Системы.Веб.Пользовательского интерфейса.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10
System. Web.UI.Page. RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
System.Web.UI.Page. RaisePostBackEvent(NameValueCollection postData) +36
Системы.Веб.Пользовательского интерфейса.Страницы.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1565

&ЛТ;б&ГТ;то, что я пробовала:&ЛТ;/б&ГТ;

postNewQuestion.aspx-файл

< pre>
&амп;ЛТ;АСП:текстовое поле с ID="элемент textbox1" атрибут runat="сервер" стиль="текст-выровняйте: оставленный" текстовую="многострочные" ширина="313px" Высота="140px" CssClass="polbx"&ГТ;&амп;ЛТ;/АСП:текстовое поле&ГТ;&амп;ЛТ;БР /&ГТ;

&амп;ЛТ;в ASP:RegularExpressionValidator идентификатор="RegularExpressionValidator1" атрибут runat="сервер" сообщение об ошибке="*" ValidationExpression="[^\&амп;ЛТ;\> У\'\@]" ControlToValidate="элемент textbox1"&ГТ;&амп;ЛТ;/в ASP:RegularExpressionValidator&ГТ;

& lt; center> & amp;lt; asp: Button ID= "Button1" runat=" server "Text= " Ask Question" /> & amp;lt;/center>

&амп;ЛТ;АСП:метка идентификатор="errMessage" атрибут runat="сервер" шрифт-жирный="истинный" размер шрифта="средний" цвет="#FF3300" ширина="100%"&ГТ;&амп;ЛТ;/АСП:ярлык&ГТ;
< / pre>

postNewQuestion.aspx-файл.ВБ
< pre>
Дим скока, pointDs как объект oledbdataadapter
Dim con как OleDbConnection
Dim com как новая OleDbCommand
Дим недействительными() как String = {"&амп;ЛТ;Н1&ГТ;", "&амп;ЛТ;сценарий>", "&амп;ЛТ;Н2&ГТ;", "&амп;ЛТ;вход", "&амп;ЛТ;Н3 и GT;", "&амп;ЛТ;а", "&амп;ЛТ;Н4&ГТ;"}

Защищенные суб обработчика button1_click(как byval отправителя как объект, как byval E Как системы.EventArgs) Обрабатывает Button1.Щелчок
Если Кнопка 1.Text = "Задать Вопрос" Тогда
Если Textbox1.Текст &амп;ЛТ;&ГТ; "" тогда
Для каждого s как строка в invalid
Если Textbox1.Текст.Возможны два случая.Тогда Contains (s) = True
errMessage.Текст = Сервер.Функция htmlencode("не может содержать &амп;ЛТ;Н1&ГТ;,&амп;ЛТ;сценарий>,&амп;ЛТ;входной&ГТ;,&амп;ЛТ;а&ГТ; и т. д. теги")
Выход Из Субмарины
Конец, Если
Следующий
кон = новый объект oledbconnection("поставщик=Майкрософт.Джет.Oledb для.4.0 ;Источник данных=" &амп; сервера.MapPath ("app_data/SimpleQSet. mdb") & ";")

ком.Подключение = кон
Сессия ("член") = " Чарльз Смит"
Дим бежал как новый Рэндом
Dim qid As String = ran. Next(0, TextBox1. Text. Length)
ком.Свойства commandtext = "вставить в значения QuestionList('" + qid по + "','" + текстовое поле textbox1.Текст + "','" + DropDownList1.SelectedValue + "','" + Датавремя.Сейчас.ToLongDateString() + "','" + сессии("участник") + "')"
против.Открыть()
ком.Метод executenonquery()
Dim pointCnt как новый DataTable
pointDs = новый объект oledbdataadapter("выберите [точек] из точек, где член='" + сессии("участник") + "'", кон)
pointDs. Fill(pointCnt)
Dim pnt As Integer = pointCnt. Rows(0) (0) + 1
ком.Свойства commandtext = "точек обновления установить [очки]='" &усилитель; ПНТ &ампер; "' где член='" &амп; сессии("участник") &ампер; "'"
ком.Метод executenonquery()
против.Закрывать()
Еще
errMessage.Text = " Вопрос Не Может Быть Пустым"
Конец, Если
Еще
Ответ.Перенаправление ("~/postNewQuestion-Confirmed.aspx")
Конец, Если

против.Закрывать()

Конец Подводной Лодки
< / pre>

postNewQuestion.aspx-файл.ВБ - &ЛТ;б&ГТ;полный код&ЛТ;/б&ГТ;

& lt;pre & gt;импортирует System. Data.Для oledb
Система Импорта.Сведения

Частичный класс postNewQuestion
Наследует System.Веб.Пользовательского интерфейса.Страницы

Дим скока, pointDs как объект oledbdataadapter
Dim con как OleDbConnection
Dim com как новая OleDbCommand
Дим недействительными() как String = {"&амп;ЛТ;Н1&ГТ;", "&амп;ЛТ;сценарий>", "&амп;ЛТ;Н2&ГТ;", "&амп;ЛТ;вход", "&амп;ЛТ;Н3 и GT;", "&амп;ЛТ;а", "&амп;ЛТ;Н4&ГТ;"}
Защищенные суб обработчика button1_click(как byval отправителя как объект, как byval E Как системы.EventArgs) Обрабатывает Button1.Щелчок
Если Кнопка 1.Text = "Задать Вопрос" Тогда
Если Textbox1.Текст &амп;ЛТ;&ГТ; "" тогда
Для каждого s как строка в invalid
Если Textbox1.Текст.Возможны два случая.Тогда Contains (s) = True
errMessage.Текст = Сервер.Функция htmlencode("не может содержать &амп;ЛТ;Н1&ГТ;,&амп;ЛТ;сценарий>,&амп;ЛТ;входной&ГТ;,&амп;ЛТ;а&ГТ; и т. д. теги")
Выход Из Субмарины
Конец, Если
Следующий
кон = новый объект oledbconnection("поставщик=Майкрософт.Джет.Oledb для.4.0 ;Источник данных=" &амп; сервера.MapPath ("app_data/SimpleQSet. mdb") & ";")

ком.Подключение = кон
Сессия ("член") = " Чарльз Смит"
Дим бежал как новый Рэндом
Dim qid As String = ran. Next(0, TextBox1. Text. Length)
ком.Свойства commandtext = "вставить в значения QuestionList('" + qid по + "','" + текстовое поле textbox1.Текст + "','" + DropDownList1.SelectedValue + "','" + Датавремя.Сейчас.ToLongDateString() + "','" + сессии("участник") + "')"
против.Открыть()
ком.Метод executenonquery()
Dim pointCnt как новый DataTable
pointDs = новый объект oledbdataadapter("выберите [точек] из точек, где член='" + сессии("участник") + "'", кон)
pointDs. Fill(pointCnt)
Dim pnt As Integer = pointCnt. Rows(0) (0) + 1
ком.Свойства commandtext = "точек обновления установить [очки]='" &усилитель; ПНТ &ампер; "' где член='" &амп; сессии("участник") &ампер; "'"
ком.Метод executenonquery()
против.Закрывать()
Еще
errMessage.Text = " Вопрос Не Может Быть Пустым"
Конец, Если
Еще
Ответ.Перенаправление ("~/postNewQuestion-Confirmed.aspx")
Конец, Если

против.Закрывать()

Конец Подводной Лодки

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Обрабатывает Меня. Load
Если Session ("member") = Nothing, то
Кнопка 1.Text = " войдите в систему, чтобы задать вопрос"
Конец, Если
Конец Подводной Лодки

Защищенные суб Page_int(как byval отправителя как объект, как byval E Как системы.EventArgs) Обрабатывает Меня. Load
Если Session ("member") = Nothing, то

Ответ.Перенаправление ("error42059loginrequired.aspx")

Конец, Если
Конец Подводной Лодки
Конец Класса
< / pre>

1 Ответов

Рейтинг:
10

OriginalGriff

Перестань так делать!
Никогда не объединяйте строки для построения SQL-команды. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого используйте параметризованные запросы.

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку с точки зрения SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x'; DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?

И... когда вы это исправите, многие Ваши проблемы исчезнут ...


Edward Mergel

Спасибо, и да, я делаю резервную копию на заданной частоте