2011-03-13 3 views
9

Как следует протестировать веб-приложение phpunit php для внедрения xss + sql? Я думаю, чтобы найти программу, которая выводит xss + другие атаки для тестирования моих форм приложений. Эта программа/служба должна быть обновлена ​​с новыми xss и другими новыми атаками. Существует ли такое обслуживание/программа, если не так, как это делается сегодня? Приведите несколько примеров, если сможете.Как следует протестировать phpunit для инъекции xss + sql?

(я использую PHP 5.3 + Zend Framework, + MySQL)


Edit:

Я спрашиваю о тестировании и не допустить методы, которые я знаю!.

Спасибо,

Йосеф

+2

Не уверен, является ли это случай для модульного тестирования на всех ... Заинтересованы, чтобы увидеть, что ответы приходят вверх. –

+0

У меня возникает соблазн ответить: «Напишите сценарий, ищущий» (SELECT | INSERT | UPDATE). * \ $ \ W +. * ", Если он присутствует, ваш код не удался.' – cwallenpoole

+0

Согласен, речь идет не об модульном тестировании, а о том, что ваш код использует только подготовленные-заявления. Используйте систему PDO, а затем привяжите переменные через эту систему. – cwallenpoole

ответ

9

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

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

Формы защиты от таких атак довольно хорошо известны и легко использовать:

  • Всегда escape variables in sql, или еще лучше использовать prepared statements
  • Если вы не необходимости принимать и сохранять ввод HTML , всегда htmlspecialchars любая переменная, которая входит в HTML (обратите внимание, что существует много форматов, таких как BBCode, MarkDown, Textile и т. д., единственная цель которых - разрешить полезное подмножество параметров форматирования без открытия окна Pandora)
  • Если вы абсолютно, безусловно, нужно принимать, хранить и обслуживать данные HTML, то есть HTMLPurifier, что может помочь - но делать это только в крайнем случае

Поэтому, я бы сказал, что это гораздо лучшее значение для вашего времени, чтобы убедиться, что вы следуете этим практикам/используйте эти инструменты.

Кроме того, если вы производите доступ к этим двум подсистемам (sql и HTML output) через четко определенную часть вашего приложения (методы доступа к базам данных, которые выходят из всех входных данных независимо от того, что выводит выходные данные HTML таким же образом вывести входные переменные и ввести их в предоставленный «HTML-шаблон», который вы впоследствии эхо), тогда становится проще провести тестирование этих подсистем. Достойные фреймворки PHP уже делают это.

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

Наконец, есть automatedSQLinjectiontools и XSS-relatedtools, которые вы можете использовать, чтобы исследовать веб-приложений. Но если кто-то не нанимает вас на тестирование, лучше использовать их, поскольку вы будете использовать защиту в сексе: используйте его, но не рассчитывайте на это.

+1

Downvoter: Пожалуйста, помогите мне улучшить ответ, если вы обнаружите, что он недостаточен. Спасибо. – Jon

5

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

Тестирование модулей поможет вам с логическими ошибками, но не поможет вам найти проблемы с безопасностью, такие как. Единственными решениями являются бдительность и обзоры/проверки кода.

ОБНОВЛЕНИЕ: Я почти забыл! Вы должны проверить PHP_CodeSniffer для автоматического аудита вашего кода. Это должно помочь вам обнаружить, по крайней мере, экземпляров, где люди делают потенциально опасные и небезопасные вещи в коде, и вы можете расширить его, чтобы обнаружить больше проблем, чем базовая установка по умолчанию.

+0

+1 для проверки кода является лучшим решением. Но подготовленные заявления не являются доказательством всех случаев внедрения SQL. –

+0

Я немного озадачен этим. Я работаю в предположении, что если кто-то использует подготовленные операторы, они также (а) проверяют, что пользователь имеет доступ к выбранной/вставленной/обновленной/удаленной записи и (б) что сами постановки не строятся динамически , Я не могу думать о каких-либо других очевидных векторах инъекции SQL, которые возможны с подготовленными операторами. Есть возможность кэширования сервера субоптимальными планами выполнения, но это действительно отдельная проблема. Для моего собственного любопытства можно было бы разработать другие инъекционные векторы, подготовленные заявления не будут охватывать? –

+0

@Keith: параметры запроса могут использоваться вместо буквального значения SQL и только один-к-одному. Людям по-прежнему необходимо сделать другие части запроса динамическими, например имя таблицы, имя столбца, ключевые слова SQL, список значений в предложении 'IN()' или другие выражения. Вы не можете использовать параметры запроса для этих случаев, поэтому перед подготовкой запроса к РСУБД вам нужно построить строку запроса SQL с логикой приложения. –

6

Я бы не писал модульные тесты для обнаружения XSS или SQL-инъекций. Что бы я сделал это:

Чтобы предотвратить XSS, избежать всех выходов пользователя с одним из:

Чтобы предотвратить внедрение SQL, используйте PDO и заполнители для всего. т.е.)

"SELECT * FROM users WHERE uid = $_POST['id']"; 

становится

"SELECT * FROM users WHERE uid = ?"; 

или

"SELECT * FROM users WHERE uid = :id"; 

Редактировать Вы также можете попробовать некоторые аддоны браузера, такие как:
https://addons.mozilla.org/en-US/firefox/addon/hackbar/
https://addons.mozilla.org/en-US/firefox/addon/xss-me/
https://addons.mozilla.org/en-US/firefox/addon/sql-inject-me/
https://addons.mozilla.org/en-US/firefox/addon/access-me/

+0

Я знаю, как предотвратить, я спрашиваю о тестировании – Yosef

+0

@Yosef Возможно, вы захотите попробовать расширение браузера для проверки уязвимостей. –

+0

Спасибо, не требует ли это расширение вставить тест вручную? Потому что это не решает проблему – Yosef

1

Получить XSS Me add-on для Firefox и запустить его на своих страницах, чтобы проверить.

Смежные вопросы