Можно сказать, что в программировании ASP широко используется аутентификация личности. Но как мы можем обеспечить безопасность аутентификации?
Страница отправки формы: sub.htm
<html>
<голова>
<title>Вход администратора</title>
<тело>
<имя формы=метод form1=post action=sub.asp>
<p>Администратор:
<тип ввода=текстовое имя=размер идентификатора пользователя=25 максимальная длина=20>
пароль:
<тип ввода=текстовое имя=размер прохода=12 максимальная длина=20>
<тип ввода=имя отправки=Отправить значение=Отправить>
</p>
</форма>
</тело>
</html>
Программа SUB.asp
<%
Получить данные из формы
пользователь = request.from (ID пользователя)
Проверьте, пусты ли данные, отправленные формой (вы можете использовать JAVASCRIPT или VBSCRIPT для управления страницей формы, но не забудьте управлять ими здесь!
если пользователь= тогда
Перейдите на страницу сообщения об ошибке!
ответ.перенаправление err1.htm
Возможно, это предложение бесполезно, но его стоит добавить!
ответ.конец
конец, если
pass=request.from(Пропустить)
если пройти = тогда
ответ.перенаправление err2.htm
ответ.конец
конец, если
Присоединиться к базе данных
file=server.mappath(ваша база данных)
set conn=server.createobject(adodb.connection)
dr=driver={драйвер доступа Microsoft (*.mdb)};dbq=&file
конн.открытый доктор
установите rs=server.createobject(adodb.recordset)
Ключевым моментом здесь является язык SQL
sql=select * из таблицы, где user= &user& и pass= &pass&
rs.opensql
если не rs.eof, то
Если вы его нашли, перейдите на страницу управления.
ответ.перенаправление login.asp
еще
Если он не найден, вы попадете на страницу с ошибкой.
ответ.запись err3.htm
конец, если
%>
Все считают, что с приведенным выше кодом все в порядке, но здесь существует серьезная угроза безопасности:
Если я хочу войти в систему как администратор, я могу ввести в поле ввода формы SUb.htm:
Введите в первое текстовое поле: a или 1 = 1 или OR =
Введите во второе текстовое поле: a или 1 = 1 или OR =
Подай, все увидят... Ой, послушай меня, ладно, я потом кирпичи перекину...
a и 1 — любые символы
Некоторые люди могут спросить, почему вы вводите эти символы, чтобы войти в качестве администратора? ?
На самом деле эти символы используются для того, чтобы обмануть язык SQL в вашей программе и успешно ввести его.
Как видите: в стартовой программе SQL в таблице запрашиваются записи, удовлетворяющие условиям user= &user& и pass= &pass&.
sql=select * из таблицы, где user= &user& и pass= &pass&
После того, как я ввел приведенный выше код, он стал:
sql=select * из таблицы, где user= a или 1 = 1 и pass= a или 1 = 1
Давайте посмотрим, есть ли причина не входить? ? Сначала назови мне причину не входить!
Вышеуказанное поле USER PASS имеет символьный тип, и то же самое верно, если оно имеет числовой тип!
Решение:
1. Метод замены функций:
Используйте REPLACE для замены специальных символов, содержащихся в введенном пользователем содержимом, для достижения целей управления! sql=select * из таблицы, где user= &replace(user, , )& и pass= &replace(pass, , )&
Этот метод может заменять только один символ за раз. Фактически, следует контролировать не только опасные символы, но и такие символы, как >, <, &, % и т. д. Но что мне делать, если мне кажется, что я не могу использовать функцию REPLACE? ?
2. Программный метод управления
Используйте программу для контроля всего контента, вводимого клиентом, чтобы можно было полностью контролировать любые возможные опасные символы или коды, вводимые пользователем. Это мой метод!
<%
Захват содержимого формы, отправленного пользователем
пользователь = request.from (пользователь)
pass=request.from(пройти)
...
Начинается управление контуром
от i=1 до len(пользователь)
Используйте функцию MID, чтобы прочитать символ в позиции i в переменной user.
нас = середина (пользователь, я, 1)
Сравнить прочитанные символы
если us= или us=% или us=< или us=> или us=&, то
Если он содержит указанные выше символы, появится сообщение об ошибке. Он не может содержать указанные выше специальные символы.
ответ.перенаправление err2.htm
ответ.конец
конец, если
следующий
...
%>