Как отклонить имена (людей и компании), используя белые списки с C # регулярных выражений? - PullRequest
2 голосов
/ 15 мая 2009

Я столкнулся с несколькими проблемами при использовании регулярного выражения C # для реализации белого списка разрешенных символов на веб-входах. Я пытаюсь избежать SQL-инъекций и XSS-атак. Я читал, что белые списки допустимых символов - путь.

Входными данными являются имена людей и названия компаний.

Некоторые из проблем:

  1. Названия компаний, которые имеют амперсанды. Как "Джим и сыновья". Амперсанд важен, но опасен.

  2. Символы Unicode в именах (например, у нас есть азиатские клиенты), которые вводят свои имена, используя свои наборы символов. Мне нужно все это внести в белый список.

  3. Названия компаний могут иметь всевозможные слэши, такие как «S / A» и «S \ A». Это рискованно?

Я обнаружил, что хочу разрешить почти каждый символ после просмотра всех данных, которые уже есть в БД (и вводятся новыми пользователями).

Какие-либо предложения по созданию хорошего белого списка, который будет решать эти (и другие) проблемы?

ПРИМЕЧАНИЕ. Это устаревшая система, поэтому я не контролирую весь код. Я надеялся сократить количество атак, в первую очередь предотвратив попадание в систему неверных данных.

Ответы [ 6 ]

4 голосов
/ 15 мая 2009

Этот поток SO содержит много хороших обсуждений о защите себя от атак инъекций.

Короче говоря:

  1. Отфильтруйте входные данные как можно лучше
  2. Избегайте строк, используя методы, основанные на фреймворке
  3. Параметризация ваших операторов SQL

В вашем случае вы можете ограничить поле имени небольшим набором символов. Сфера деятельности компании будет более сложной, и вам необходимо учитывать и балансировать потребности ваших пользователей в свободе входа с вашей потребностью в безопасности сайта. Как уже говорили другие, пытаться написать свои собственные методы санитарии сложно и рискованно. Сохраняйте простоту и защищайте себя с помощью своей архитектуры - не полагайтесь на то, что строки «безопасны», даже после очистки.

EDIT:

Чтобы уточнить - если вы пытаетесь создать белый список, сообщество не может раздавать его, поскольку оно полностью зависит от данных, которые вы хотите. Но давайте рассмотрим пример белого списка регулярных выражений, возможно, для имен. Скажем, я в белом списке A-Z и a-z и пробел.

Regex reWhiteList = new Regex("^[A-Za-z ]+$")

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

if (reWhiteList.IsMatch(strInput))
   // it's ok, proceed to step 2
else
   // it's not ok, inform user they've entered invalid characters and try again

Надеюсь, это поможет еще! С именами и названиями компаний вам будет непросто разработать строгий шаблон для проверки, но вы можете составить простой список допустимых символов, как я показал здесь.

3 голосов
/ 15 мая 2009

Не пытайтесь очищать имена, особенно с помощью регулярных выражений!

Просто убедитесь, что вы правильно экранировали значения и надежно сохранили их в своей БД, а они экранировали их при представлении в HTML

2 голосов
/ 15 мая 2009

Названия компаний могут содержать почти любой символ, поэтому я не знаю, насколько хорошо это сработает для вас. Я бы сконцентрировался на защите себя от различных атак, не надеясь, что ваши струны «естественно» безопасны.

(Разумеется, у них могут быть амперсанды, двоеточия, точки с запятой, восклицательные знаки, дефисы, знаки процента и другие виды вещей, которые могут быть «небезопасными» во множестве контекстов.)

1 голос
/ 15 мая 2009

Зачем вообще фильтровать или пересматривать данные или даже избегать их, вы должны использовать переменные связывания для доступа к базе данных.

Таким образом, клиент может ввести что-то вроде: что-нибудь 'ИЛИ' x '=' x

А вашему приложению все равно, потому что ваш код SQL не анализирует переменную, потому что он не установлен при подготовке оператора. * Т.е. 1005 *

'SELECT count(username) FROM usertable WHERE username = ? and password = ?'

затем вы выполняете этот код с установленными переменными.

Это работает в приложениях PHP, PERL, J2EE и т. Д.

0 голосов
/ 16 мая 2009

Это мой текущий белый список регулярных выражений для названия компании. Любой ввод за пределами этих символов отклоняется:

"^ [0-9 \ p {L} '-., / \ &] {0,50} $"

\ p {L} соответствует любой букве Юникода. Итак, акценты и азиатские символы занесены в белый список.

\ & немного проблематично, поскольку потенциально допускает использование специальных символов javascript.

проблема \ 'проблематична, если не используются параметризованные запросы, из-за внедрения SQL.

- может разрешить "-", также возможно использование SQL-кода, если не используются параметризованные запросы.

Кроме того, \ p {L} не будет работать на стороне клиента, поэтому его нельзя использовать в валидаторе регулярных выражений ASP.NET без отключения проверки на стороне клиента: EnableClientScript = "False"

0 голосов
/ 15 мая 2009

Я думаю, что написание собственного регулярного выражения не очень хорошая идея: это будет очень сложно. Попробуйте использовать существующие функции вашего веб-фреймворка, в сети много ресурсов. Если вы говорите C #, я предполагаю, что вы используете ASP.NET, попробуйте следующую статью: Как: защитить от атак с помощью инъекций в ASP.NET

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...