Код (Text): $_GET['page']=isset($_GET['page'])?intval($_GET['page']):'first'; как думаете тут стоит экранировать $_GET['page']?
экранировать стоит все, что "идет" в базу данных и экранирование создано для базы данных, а не для чего то другого.
а что с этими данными дальше происходит? понимаете, конструкция $p = isset($_GET['p']) ? (int) $_GET['p'] : 0; значит я в ключе п жду число. и не важно число там или не число - я приведу к числу. а если не будет указано - переменная все равно объявится с числовым значением. некоторым "дефолтом". то есть я буду уверен в том что у меня это число. и могу подставлять это в запрос. и проводить любые другие математические операции. причем тут htmlspecialchars? причем тут экранирование?
ну а если ваш сайт хотят взломать, через вашу p, методом той же подстановкой, получается они получат xss уязвимость?
нет. еще варианты? Добавлено спустя 1 минуту 48 секунд: только перед тем как постить еще варианты - голову прошу включить. кофе там попить, прогуляться. что там еще нужно. чакры раскрыть. итак. еще варианты?
ответ: вы невнимательно читаете мануал зато паникуете по каждому поводу. что написано в статье по ссылке? что многие ковнокодеры громоздят онуехные стеки вызовов функций назначений которых они не понимают. я что просил сделать? включить голову. итак. внимательный читатель обратит внимание на то что именно я делаю. в отличие от приведенной статьи где ГОВНОКОДЕРЫ проверяют через if(intval(hujsobachiy)){}{} и попадают на то что "если там есть число то функция вернет истину и можно атаковать сайт" я занимаюсь кастом к целочисленному значению. это значит для строки "11+мывсеумрем" каст в интеджер будет равен одинадцати. без всякого говна справа. а каст для "даонделокажетсяговорит+100500" каст будет ноль. потому что конструкция каста работает следующим образом. ЧИТАЕТ СТРОКУ СЛЕВА НАПРАВО В ПОИСКАХ ПЕРВОГО НЕЧИСЛОВОГО СИМВОЛА. не сложно догадаться что в случает когда не число ей встречается первой она заканчивает с нулевым значением. а когда хоть сколько-то нумералов ей встретилось - она закончит "число" на этом и все остальное отбросит. итак у нас при любом строковом значении в ключе П - в переменной П будет всегда число. допустим нет ключа П. тогда мы объявляем П с нулевым дефолтом. и опять итак. у нас в сценарии теперь число П. я могу его умножить на кол-во элементов на странице и получить ЧИСЛОВОЕ ВСЁ ЕЩЕ значение офсета которое смелейшим образом могу использовать с запросе "селект астериск фром тейблнэйм лимит П_ОФСЕТ элементс_пер_пэйдж". и мне даже не пришлось: - экранировать управляющие последовательности скуэля mysqli?_(real_)?_escape_string я ведь знаю что у меня там число лежит. а числом не поломать запрос. - преобразовывать специальные символы html в сущности htmlspecialchars так как число априори не содержит ничего кроме нумералов. - проверять лежит ли там число if(intval()) так как я уверен что там всегда будет число - добавлять слеши addslashes так как они реально нафиг не сдались обычной четырехбайтной переменной в числовом представлении - обрезать значение trim() ибо ну нафига оно мне - пробелы будут пропущены на автомате при касте. а как будет непробельный символ - начнется гадание число-не-число. - выполнять еще какие-то странные проверки за которыми внимательно следят санитары. впрочем, говнокодеры все равно продолжат жопой орехи колоть в процессе чтения анекдотичных статей о конце света. ведь они в голову только едят. тут я бессилен... к счастью
ну я так понял из вашего соощения, что не всегда нужно применять экранизацию, экранизацию надо применять в таких случиях как тут $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 к примеру
вы неправильно поняли. экранизацию нужно применять тогда когда она нужна. не надо нагружаться лишними эскейпами когда работаем с числом. не трогайте html-функции когда не работаете с html-контекстом. всё должно быть разумно. вам самому удобно такой код читать? в этих переменных должны быть допустимые значения. разве нет? там останется только real_escape_string для управляющих последовательностей скуэля.
Под экранирование как правило понимается экранирование переменных запроса в БД, для этого используется функция real_escape_string, в частности она защищает от SQL инъекция, найди на википедии там показано как это делать. htmlspecialchars, заменяет специальные символы используемые в HTML на что то там (бошка болит лень описывать), символы такие например как "<", ">". представь ситуацию, у тебя есть textarea в котором ты редактируешь html разметку и в этой разметки присутствует textarea, что то типа: Код (PHP): $html = '<div><textarea name="ta"></textarea></div>'; echo '<textarea>'. $html .'</textarea>'; Запусти и посмотри исходный код и вообще, вот для таких случаев нужно htmlspecialchars: Код (PHP): $html = '<div><textarea name="ta"></textarea></div>'; echo '<textarea>'. htmlspecialchars($html) .'</textarea>'; и еще есть третья тема, это strip_tags, очищает текст от HTML тегов, для чего это нужно, представь у тебя доска объявлений, кто то добавил текст вместе с JS скриптом который запускает форматирование всех дисков (шутка конечно, такое не возможно, наверно), этот скрипт у тебя сохранился как обыкновенный текст, а потом при выдаче текста он работает как полноценный скрипт, и любой кто зайдет на это объявления останется с отформатированными дисками, вот для этих целей служит strip_tags, что бы очистить от ненужных тегов текст.
VLK спасибо огромное, объяснили доходчиво и все понятно) значит я на сайте на городил лишних экранированний, на днях переделаю и вставлю только где нужно экранирование