Можно сказать, что в программировании ASP широко используется аутентификация личности. Но как мы можем обеспечить безопасность аутентификации?
Страница отправки формы: sub.htm
<html>
<голова>
<title>Вход администратора</title>
<тело>
<form name="form1" Method="post" action="sub.asp">
<p>Администратор:
<input type="text" name="UserID" size="25" maxlength="20">
пароль:
<input type="text" name="Pass" size="12" maxlength="20">
<input type="submit" name="Submit" value="Submit">
</p>
</форма>
</тело>
</html>
Программа SUB.asp
<%
Получить данные из формы
user=request.from("Идентификатор пользователя")
Проверьте, пусты ли данные, отправленные формой (вы можете использовать JAVASCRIPT или VBSCRIPT для управления страницей формы, но не забудьте управлять ими здесь!
если пользователь="" тогда
Перейдите на страницу сообщения об ошибке!
ответ.перенаправление "err1.htm"
Возможно, это предложение бесполезно, но его стоит добавить!
ответ.конец
конец, если
pass=request.from("Пропустить")
если пройти="" тогда
ответ.перенаправление "err2.htm"
ответ.конец
конец, если
Присоединиться к базе данных
file=server.mappath("ваша база данных")
set conn=server.createobject("adodb.connection")
dr="driver={драйвер доступа Microsoft (*.mdb)};dbq="&file
конн.открытый доктор
set rs=server.createobject("adodb.recordset")
Ключевым моментом здесь является язык SQL.
sql="выберите * из таблицы, где user="&user&" и pass="&pass&" "
rs.open sql
если не rs.eof, то
Если вы его нашли, перейдите на страницу управления.
ответ.перенаправление "login.asp"
еще
Если он не найден, вы попадете на страницу с ошибкой.
ответ.напишите "err3.htm"
конец, если
%>
Все считают, что с приведенным выше кодом все в порядке, но здесь существует серьезная угроза безопасности:
если я хочу войти в систему с правами администратора, я могу ввести его в поле ввода формы SUb.htm:
Введите в первое текстовое поле: a или 1 = 1 или OR =
Введите во второе текстовое поле: a или 1 = 1 или OR =
Отправить, все увидят... «Ой, послушай меня, ладно, я потом кину кирпичи...»
«a» и «1» — это любые символы.
Некоторые могут спросить, почему вы вводите эти символы как администратор? ?
На самом деле эти символы являются обманом языка SQL в вашей программе. Для тех, кто успешно ввел,
смотрите: При запуске программы SQL в таблице запрашиваются записи, соответствующие user="&user&" и pass=". &pass&" "conditions
sql="select * from table, где user="&user&" and pass="&pass&" "
После того, как я ввел приведенный выше код, он стал следующим:
sql="select * from table, где user= a или 1 = 1 и pass= a или 1 = 1 "
Давайте посмотрим, есть ли причина не входить? ? Дайте мне причину не входить!
То же самое верно, если вышеуказанное поле USER PASS является числовым!
Решение:
1.
Используйте REPLACE Замените специальные символы в содержимом, введенном пользователем, для достижения целей управления! sql="select * from table, где 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"
ответ.конец
конец, если
следующий
...
%>