php
  • html
  • xss
  • 2013-04-04 2 views 3 likes 
    3

    У меня есть PHP код, как этотПочему мой код уязвим для атаки xss?

    <?php 
        $input_from_user = "w' onclick = 'alert(document.cookie);'"; 
        $i_am_barcelona_fan = htmlentities($input_from_user); 
    ?> 
    <input type = 'text' name = 'messi_fan' value ='<?php echo $i_am_barcelona_fan;?>' /> 
    

    Я использую htmlentities для защиты от XSS атаки, но все-таки я уязвима к строке выше. Почему мой код уязвим для атаки XSS? Как я могу защитить от своего кода?

    +1

    'htmlentities()' не является идеальным решением для всех XSS – Jakub

    +2

    Это потому, что вы поклонник Барселоны. Много горьких людей. – SomeShinyObject

    +0

    Хорошая статья для предотвращения xss .. http://www.ibm.com/developerworks/web/library/wa-secxss/ надеюсь, что это поможет. –

    ответ

    2

    Вы не говоря PHP экранировать кавычки, а также, и вы должны использовать вместо htmlspecialchars():

    <input type = 'text' name = 'messi_fan' value ='<?php echo htmlspecialchars($input_from_user, ENT_QUOTES, 'UTF-8'); ?>' /> 
    

    Demo

    2

    Никогда (когда-либо) доверие к иностранному вводу вводилось в ваш PHP-код. Всегда дезинфицируйте и проверяйте внешний ввод, прежде чем использовать его в коде. Функции filter_var и filter_input могут дезинфицировать текст и проверять текстовые форматы (например, адреса электронной почты).

    Вклад может быть любым: входные данные формы $ _GET и $ _POST, некоторые значения в superglobal $ _SERVER и тело запроса HTTP через fopen ('php: // input', 'r'). Помните, что иностранный ввод не ограничивается формой данных, представленных пользователем. Загруженные и загруженные файлы, значения сеанса, данные cookie и данные сторонних веб-сервисов также являются иностранными.

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

    Данные могут быть отфильтрованы по-разному в зависимости от его назначения. Например, когда нефильтрованный внешний вход передается в вывод HTML-страницы, он может выполнять HTML и JavaScript на вашем сайте! Это называется Cross-Site Scripting (XSS) и может быть очень опасной атакой. Один из способов избежать XSS - дезинформировать все пользовательские данные, прежде чем выводить их на вашу страницу, удалив теги HTML с помощью функции strip_tags или экранируя символы со специальным значением в их соответствующие объекты HTML с помощью функций htmlentities или htmlspecialchars.

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

    В качестве последнего примера используется ввод иностранного ввода для определения файла для загрузки из файловой системы. Это можно использовать, изменив имя файла на путь к файлу. Вам нужно удалить «/», «../», пустые байты или другие символы из пути к файлу, чтобы он не мог загружать скрытые, непубличные или чувствительные файлы.

    Подробнее о фильтрации данных (http://www.php.net/manual/en/book.filter.php)

    Узнайте о filter_var (http://php.net/manual/en/function.filter-var.php)

    +0

    Однако, что важнее, чем санитария, следует избегать. Строка в этом случае может считаться «разумной» при определенных обстоятельствах. –

    +0

    Санитария удаляет (или ускользает) незаконные или небезопасные символы с внешнего ввода. Иногда требуется, чтобы во входные данные были включены некоторые безопасные HTML-теги, когда они были включены в HTML-страницу. Это очень сложно сделать, и многие избегают этого, используя другое более ограниченное форматирование, такое как Markdown или BBCode, хотя по этой причине существуют белые списки, такие как HTML Purifier. Примеры здесь: http://www.php.net/manual/en/filter.filters.sanitize.php – medina

    +0

    Это все еще зависит от контекста, символы которого действительно незаконны или небезопасны; тогда как экранирование может быть применено к исходному значению, когда оно «покидает» систему. Предоставление безопасного подмножества HTML не является частью вопроса. –

    Смежные вопросы