За последние 24 часа нас посетили 37959 программистов и 1811 роботов. Сейчас ищут 833 программиста ...

экранирование $_GET

Тема в разделе "Прочие вопросы по PHP", создана пользователем wolf777, 10 ноя 2014.

  1. wolf777

    wolf777 Новичок

    С нами с:
    26 авг 2014
    Сообщения:
    207
    Симпатии:
    0
    Код (Text):
    1. $_GET['page']=isset($_GET['page'])?intval($_GET['page']):'first';
    как думаете тут стоит экранировать $_GET['page']?
     
  2. metadon

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

    С нами с:
    6 фев 2006
    Сообщения:
    779
    Симпатии:
    0
    Смотря как полученные данные используются
     
  3. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    экранировать стоит все, что "идет" в базу данных и экранирование создано для базы данных, а не для чего то другого.
     
  4. wolf777

    wolf777 Новичок

    С нами с:
    26 авг 2014
    Сообщения:
    207
    Симпатии:
    0
    а зачем тогда экранируют переменные?
     
  5. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    что вы подразумеваете под экранированием? в данном случае
     
  6. wolf777

    wolf777 Новичок

    С нами с:
    26 авг 2014
    Сообщения:
    207
    Симпатии:
    0
    подразумеваю htmlspecialchars
     
  7. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    а что с этими данными дальше происходит?
    понимаете, конструкция $p = isset($_GET['p']) ? (int) $_GET['p'] : 0; значит я в ключе п жду число. и не важно число там или не число - я приведу к числу. а если не будет указано - переменная все равно объявится с числовым значением. некоторым "дефолтом". то есть я буду уверен в том что у меня это число. и могу подставлять это в запрос. и проводить любые другие математические операции.
    причем тут htmlspecialchars? причем тут экранирование?
     
  8. wolf777

    wolf777 Новичок

    С нами с:
    26 авг 2014
    Сообщения:
    207
    Симпатии:
    0
    ну а если ваш сайт хотят взломать, через вашу p, методом той же подстановкой, получается они получат xss уязвимость?
     
  9. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
  10. wolf777

    wolf777 Новичок

    С нами с:
    26 авг 2014
    Сообщения:
    207
    Симпатии:
    0
  11. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    нет. еще варианты?

    Добавлено спустя 1 минуту 48 секунд:
    только перед тем как постить еще варианты - голову прошу включить. кофе там попить, прогуляться. что там еще нужно. чакры раскрыть.

    итак. еще варианты?
     
  12. wolf777

    wolf777 Новичок

    С нами с:
    26 авг 2014
    Сообщения:
    207
    Симпатии:
    0
    нет вариантов, один тока был, ну ответа я не получил толком
     
  13. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    ответ: вы невнимательно читаете мануал зато паникуете по каждому поводу.
    что написано в статье по ссылке? что многие ковнокодеры громоздят онуехные стеки вызовов функций назначений которых они не понимают.
    я что просил сделать? включить голову.

    итак.
    внимательный читатель обратит внимание на то что именно я делаю. в отличие от приведенной статьи где ГОВНОКОДЕРЫ проверяют через if(intval(hujsobachiy)){}{} и попадают на то что "если там есть число то функция вернет истину и можно атаковать сайт" я занимаюсь кастом к целочисленному значению. это значит для строки "11+мывсеумрем" каст в интеджер будет равен одинадцати. без всякого говна справа. а каст для "даонделокажетсяговорит+100500" каст будет ноль. потому что конструкция каста работает следующим образом. ЧИТАЕТ СТРОКУ СЛЕВА НАПРАВО В ПОИСКАХ ПЕРВОГО НЕЧИСЛОВОГО СИМВОЛА. не сложно догадаться что в случает когда не число ей встречается первой она заканчивает с нулевым значением. а когда хоть сколько-то нумералов ей встретилось - она закончит "число" на этом и все остальное отбросит.

    итак у нас при любом строковом значении в ключе П - в переменной П будет всегда число.
    допустим нет ключа П. тогда мы объявляем П с нулевым дефолтом.

    и опять итак. у нас в сценарии теперь число П. я могу его умножить на кол-во элементов на странице и получить ЧИСЛОВОЕ ВСЁ ЕЩЕ значение офсета которое смелейшим образом могу использовать с запросе "селект астериск фром тейблнэйм лимит П_ОФСЕТ элементс_пер_пэйдж".

    и мне даже не пришлось:
    - экранировать управляющие последовательности скуэля mysqli?_(real_)?_escape_string я ведь знаю что у меня там число лежит. а числом не поломать запрос.
    - преобразовывать специальные символы html в сущности htmlspecialchars так как число априори не содержит ничего кроме нумералов.
    - проверять лежит ли там число if(intval()) так как я уверен что там всегда будет число
    - добавлять слеши addslashes так как они реально нафиг не сдались обычной четырехбайтной переменной в числовом представлении
    - обрезать значение trim() ибо ну нафига оно мне - пробелы будут пропущены на автомате при касте. а как будет непробельный символ - начнется гадание число-не-число.
    - выполнять еще какие-то странные проверки за которыми внимательно следят санитары.

    впрочем, говнокодеры все равно продолжат жопой орехи колоть в процессе чтения анекдотичных статей о конце света. ведь они в голову только едят. тут я бессилен... к счастью
     
    mahmuzar нравится это.
  14. wolf777

    wolf777 Новичок

    С нами с:
    26 авг 2014
    Сообщения:
    207
    Симпатии:
    0
    ну я так понял из вашего соощения, что не всегда нужно применять экранизацию, экранизацию надо применять в таких случиях как тут

    $r=get_sql_table('tpl.id',"skin='$SKIN[id]' and (perm='1' or (module='$MODULE' and (unit='*' or unit='$UNIT'))) and (lang=$LANGDEFAULT or lang=$LANG)");

    чтобы за экранировать например $MODULE, $UNIT, $LANGDEFAULT, $LANG к примеру
     
  15. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    вы неправильно поняли. экранизацию нужно применять тогда когда она нужна. не надо нагружаться лишними эскейпами когда работаем с числом. не трогайте html-функции когда не работаете с html-контекстом. всё должно быть разумно.

    вам самому удобно такой код читать?

    в этих переменных должны быть допустимые значения. разве нет? там останется только real_escape_string для управляющих последовательностей скуэля.
     
  16. wolf777

    wolf777 Новичок

    С нами с:
    26 авг 2014
    Сообщения:
    207
    Симпатии:
    0
    не удобно, ну я не знаю как его написать подругому
     
  17. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Под экранирование как правило понимается экранирование переменных запроса в БД, для этого используется функция real_escape_string, в частности она защищает от SQL инъекция, найди на википедии там показано как это делать.

    htmlspecialchars, заменяет специальные символы используемые в HTML на что то там (бошка болит лень описывать), символы такие например как "<", ">".
    представь ситуацию, у тебя есть textarea в котором ты редактируешь html разметку и в этой разметки присутствует textarea, что то типа:
    Код (PHP):
    1. $html = '<div><textarea name="ta"></textarea></div>';
    2. echo '<textarea>'. $html .'</textarea>';
    Запусти и посмотри исходный код и вообще, вот для таких случаев нужно htmlspecialchars:
    Код (PHP):
    1. $html = '<div><textarea name="ta"></textarea></div>';
    2. echo '<textarea>'. htmlspecialchars($html) .'</textarea>';
    и еще есть третья тема, это strip_tags, очищает текст от HTML тегов, для чего это нужно, представь у тебя доска объявлений, кто то добавил текст вместе с JS скриптом который запускает форматирование всех дисков (шутка конечно, такое не возможно, наверно), этот скрипт у тебя сохранился как обыкновенный текст, а потом при выдаче текста он работает как полноценный скрипт, и любой кто зайдет на это объявления останется с отформатированными дисками, вот для этих целей служит strip_tags, что бы очистить от ненужных тегов текст.
     
  18. wolf777

    wolf777 Новичок

    С нами с:
    26 авг 2014
    Сообщения:
    207
    Симпатии:
    0
    VLK спасибо огромное, объяснили доходчиво и все понятно) значит я на сайте на городил лишних экранированний, на днях переделаю и вставлю только где нужно экранирование
     
  19. Алексей_М

    Алексей_М Активный пользователь

    С нами с:
    1 дек 2012
    Сообщения:
    30
    Симпатии:
    0
    Ganzal, спасибо!!:)

    а можно так же отфильтровать дату? то есть в формате index.php?date=2016-07-22
     
  20. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    оффтоп
    Чуть не захлебнулся .. Пил кофе:D