Фильтрация свичей
1.
chiper (16.08.2010 / 21:59)
Вот какой вопрос. Все знают конструкцию свич кейс. Например она удобна что бы делить файл на несколько частей (или страниц). В начале пишется переменная в которой информация какой блок будет использоваться.. Например это переменная $_GET. Колян56 незнает, надо ее фильтровать или нет. Лично мне кажется что ненадо, но тоже интересно послушать ваши мнения
2.
delete (16.08.2010 / 22:02)
если там будит просто параметр $_GET это потенциальная дыра через которую можно в принципе заюзать произвольный скрипт, будь то шелл или что иное
3.
KOZZ (16.08.2010 / 22:03)
я думаю нет, не надо.
если тот самый гет не будет равен одному из кейсов то автоматически скинет на default значение.
4.
Станислав (16.08.2010 / 22:04)
ну, фильтровать в любом случае лучше всё подряд. Себе безопасней =)
5.
delete (16.08.2010 / 22:04)
а вот как ведет себя гет в конструкции свитч))) тот вопрос спорный
6.
Николай (16.08.2010 / 22:05)
4.
SNELS точно монах, вот и я так считаю)
7.
Владимир (16.08.2010 / 22:07)
Изменил...
Ой. Чтото не то сказал. Простите
Думаю всё таки нужно. Мало ли. Сейчас такое время
8.
chiper (16.08.2010 / 22:08)
4, давайте вывод из базы фильтровать
9.
chiper (16.08.2010 / 22:08)
2, приведи пример. У меня против всех только один аргумент изложеный в 3ем посте
10.
delete (16.08.2010 / 22:09)
Колян 56 (16 Августа 2010 / 22:05)
4. SNELS точно монах, вот и я так считаю)
в зависимости чем заданы case
11.
iSor0k (16.08.2010 / 22:12)
9. Приведи аргумент что надо, кроме то что себе безопасней и такое время? Более раскрытый ответ, а то банально, что так и не понятно по идее толком как лучше сделать. Хотя тоже считаю что надо.
12.
Akdmeh (16.08.2010 / 22:14)
В switch\case фильтровать не надо.
Ну только если потом не выводить результат.
Также не забывайте, что переменная может быть не определена, так что делать что-то так:
$act=isset($_GET['act'])? $_GET['act'] : false;
switch($act)
{
...
хватит в 99% случаев. Опять же, не забывайте, если потом делать echo $act; - надо фильтрировать, если вывода нет - фильтрация не нужна, если там есть другие значения кроме указанных в кейсах - сработает default, либо не сработает вообще)
13.
delete (16.08.2010 / 22:15)
ДИкиЙ Ко_ОтЭ (16 Августа 2010 / 22:08)
2, приведи пример. У меня против всех только один аргумент изложеный в 3ем посте
да не, это я о GET, а вот если оператор свитч, то default все левое уйдет, но мож сервер глюкнет
14.
chiper (16.08.2010 / 22:16)
давайте дойдем до абсурда. Напишем код свича не фильтрованый и будем пробывать хакнуть. У кого получится, тому плюс от меня
15.
KOZZ (16.08.2010 / 22:16)
причем здесь безопасность парни,вы чего гоните %|
"Принцип работы конструкции switch-case такой:
Вычисляется значение выражения;
Просматривается набор значений. Пусть значение1 равно значению выражения, вычисленного на первом шаге. Если не указана конструкция (оператор) break, то будут выполнены команды i, i+1, i+2, ... , N. В противном случае (есть break) будет выполнена только команда с номером i.
Если ни одно значение из набора не совпало со значением выражения, тогда выполняется блок default, если он указан."
о чем тут еще вести разговор?
16.
Станислав (16.08.2010 / 22:17)
ну блин, я вот полагаюсь на экономию размера кода =) Ведь наверняка (ну или всякое бывает) ещё где-то этот самый гет пригодится, помимо свитча. А это уже может быть возможность для xss. Хуже от фильтрации в любом случае не будет.
Как вариант, если для свитча использовать только числовые значения GET, то подставить накрайняк этот долбаный int() и всё, раз уж так страшна фильтрация =) ИМХО.
17.
Akdmeh (16.08.2010 / 22:17)
"но мож сервер глюкнет" - такой же шанс, что сервер глюкнет равен тому, что не сработает mysql_escape_string или htmlspecialchars;)
Нет вывода - фильтрация не нужна.
Если нужно вывести значение через echo в default - отличная XSS.
Правда за все три года пока не пришлось выводить в default переменную условия, но тем не менее;)
18.
Станислав (16.08.2010 / 22:18)
17.
Akdmeh, ну вот, я про то же самое говорю =)
19.
ктулху (16.08.2010 / 22:18)
Фильтровать не нужно, т.к. все предопределённые значения заданы в коде. если будет любое другое содержание то будет default, т.е. тоже предопределена, подделывать её бесполезно.
20.
KOZZ (16.08.2010 / 22:20)
16, ну так речь идет только о самой конструкции, остальное естественно зависит от заточки рук ))
саму конструкцию вы НЕ ХАКНИТЕ!
также не забывайте что switch() работает на базе if-else-elseif
21.
Станислав (16.08.2010 / 22:21)
20.
БелладонН eGo, да знаю я =) Просто у меня часто в процессе коддинга возникали случаи, что предназначенную для одного дела переменную приходилось использовать ещё много где =) После этого появилась привычка всё подряд фильтровать =)
22.
delete (16.08.2010 / 22:22)
ну в общем итог такой, если это переключатель для страниц ни чего фильтровать ненадо, кроме как установлена переменая или нет, что б пробел не сработал за запрос, а вот если там какие данные передаются то фильтруем в зависимости от того какого они типа, цифры, буквы..
23.
delete (16.08.2010 / 22:31)
темка кстати актуальная, я сам свича боялся всегда, и хотя б htmlspecialchars юзал, теперь почищу код)
24.
Neformat (17.08.2010 / 12:24)
Даешь вот такие конструкции для свич и иф/эльз (взято из какого то мега скрипта от какого то шахтера) :
<?
if (empty($_GET['fid']))
{
echo "Ошибка!!!";
;}
if (eregi("[^0-9]", $_GET['fid']))
{
echo"Попытка взлома!!!";
echo'<a href="../index.php?'.$ses.'">Главная</a><br/>';
;}
$fid = $_GET['fid'];
$fid = check($fid);
$fid = htmlspecialchars(mysql_escape_string($fid));
$fid = intval($fid); // p.s. контрольный в голову (мое примечание)
?>
Или вот еще не менее актуальный пример паранойи:
<?
$time = intval(time());
?>
25.
Александр (17.08.2010 / 12:44)
Фильтровать нужно все вводимые пользователем данные, если эти данные в дальнейшем будут выводится или взаимодействовать с бд или файлами.
26.
chiper (17.08.2010 / 12:49)
24, блин. Плюс уже ставил
27.
Владислав (17.08.2010 / 13:06)
24.
Neformat, тогда уж $time = abs(intval(floatval(".time().")));
*ROFL*
А вдруг разработчики пхп каку подсунут?
28.
Александр (17.08.2010 / 13:22)
27, ну и тру цикл для надёжности while(1) $time = abs(intval(floatval(".time().")));
29.
Андрюха (17.08.2010 / 13:32)
27. Не разработчики,а сервер))
30.
Владислав (18.08.2010 / 02:40)
29.
Wapruks, и те и те могут ;)
31.
Саня (18.08.2010 / 09:53)
31.
Tidus, покажи пример опасных сессий
32.
KOZZ (18.08.2010 / 10:48)
32, дождешься от него %)
33.
Александр (18.08.2010 / 10:58)
31, без других дыр, это не дыра.
34.
GEROI (18.08.2010 / 12:25)
[quote]
Akdmeh (16 Августа 2010 / 22:14)
В switch\case фильтровать не надо.
Ну только если потом не выводить результат.
Также не забывайте, что переменная может быть не определена, так что делать что-то так:
$act=isset($_GET['act'])? $_GET['act'] : false;
switch($act)
{
...
Абсолютно согласен.
35.
Богдан (18.08.2010 / 13:02)
24.АХАХ)) спс..поржал от души)) жаль + уже ставил
по теме- фильтруем на вывод и на запись.проверки фильтровать не надо. так как проверка возвращает либо TRUE либо FALSE...где там может быть дыра?)) а с такой параноей как в 24 поста лучше ваще пых не использовать и писать статические страницы на ХТМЛ)))
36.
delete (18.08.2010 / 14:23)
31.
Tidus, еще раз прочти о чем там
читака)))
37.
Виталий (18.08.2010 / 15:00)
24.+ ...
если все фильтровать то потеряеться производительность и вид кода=)
38.
Azzido (18.08.2010 / 15:27)
38.
Vitaliy, причем тут это вообще? Даже несколько десятков лишних htmlspecialchars например увеличат время генерации всего на несколько микросекунд, виду тем более это не помешает, чем отличается код от кода? Просто со стороны логики и вообще взгляда программиста это совершенные глупости и ненужные действия в коде.
39.
KOZZ (18.08.2010 / 15:31)
Azzido (18 Августа 2010 / 22:27)
38. Vitaliy, причем тут это вообще? Даже несколько десятков лишних htmlspecialchars например увеличат время генерации всего на несколько микросекунд, виду тем более это не помешает, чем отличается код от кода? Просто со стороны логики и вообще взгляда программиста это совершенные глупости и ненужные действия в коде.
так бы и говорил,
говнокод ))
40.
Виталий (18.08.2010 / 16:10)
39.ну знаеш если ето очень большой сайт с большой посещаимостю то надо htmlspecialchars и т.д по необходимости ставить
41.
KOZZ (18.08.2010 / 16:11)
41 , нужно ставить, только именно по необходимости
42.
delete (18.08.2010 / 16:13)
блин кройте тему, а то уже перешли на то с чего и начинали)))
43.
Zдешний (18.08.2010 / 16:36)
действительно кройте))
URL:
https://visavi.net/topics/12681