Я все еще работаю над защитой своего веб-приложения. Я решил использовать библиотеку PDO для предотвращения внедрения mysql и очиститель html для предотвращения атак xss. Поскольку все данные, поступающие с ввода, поступают в базу данных, для работы с данными я выполняю такие действия:
- получить данные из поля ввода
- запустить pdo, подготовить запрос
- привязать каждую переменную (переменную POST) к запросу, очистив ее с помощью очистителя html
- выполнить запрос (сохранить в базу данных).
В коде это выглядит так:
// start htmlpurifier
require_once '/path/to/htmlpurifier/library/HTMLPurifier.auto.php';
$config = HTMLPurifier_Config::createDefault();
$purifier = new HTMLPurifier($config);
// start pdo
$pdo = new PDO('mysql:host=host;dbname=dbname', 'login', 'pass');
$pdo -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// prepare and bind
$stmt = $pdo -> prepare('INSERT INTO `table` (`field1`) VALUES ( :field1 )');
// purify data and bind it.
$stmt -> bindValue(':field1', $purifier->purify($_POST['field1']), PDO::PARAM_INT);
// execute (save to database)
$stmt -> execute();
Вот вопросы:
Это все, что мне нужно сделать, чтобы предотвратить внедрение XSS и mysql? Я знаю, что не могу быть уверен на 100%, но в большинстве случаев должно ли это работать нормально и достаточно ли этого?
Должен ли я снова дезинфицировать данные при захвате их из базы данных и размещении в браузере или фильтрации перед сохранением?
Я читал в вики, что разумно включить magic_quotes. Ofocurse, если магические кавычки помещают ненужные косые черты, это может раздражать, но если я не забочусь об этих косых чертах, не превращает ли это просто в потерю еще одной линии защиты?
Ответ:
Обратите внимание, что код, который я написал в этом примере, является просто примером. Существует много входных данных, и запрос к БД намного сложнее. К сожалению, я не могу согласиться с вами в том, что если переменная типа PDO должна быть int, мне не нужно фильтровать ее с помощью XSS-атак. Поправьте меня, если я ошибаюсь:
Если ввод должен быть целым числом, и это так, то все в порядке - я могу поместить его в БД. Но помните, что любой ввод можно изменить и стоит ожидать худшего. Итак, если все в порядке, то все в порядке, но если злоумышленник введет XSS-код, у меня будет несколько линий защиты:
- защита на стороне клиента - проверьте, является ли это числовым значением. Легко пойти на компромисс, но может остановить новичков.
- на стороне сервера - тест внедрения xss (с очисткой html или т.е. htmlspecialchars)
- сторона db - если кто-то каким-то образом поместит вредоносный код, который позволит избежать защиты xss, база данных вернет ошибку, потому что должно быть целое число, а не какая-либо другая переменная.
Я думаю, что это не делает ничего плохого, и это может сделать много хорошего. Конечно, мы теряем некоторое время, чтобы все просчитать, но я думаю, мы должны взвесить производительность и безопасность и определить, что для вас важнее. Мое приложение будет использоваться 2-3 пользователями одновременно. Не много. И безопасность для меня гораздо важнее, чем производительность.
К счастью, весь мой сайт в кодировке UTF8, так что проблем с кодировкой я не ожидаю.
При поиске в сети я встретил много мнений о addlashes(), stripslashes(), htmlspecialchars(), htmlentities().. и я выбрал htmlpurity и pdo. Все говорят, что это лучшее решение перед угрозами внедрения xss и mysql. Если у вас есть другое мнение, поделитесь.