На прошлой неделе я сделал сайт для кого-то другого и случайно обнаружил, что в моей работе было много лазеек. Всего за 20 секунд я исправил это с помощью SQL-инъекции. Итак, я проверил некоторую информацию о SQL-инъекции и получил некоторые идеи. Надеюсь, я смогу поделиться ею с новичками. Эксперты смеются!
Общая идея атаки SQL-инъекцией:
Обнаружение мест внедрения SQL;
Определить тип сервера и тип фоновой базы данных;
Чтобы определить исполняемость
, некоторые злоумышленники обычно используют SQL-инъекцию. Далее я также расскажу о своих собственных представлениях о методе sql-инъекций.
Метод инъекции:
Теоретически веб-страница аутентификации будет выглядеть так:
Выберите * из администратора, где имя пользователя = 'XXX' и пароль = 'YYY'. Если перед официальным запуском этого оператора не выполняется необходимая фильтрация символов, можно легко реализовать SQL-инъекцию.
Например, введите в текстовое поле имени пользователя: abc' или 1=1. Введите в поле пароля: 123, тогда оператор SQL примет вид:
выберите * из администратора, где имя пользователя='abc' или 1=1 и пароль='123' Независимо от того, какое имя пользователя и пароль вводит пользователь, этот оператор всегда будет выполнен правильно, и пользователь может легко обмануть систему и получить легальный личность.
Угадайте решение:
Основная идея такова: угадать все имена баз данных, угадать каждое имя таблицы в базе данных, проанализировать имена таблиц, в которых могут храниться имена пользователей и пароли, угадать каждое имя поля в таблице, угадать каждую запись в содержимом таблицы.
Существует также способ получить имя вашей базы данных и имя каждой таблицы.
Просто получите имя своей базы данных и имя таблицы, сообщив об ошибке в форме: http://www .cn/news?id=10'!
Что касается jsp, мы обычно применяем следующие стратегии для решения этой проблемы:
1.Подготовленный оператор
Если вы уже являетесь среднепродвинутым разработчиком, вам всегда следует использовать ReadedStatement вместо Statement.
Вот несколько причин
1. Читабельность и ремонтопригодность кода.
2. ReadedStatement максимально повышает производительность.
3. Самое главное, что безопасность значительно улучшена.
До сих пор некоторые люди (включая меня) даже не знают основного синтаксиса злого SQL.
String sql = "select * from tb_name, где name= '"+varname+"' и passwd=""+varpasswd+"'";
'
1] в качестве имени. Пароль произвольный, посмотрим, каким он будет?
passwd = 'случайный';
Поскольку '1'='1' определенно истинно, оно может пройти любую проверку. Более того:
Передайте ['; drop table tb_name ] как varpasswd, затем:
select * from tb_name = 'any' и passwd = ''; drop table tb_name; Некоторые базы данных не позволят вам добиться успеха, но есть также много баз данных, которые могут выполнять эти инструкции.
А если вы используете предварительно скомпилированные операторы, любой передаваемый вами контент не будет иметь никакой связи с исходными операторами (предпосылка состоит в том, что сама база данных поддерживает предварительную компиляцию, но на стороне сервера не может быть баз данных, которые не поддерживают компиляцию. Это всего лишь несколько настольных баз данных, то есть тех, которые имеют прямой доступ к файлам. Поскольку все они используют предварительно скомпилированные операторы, вам не нужно выполнять какую-либо фильтрацию входящих данных. Если вы используете обычные операторы, вам, возможно, придется потратиться. много времени в раздумьях и т. д. Коварные суждения и чрезмерные размышления.
2. Регулярные выражения
2.1. Регулярное выражение для обнаружения метасимволов SQL/(%27)|(')|(--)|(%23)|(#)/ix.
2.2. Исправьте регулярное выражение для обнаружения метасимволов SQL /((%3D)|(=))[^n]*((%27)|(')|(--) 54ne. com
|(%3B)|(:))/i
2.3. Типичное регулярное выражение для атаки SQL-инъекцией/w*((%27)|('))((%6F)|o|(%4F))((%72)|r |( Китайский альянс сетевого управления www.bitscn.com
%52))/ix
2.4. Обнаружение SQL-инъекции, регулярное выражение ключевого слова запроса UNION /((%27)|('))union/ix(%27)|(') - single
Кавычки и их шестнадцатеричный эквивалент Union — ключевое слово Union.
2.5.Регулярное выражение/exec(s|+)+(s|x)pw+/ix для обнаружения атак SQL-инъекций MS SQL Server
3. Фильтрация строк.
public static String filterContent (String content) {
String flt="'|and|exec|insert|select|delete|update|count|*|%
|chr|mid|master|truncate|char|declare| |or|-|+|,";
Stringfilter[] = flt.split("|");
for(int я=0; я {
content.replace(filter[i], "");
}
возврат контента;
}
4. Небезопасная маскировка символов
В этой части для блокировки используется js, который играет очень небольшую роль. Хотя метод блокировки ключевых слов имеет определенный эффект, в реальных приложениях эти ключевые слова SQL также могут стать реальными ключевыми словами запроса, и тогда они будут заблокированы вами. пользователь не сможет использовать его в обычном режиме. Просто приложите некоторые усилия к стандартам кодирования.
Если в исполняемом SQL есть переменные, просто используйте ReadedStatement, предоставляемый JDBC (или другой уровень сохранения данных). Не забывайте не использовать метод объединения строк.
Введение в функцию: проверьте, содержит ли она "'"," \","/ "
Описание параметра: Проверяемая строка. Возвращаемое значение: 0: Да 1: Нет. Имя функции Да.
проверка функции(а)
{
возврат 1;
fibdn = новый массив ("'" ," \","/ ");
я = фибдн.длина;
j=длина;
for (ii=0; ii { for (jj=0; jj
{ temp1=a.charAt(jj);
temp2=fibdn[ii];
если (тем'; p1==temp2)
{возврат 0;
}
}
вернуть 1
;