Алгоритм для предотвращения Внедрения SQL на Сервере MSSQL от кода C#?

Это кратко описано в документации BeautifulSoup

Beautiful Soup представляет один и тот же интерфейс для нескольких различных анализаторов, но каждый анализатор отличается. Различные парсеры будут создавать разные деревья разбора из одного и того же документа. Самые большие различия между парсерами HTML и парсерами XML

[...]

Вот тот же документ, проанализированный со встроенным парсером HTML Python:

[110 ]

Как и html5lib, этот анализатор игнорирует закрывающий тег

. В отличие от html5lib, этот анализатор не пытается создать правильно сформированный HTML-документ путем добавления тега. В отличие от lxml, он даже не удосуживается добавить тег.

blockquote>

Вероятно, проблема, с которой вы столкнулись, связана с искаженным HTML, который html.parser не может обработать надлежащим образом. Это привело к удалению id="main", когда BeautifulSoup проанализировал HTML. Изменяя синтаксический анализатор на html5lib или lxml, BeautifulSoup обрабатывает искаженный HTML иначе, чем html.parser

10
задан mathieu 30 October 2008 в 10:04
поделиться

2 ответа

Лучшие 10 вещей, которые мы можем сделать для сейфа (Никакой из них не сделает все это.)

  1. Примите понятие, что, "Все данные являются злыми". Все данные, даже данные, хранившие в базе данных или в нашей файловой системе, являются подозреваемым. Не только ввод данных из приложений вне нашего брандмауэра как строки запроса, сформируйте поля, cookie, и т.д. Что-либо может использоваться для взлома системы.

  2. Не полагайтесь на клиентскую проверку JavaScript или длин поля HTML или даже веб-API серверной стороны, которые используют клиентскую проверку. Используйте его, чтобы улучшить удобство использования, но не полагаться на него как на единственную защиту. Знайте как блоки проверки допустимости, обеспеченные API как СЕТЕВАЯ работа. Не считайте их само собой разумеющимся. Существуют пути вокруг них.

  3. Сделайте положительное соответствие для ловли всех данных, как это входит. Если Данные соответствуют диапазонам символов регулярного выражения, то это хорошо. Это запрещает странные unicode символы в нашу базу данных, которая могла бы случайно разграничить что-то в sql или создать другие проблемы как Гомографические Нападения XSS/Phishing. Напротив, Отрицательное соответствие требует списков всех неверных символов, которые, кажется, растут все время. Это - плохой подход. Положительное соответствие лучше. Мы отклоняем неправильные данные, не санируйте или выходите из них.

  4. Когда возможно, рассмотрите фильтрацию, установку флага, или ловлю строковых данных с "обновлением", "удалите", "отбросьте", "выберите", "изменитесь" и т.д. Это не может быть возможно, учитывая природу строки. "Маршрут Лимонного леденца 1212 года", "Валтерсбург, Пенсильвания", и "Столовая гора, Небраска" является допустимыми полями адреса. Выполнение ежедневного сканирования всех данных таблицы для полей, которые соответствуют любому из них, могло показать задержанные нападения или уязвимости. Также вход, запрет IP, предупреждения по электронной почте, и т.д. и т.д. мог использоваться, когда данные прибывают входящие.

  5. Используйте хранимые процедуры и/или параметризированные запросы как можно больше. Избегайте динамического sql и в клиентском коде дб и в sql. (Избегайте исполнительных операторов с динамическим кодом с внешними разделами в Ваших хранимых процедурах!!!) Параметризация выйдет из строковых разделителей как апостроф, поймает длины поля и введет проверку. Мы не можем всегда полагаться на API, которые обеспечивают параметризацию, чтобы быть прекрасными, но они записаны людьми, намного больше знающими об индивидуальных особенностях базы данных, чем большинство из нас.

  6. Убедитесь, что никакой случайный код не сидит без дела в мировом читаемом/исполняемом веб-каталоге. Если это не часть активного сайта, заархивируйте его, где-нибудь защищают и удаляют его из общественного мнения. То же идет для неиспользованных хранимых процедур.

  7. Оставайтесь в курсе базы данных API. Некоторые способы выполнить SQL-операторы в некоторых API не так безопасны как другие.

  8. Пароли хранилища надежно с односторонним шифрованием. Таким образом, дамп таблицы имен пользователей и паролей должен все еще не пустить людей.

  9. Укрепите сервер всеми обычными способами. Например, если это возможно, дайте наименьшее количество полномочия на таблицах базы данных. Предельный доступ базы данных веб-сервера считает строго к рассматриваемым таблицам. Используйте только для чтения как можно больше. Создайте несколько учетных записей, которые создают деление между правами доступа общественности и in-house/trusted трафика.

  10. Зафиксируйте ошибки корректно. Это идет для всего кода, не только кодируют, который использует базу данных. Нападения внедрения SQL конкретно полагаются на сообщения об ошибках однако и таким образом, желательно скрыться так, как возможно о базе данных от общественности. Всегда пишите код, который обрабатывает исключения или пустые наборы данных ванильным способом для раскрытия как можно меньше о том, какую базу данных мы используем, что поля находятся в наших таблицах, или как, какие запросы мы выполняем. Ошибки журнала на сервере. Даже в коде небазы данных, лучше умалчивать сторонние компоненты, структуры папки, другие сервисы, которые мы можем выполнять и т.д. При предоставлении злонамеренным пользователям как можно меньше информации является ключевым для хранения их невежественный.

И № 11, всегда пересматривайте/пересматривайте этот список. Всегда будьте актуальны. Будьте превентивными. Сделайте это первичным приоритетом и требованием, не, после того, как думается.

13
ответ дан 3 December 2019 в 13:37
поделиться

Нет никакого необходимого алгоритма - просто не используют конкатенацию строк для создания SQL-операторов. Используйте SqlCommand. Набор параметров вместо этого. Это делает весь необходимый выход значений (таких как замена ' с '') и гарантирует, что команда будет безопасна, потому что кто-то еще (т.е. Microsoft) сделал все тестирование.

например, вызов хранимой процедуры:

using (var connection = new SqlConnection("..."))
using (var command = new SqlCommand("MySprocName", connection))
{
    command.CommandType = CommandType.StoredProcedure;
    command.Parameters.AddWithValue("@Param1", param1Value);
    return command.ExecuteReader();
}

Эта техника также работает на встроенные SQL-операторы, например.

var sql = "SELECT * FROM MyTable WHERE MyColumn = @Param1";
using (var connection = new SqlConnection("..."))
using (var command = new SqlCommand(sql, connection))
{
    command.Parameters.AddWithValue("@Param1", param1Value);
    return command.ExecuteReader();
}
31
ответ дан 3 December 2019 в 13:37
поделиться