делаю возможность комментирования через textarea, полученные данные записываю в БД, перед этим экранируя спец символы с mysql_real_escape_string. Извлекаю данные и вывожу на экран таким образом: echo nl2br(htmlspecialchars()); Собственно вопрос: насколько такой метод безопасен? или правильный?
Уг полный, делай запросы бд всегда в кавычках, чтобы скуля была вида '+order+by... и экранируй '... этого будет достаточно, т.к пользователь не сможет провести sql-атаку, ну и соответственно дебаг выруби, и проверяй запрос на true...
Кул хацкеры всегда проводят SQLi через ковычку? Вот, что получиться, если экранировать только ' Code: INSERT INTO `news` (`name`, `txt`, `time`, `u_id`) VALUES ('senap\', ', (SELECT 1000777), "", "") #,'233223', '1') если в запросе участвует как минимум 2 параметра, на которые можно влиять
SeNaP не совсем понял... допустим у меня 2 переменные $name и $txt в которых я получаю данные данные от пользователя записываю в бд $name = mysql_real_escape_string($name); $txt = mysql_real_escape_string($txt); INSERT INTO `news` (`name`, `txt`) VALUES ('$name', '$txt') извлекаю из бд и вывожу на экран echo htmlspecialchars($name); echo htmlspecialchars($txt); какие значения передать $name и $txt чтоб провести атаку в этом примере?
В данном случаи ты ни как не проведешь атаку, единственное, что можно добавить это если $name или $text передать как массив, в результате появиться предупреждение о том, что функция mysql_real_escape_string принимает только строковый тип данных и выведет путь до файла. PHP: $name = mysql_real_escape_string((string)$name); $txt = mysql_real_escape_string((string)$txt); INSERT INTO `news` (`name`, `txt`) VALUES ('$name', '$txt') Это от раскрытия путей, если в скрипте включен показ ошибок.
Безопасно, если не используются мультибайтовые кодировки в бд или не забыли поместить в кавычки параметр. Но ИМХО, это устарело уже давно (+ если не ошибаюсь то стандартную библиотеку mysql собираются выпилить в следующих версиях php), используйте pdo либо mysqli они позволяют использовать подготовленные запросы, так что если 1 раз разобраться в синтаксисе о sql inj можно забыть навсегда. В добавок скажу что это еще и удобней, не нужно постоянно беспокоится о кавычках, либо загромождать код постоянными проверками mysql_real_escape_string(). Насчет xss, то вполне безопасно, только если кодировка файла не utf-7 и данные не выводятся где-нибудь в ссылке.