Как предотвратить XSS-атаку в моей функции? - PullRequest
0 голосов
/ 25 августа 2011

Я создаю функцию для моих $_POST входов, чтобы предотвратить SQL-инъекцию ДО добавления значений в базу данных. Я использую его при входе в систему / регистрации и когда пользователю необходимо опубликовать статью. Насколько я знаю, это не защищает его от XSS.

Должен ли я создавать другую функцию при выводе данных или редактировании?

Спасибо.

function clean($str) {
    $str = @trim($str);
    if(get_magic_quotes_gpc()) {
        $str = stripslashes($str);
    }
    return mysql_real_escape_string($str);
}

Ответы [ 4 ]

3 голосов
/ 25 августа 2011

Вы говорите о XSS, а затем о внедрении SQL ...

SQL

Используйте mysql_real_escape_string() или, что еще лучше, связывайте параметры с такой библиотекой, как PDO.

Если возможно magic_quotes, используйте ...

function sqlEscape($str) {
   if (get_magic_quotes_gpc()) {
      $str = stripslashes($str);
   }
   return mysql_real_escape_string($str);
}

Что касается вашего примера, зачем вам нужно использовать trim() для обеспечения безопасности данных? Кроме того, зачем использовать супрессор ошибок на trim()?

XSS

Используйте htmlspecialchars($str, ENT_QUOTES), чтобы специальные символы HTML не имели специального значения.

3 голосов
/ 25 августа 2011

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

0 голосов
/ 25 августа 2011

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

Кроме того, как сказал Куамис, вам, вероятно, стоит взглянуть на PDO или какой-либо другой DBAL, который позволяет вам использовать подготовленные операторы вместо того, чтобы экранировать их вручную.

0 голосов
/ 25 августа 2011

Я использую следующее, которое прекрасно работает для предотвращения инъекций:

function clean($str) {
    $value = mysql_escape_string(stripslashes(htmlspecialchars($str)));
    return $value;
}
...