Как защититься от XSS?

Статус
В этой теме нельзя размещать новые ответы.

membrana

Создатель
Регистрация
13 Ноя 2008
Сообщения
10
Реакции
5
Есть сайт с register_globals = On, есть переменная $query. Есть атака вида: Для просмотра ссылки Войди или Зарегистрируйся
Ну и есть нуб в php, который полжизни отдал дизайну и вёрстке :D, а сейчас бы хотел поплотнее заняться php, ибо программер, причём за деньги, мне на моих сайтах накосорезил столько, что сейчас я начинаю нести убытки.
---
Пытаюсь сам писать проверку:
Код:
  if (!empty($query))
    $query=strip_tags(html_entity_decode($query));
    @$query=str_replace("%", "& # 0 3 7 ;", @$query); //ббкоде нулледа тут режет мой символ, "& # 0 3 7 ;" у меня в коде, естественно, без пробелов.
    $query=str_replace("<", "&lt;", $query);
    $query=str_replace(">", "&gt;",$query);
    $query=str_replace("\"", "&quot;", $query);
Первая строка проверки у меня режет хтмл
Вторая режет символ процента... Вот тут-то верно ли я делаю? Мне кажется, чо нет, ибо яндекс-вебматер подсказал мне сегодня, что я - лох чилийский, и меня дерут во все щели. Хотел бы, чтоб гуру пхп объяснили мне именно на моём примере, что я неправильно делаю. Так как для меня более важно понять, чем попросить готовый код проверки у вас, гуру :ay:
 
попробуйте так

Код:
$query=str_replace('?', '%s', str_replace('%', '%%', $query));

А вообще в сети уже есть готовые библиотеки для безопасной работы с MYSQL

 
Есть сайт с register_globals = On, есть переменная $query. Есть атака вида: Для просмотра ссылки Войди или Зарегистрируйся
Ну и есть нуб в php, который полжизни отдал дизайну и вёрстке :D, а сейчас бы хотел поплотнее заняться php, ибо программер, причём за деньги, мне на моих сайтах накосорезил столько, что сейчас я начинаю нести убытки.
---
Пытаюсь сам писать проверку:
Код:
  if (!empty($query))
    $query=strip_tags(html_entity_decode($query));
    @$query=str_replace("%", "& # 0 3 7 ;", @$query); //ббкоде нулледа тут режет мой символ, "& # 0 3 7 ;" у меня в коде, естественно, без пробелов.
    $query=str_replace("<", "&lt;", $query);
    $query=str_replace(">", "&gt;",$query);
    $query=str_replace("\"", "&quot;", $query);
Первая строка проверки у меня режет хтмл
Вторая режет символ процента... Вот тут-то верно ли я делаю? Мне кажется, чо нет, ибо яндекс-вебматер подсказал мне сегодня, что я - лох чилийский, и меня дерут во все щели. Хотел бы, чтоб гуру пхп объяснили мне именно на моём примере, что я неправильно делаю. Так как для меня более важно понять, чем попросить готовый код проверки у вас, гуру :ay:

какойто ужас, понять тебе поможет - ru.php.net
вообщем здесь куча ненужных проверок, чтобы защититься от xss просто достаточно использовать функцию - htmlspecialchars


PHP:
<?php
  if (isset($_GET['query'])){
    $query = htmlspecialchars($_GET['query'],ENT_QUOTES)
  }
?>
 
Acidrayne, при чем тут MySQL? 0_o
membrana, можно вырезать теги ф-цией strip_tags() либо пропустить через htmlspecialchars (как посоветовал mayor)
 
strip_tags() не защищает до конца от XSS, кроме того юзер может искать что-то, совпадающее с тегом. Поэтому htmlspecialchars
 
У вас проверяется только переменная $query........
какая она? т.е если числовая то
intval($query) или numeric($query)
если символьная htmlspecialchars($query) или регэпсами
обрабатывайте все глобальные переменные с учетом get_magic_quotes_gpc()
PHP:
if (get_magic_quotes_gpc()== 1)
{
  function s_slash($v)
  {
    if (is_array($v))
	return array_map('s_slash', $v);
    return stripslashes($v);
  }
		if (!empty($_GET))	 $_GET	 = s_slash($_GET);
		if (!empty($_POST))    $_POST    = s_slash($_POST);
		if (!empty($_COOKIE))  $_COOKIE  = s_slash($_COOKIE);
		if (!empty($_REQUEST)) $_REQUEST = s_slash($_REQUEST);
}
если $query вносится в БД то mysql_escape_string()
 
Вместо htmlspecialchars() я бы советовал применять htmlentities(), так как он конвертирует ВСЕ символы строки (естественно кроме букв) в мнемоники хтмл.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху