За последние 24 часа нас посетили 22459 программистов и 1154 робота. Сейчас ищут 608 программистов ...

XSS

Тема в разделе "Сделайте за меня", создана пользователем Альфредио, 6 апр 2022.

Метки:
  1. Альфредио

    Альфредио Новичок

    С нами с:
    26 окт 2021
    Сообщения:
    9
    Симпатии:
    0
    Здравствуйте. Поставили задачу написать функцию, которая бы защищала сайт от XSS и SSI атак. Предложенные варианты простой обработки через функции htmlentities и ей подобными не подходят, потому что "нужно что-то посерьёзнее".
    Есть у кого идеи?
     
  2. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    PHP:
    1. private function clearVars($source)
    2. {
    3.     if (is_array($source)) {
    4.         foreach ($source as $key => $value) {
    5.             $source[$key] = $this->clearVars($value);
    6.         }
    7.  
    8.         return $source;
    9.     }
    10.  
    11.     if (is_object($source)) {
    12.         foreach ($source as $property => $value) {
    13.             $source->{$property} = $this->clearVars($value);
    14.         }
    15.  
    16.         return $source;
    17.     }
    18.  
    19.     return is_string($source) ? htmlspecialchars($source, ENT_QUOTES) : $source;
    20. }
     
    Альфредио нравится это.
  3. Альфредио

    Альфредио Новичок

    С нами с:
    26 окт 2021
    Сообщения:
    9
    Симпатии:
    0
    А не могли бы Вы продемонстрировать работу данной функции на массиве?
     
  4. Альфредио

    Альфредио Новичок

    С нами с:
    26 окт 2021
    Сообщения:
    9
    Симпатии:
    0
    Просто я делаю вот так, но мне private красным подчеркивает и выводит "Parse error: syntax error, unexpected token "private", expecting end"

    PHP:
    1. <?php
    2.  
    3. $source = array("foo", "bar", "hallo", "world");
    4.  
    5. private function clearVars($source)
    6. {
    7.     if (is_array($source)) {
    8.         foreach ($source as $key => $value) {
    9.             $source[$key] = $this->clearVars($value);
    10.         }
    11.  
    12.         return $source;
    13.     }
    14.  
    15.     if (is_object($source)) {
    16.         foreach ($source as $property => $value) {
    17.             $source->{$property} = $this->clearVars($value);
    18.         }
    19.  
    20.         return $source;
    21.     }
    22.  
    23.     return is_string($source) ? htmlspecialchars($source, ENT_QUOTES) : $source;
    24. }
    25.  
    26. clearVars($source);
    27.  
    28. ?>
     
  5. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    PHP:
    1. function clearVars($source)
    2. {
    3.     if (is_array($source)) {
    4.         foreach ($source as $key => $value) {
    5.             $source[$key] = clearVars($value);
    6.         }
    7.  
    8.         return $source;
    9.     }
    10.  
    11.     if (is_object($source)) {
    12.         foreach ($source as $property => $value) {
    13.             $source->{$property} = clearVars($value);
    14.         }
    15.  
    16.         return $source;
    17.     }
    18.  
    19.     return is_string($source) ? htmlspecialchars($source, ENT_QUOTES) : $source;
    20. }
    21.  
    22. $xssArray = [
    23.     'a' => '<script>alert("Я XSS")</script>',
    24.     'b' => '<script>alert("Я вторая XSS")</script>',
    25.     'c' => [
    26.         'd' => '<script>alert("Я третья XSS")</script>'
    27.     ]
    28. ];
    29.  
    30. var_dump($xssArray);
    31.  
    32. //echo $xssArray['a']; // XSS выполнится
    33. //echo $xssArray['b']; // XSS выполнится
    34. //echo $xssArray['c']['d']; // XSS выполнится
    35.  
    36. $clearingArray = clearVars($xssArray);
    37.  
    38. var_dump($clearingArray);
    39.  
    40. echo $clearingArray['a']; // XSS не выполнится
    41. echo $clearingArray['b']; // XSS не выполнится
    42. echo $clearingArray['c']['d']; // XSS не выполнится
    43.  
    44. extract($clearingArray);
    45.  
    46. echo $a; // XSS не выполнится
    47. echo $b; // XSS не выполнится
    48. echo $c['d']; // XSS не выполнится
     
    #5 Вероломство, 6 апр 2022
    Последнее редактирование: 6 апр 2022
    Альфредио нравится это.
  6. Альфредио

    Альфредио Новичок

    С нами с:
    26 окт 2021
    Сообщения:
    9
    Симпатии:
    0
    А от GET атак меня это защитит?
     
  7. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    /?a=<script>alert("Я XSS")</script>&b=<script>alert("Я вторая XSS")</script>

    PHP:
    1. extract(clearVars($_GET));
    2.  
    3. echo $a; // XSS не выполнится
    4. echo $b; // XSS не выполнится
    5.  
    6. // можно проще
    7. $a = filter_input(INPUT_GET, 'a', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
    8. $b = filter_input(INPUT_GET, 'b', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
     
  8. antoniii

    antoniii Активный пользователь

    С нами с:
    16 мар 2022
    Сообщения:
    417
    Симпатии:
    71
    Вообще то private только в классе встречается. Это не простая функция, а метод.
     
    Вероломство нравится это.
  9. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    я ему поправил, раз ему процедурка нужна
     
    Альфредио нравится это.
  10. Альфредио

    Альфредио Новичок

    С нами с:
    26 окт 2021
    Сообщения:
    9
    Симпатии:
    0
    я изучил документацию, но не нашёл информацию о том, как использовать процедурные выражения в качестве фильтра?
    Мол, санитайзить, если соответствует кодировке <.*>
     
  11. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    https://www.php.net/manual/ru/book.filter.php