Защита на GET

Blackmailer

Registered
Това, което съм направил е:

имам променлива $id, която не е от базата данни, но чрез нея отварям страницата pics.php?id="$id" и се отварят различни картинки спрямо линка, който е цъкнат, въпроса ми е как да защитя GET от атаки и как да направя така, че ако някой напише нещо горе в примерно id=222323 да излиза :
Няма такава снимка!
 
PHP:
if(isset($_GET['id'])) {
  $id = (int)$_GET['id'];

  $path = 'path_to_images/'.$id.'.jpeg';


   if(file_exists($path)) {
        
         echo '<img src="'.$path.'"  width="300px" height="300px"/>';
 
   }
}
 
още малко сигорност
Код:
foreach($_GET as $key => $val)
		{
			if(is_array($val))
			{
				foreach($val as $sub_key => $sub_val )
				{
					$_GET[$sub_key]= htmlspecialchars($sub_val, ENT_QUOTES);
				}
			}
			else
			{
				$_GET[$key]= htmlspecialchars($val, ENT_QUOTES);
			}
		}
 
От това няма нужда, ако се очаква от $_GET да дойде число, както е в случая, единствено кастването към integer е достатъчно.

Говоря за това:
PHP:
$id = (int)$_GET['id'];

А попринцип от такъв тип проверки със тези циклии, които си постнал, може би ще има полза ако очакваш неопределн брои и от различен тип входни параметри.
 
цикъла покрива всякъкви типове данни като базова защита и е повече от идеално, или е по добре на сяка страница да пишеш по 100 пъти addslashes, stiptags, htmlspecialchars и mysql_real_escape_string ?
 
stankata90 каза:
цикъла покрива всякъкви типове данни като базова защита и е повече от идеално, или е по добре на сяка страница да пишеш по 100 пъти addslashes, stiptags, htmlspecialchars и mysql_real_escape_string ?

Претрупания код пречи, имай го предвид. Когато на едно място се очаква само и единствено число кастването му до такова е предостатъчно, защото ако има нещо различно от число то връща 0. Единственото, което трябва да се направи е, да не се допуска 0 да е валидно число.
Другото, което е, щом държиш да ползваш твоята функция, то поне махни единия цикъл и виж как работи array_map() ;)

В случая на автора, съвета на @eddyy93 е достатъчно добър.
 
Revelation каза:
stankata90 каза:
цикъла покрива всякъкви типове данни като базова защита и е повече от идеално, или е по добре на сяка страница да пишеш по 100 пъти addslashes, stiptags, htmlspecialchars и mysql_real_escape_string ?

Претрупания код пречи, имай го предвид. Когато на едно място се очаква само и единствено число кастването му до такова е предостатъчно, защото ако има нещо различно от число то връща 0. Единственото, което трябва да се направи е, да не се допуска 0 да е валидно число.
Другото, което е, щом държиш да ползваш твоята функция, то поне махни единия цикъл и виж как работи array_map() ;)

В случая на автора, съвета на @eddyy93 е достатъчно добър.

може да се сложи в db файла колко да пречат 10 реда там, а array_map() не ми е симпатична ;)
 
stankata90 каза:
Revelation каза:
stankata90 каза:
цикъла покрива всякъкви типове данни като базова защита и е повече от идеално, или е по добре на сяка страница да пишеш по 100 пъти addslashes, stiptags, htmlspecialchars и mysql_real_escape_string ?

Претрупания код пречи, имай го предвид. Когато на едно място се очаква само и единствено число кастването му до такова е предостатъчно, защото ако има нещо различно от число то връща 0. Единственото, което трябва да се направи е, да не се допуска 0 да е валидно число.
Другото, което е, щом държиш да ползваш твоята функция, то поне махни единия цикъл и виж как работи array_map() ;)

В случая на автора, съвета на @eddyy93 е достатъчно добър.

може да се сложи в db файла колко да пречат 10 реда там, а array_map() не ми е симпатична ;)

Е щом програмистите вече работят на симпатично и несимпатично, явно вече съм old school...

Спирам с темата, каквото казах по нея казах. :)
 
Е ся чак пък толкова, обърках се от факта че в php може да се правят милярди комбинаций и всеки си преценява коя фукция къде и как да ползва. Но щом се работи по някакъв шаблон? Какво ви става бе хора ??!! Защо приемате всичко толкова навътре засягате се и пускате разгневени коментари... Имам 30 коментара в някой от тях изразих лично мение и гледай кво става. Недай си боже да збъркаш... ей тогава вече линчуването не ти мърда...
 
Ако се очаква да е число, то няма смисъл от никакви проверки :/
С кода на @eddy93 абсолютно нищо не те спира да търсиш за всичко друго различно от число :) Тоя (int) не е толкова магически, както го обрисувахте :)
Пък и реално няма какво толкова да се защитава, все пак имаш проста функция file_exists която ти връща TRUE/FALSE.

ПП А за array_map() не е нито best practice, нито би ти помогнало за перформънс някакъв, може би е по-прегледно като код, но не виждам никаква друга полза от това.
 
Как ще го заобиколиш (int)?

При определени случаи връща и страннни резутати, но не са нищо което застрашва сигурността, то те си клонат към типа на числата.
 
eddyy93 каза:
Как ще го заобиколиш (int)?

При определени случаи връща и страннни резутати, но не са нищо което застрашва сигурността, то те си клонат към типа на числата.

Не знам дали въобще се замисляш колко смешно звучи това "при определени случаи връща странни резултати". Дано наистина никога не ти се налага да го обясняваш на някой клиент да кажем, недай си боже на колега или шеф :)
(int) не връща странни резултати, много нормални резултати си връща според това каква стойност му подаваш, има идея да ти върне integer, когато самата стойност е числова, без значение от типа и.

Да се опитваш да накараш кода да обработва стойност като друг тип, въобще (според моите разбирания) не е проверка, и някакъв вид сигурност.
 
Каква проверка му е нужна въобще ? Въпроса е да се подаде число и да се провери дали файл с това ID съществува. Не знам защо много хора предпочитате да залеете една част от кода си с ненужни проверки, когато 1-2 могат да свършат нужната работа(поне според описаното от автора).

Относно array_map(), дори и така да е. При положение, че правиш рекурсии, то нищо не ти пречи да си направиш своя функция, която ще има по-голямо бързодействие. Но да тупаш така цикли, не мисля, че е много удачно.
 
Replace каза:
eddyy93 каза:
Как ще го заобиколиш (int)?

При определени случаи връща и страннни резутати, но не са нищо което застрашва сигурността, то те си клонат към типа на числата.

Не знам дали въобще се замисляш колко смешно звучи това "при определени случаи връща странни резултати". Дано наистина никога не ти се налага да го обясняваш на някой клиент да кажем, недай си боже на колега или шеф :)
(int) не връща странни резултати, много нормални резултати си връща според това каква стойност му подаваш, има идея да ти върне integer, когато самата стойност е числова, без значение от типа и.

Да се опитваш да накараш кода да обработва стойност като друг тип, въобще (според моите разбирания) не е проверка, и някакъв вид сигурност.
Добре, въпрос! Имам някакъв линк sait.com/get.php?id=10 . Така та използвам цифрата от гет заявка и с това ИД вадя някаква информация за даден потребител:
Код:
if(isset($_GET['id'])) 
{
  $id = (int)$_GET['id'];
  // nqkakva zaqvka s izvejdane na rezultata
}
Как ще заобиколиш проверката дали е въведено число? Ако въведеш
sait.com/get.php?id=10+- или някакъв стринг $id няма да приеме стойност 10+- ? Фактически проверката си е много добра ако очакваш само число от Гет заявката. SQLi няма да има (eстествено зависи как е написан и структуриран [целия код).
 
Revelation каза:
Каква проверка му е нужна въобще ? Въпроса е да се подаде число и да се провери дали файл с това ID съществува. Не знам защо много хора предпочитате да залеете една част от кода си с ненужни проверки, когато 1-2 могат да свършат нужната работа(поне според описаното от автора).
Именно, и аз съм на това мнение. Колкото до многото хора, нормално е след като нямаш богат опит и нужни знания, да допускаш грешки (ако въобще може да се нарече грешки).

Revelation каза:
Относно array_map(), дори и така да е. При положение, че правиш рекурсии, то нищо не ти пречи да си направиш своя функция, която ще има по-голямо бързодействие. Но да тупаш така цикли, не мисля, че е много удачно.
Това да работиш с array_map, при всяка нужда за обработка на масив също не е много удачно. С какво ми помага, ако на места срещам array_map(), с някаква къстъм функция намираща се в съвсем различен файл, кое му е уместното?
Инак да, нищо не ти пречи :)
 
@dakata кастването не е проверка, а превръщане. Важна е терминологията. При 10+-, ако не се лъжа трябва да върне само 10, а ако имаш преди числото нещо различно от число, то ще ти върне 0. Просто програмиста трябва да се старае 0 да не е валидна стойност.
Друг вариант, ако желаеш е, с регулярен израз винаги да взимаш числото независимо къде, как и какво е подадено, стига да има число. Но за мен това е неудачен вариант. Предпочитам да покажа на потребителя(или горкото дете, което се мъчи да се прави на хакер), че това което прави няма да премине. Все пак не е правилно, при подаване на грешни данни, да вадиш някакъв резултат.

@Replace, ако тези функции са в различни файлове, то това ще говори само едно - неправилно структуриране на файловете. Но да приключим с тази тема, относно array_map() и кое е по-удачно да се ползва. За тези неща няма какво да се говори за бързодействие, не са в състояние да се усетят така или иначе, но аз предпочитам подредеността на кода и намаляване размера на файла.
 
Revelation каза:
@dakata кастването не е проверка, а превръщане. Важна е терминологията. При 10+-, ако не се лъжа трябва да върне само 10, а ако имаш преди числото нещо различно от число, то ще ти върне 0. Просто програмиста трябва да се старае 0 да не е валидна стойност.
Друг вариант, ако желаеш е, с регулярен израз винаги да взимаш числото независимо къде, как и какво е подадено, стига да има число. Но за мен това е неудачен вариант. Предпочитам да покажа на потребителя(или горкото дете, което се мъчи да се прави на хакер), че това което прави няма да премине. Все пак не е правилно, при подаване на грешни данни, да вадиш някакъв резултат.

@Replace, ако тези функции са в различни файлове, то това ще говори само едно - неправилно структуриране на файловете. Но да приключим с тази тема, относно array_map() и кое е по-удачно да се ползва. За тези неща няма какво да се говори за бързодействие, не са в състояние да се усетят така или иначе, но аз предпочитам подредеността на кода и намаляване размера на файла.
Малко по-двусмислено съм се изразил нямах предвид положително отрицателно число а просто символи след цифрата, като 10'#string . Когато очакваш някаква цифра, а не стринг защо ти е регулярен израз, като и това върши работа? Да за нулата съм съгласен но зависи от случая и употребата на кода.
 
Не си се изразил двусмислено :D Разбрах какво имаш предвид и имах предвид, че всичко след числото ще го махне. Т.е. ще си остане само 10. А ако пред числото имаше нещо друго, то тогава ще ти върне 0. Винаги ще ти върне 0, ако пред числото има нещо различно от число.
 
Revelation каза:
@dakata кастването не е проверка, а превръщане. Важна е терминологията. При 10+-, ако не се лъжа трябва да върне само 10, а ако имаш преди числото нещо различно от число, то ще ти върне 0. Просто програмиста трябва да се старае 0 да не е валидна стойност.
Друг вариант, ако желаеш е, с регулярен израз винаги да взимаш числото независимо къде, как и какво е подадено, стига да има число. Но за мен това е неудачен вариант. Предпочитам да покажа на потребителя(или горкото дете, което се мъчи да се прави на хакер), че това което прави няма да премине. Все пак не е правилно, при подаване на грешни данни, да вадиш някакъв резултат.

@Replace, ако тези функции са в различни файлове, то това ще говори само едно - неправилно структуриране на файловете. Но да приключим с тази тема, относно array_map() и кое е по-удачно да се ползва. За тези неща няма какво да се говори за бързодействие, не са в състояние да се усетят така или иначе, но аз предпочитам подредеността на кода и намаляване размера на файла.
Много интересно сам твърдиш нещо, и в следващия пост се отричаш от него. Как говориш принципно, но пък всъщност много зависещо от частния случай. Но както каза, нека да я приключваме тази тема. Всеки си има глава на раменете, нека сам да си взема решенията.
 
Replace каза:
Revelation каза:
@dakata кастването не е проверка, а превръщане. Важна е терминологията. При 10+-, ако не се лъжа трябва да върне само 10, а ако имаш преди числото нещо различно от число, то ще ти върне 0. Просто програмиста трябва да се старае 0 да не е валидна стойност.
Друг вариант, ако желаеш е, с регулярен израз винаги да взимаш числото независимо къде, как и какво е подадено, стига да има число. Но за мен това е неудачен вариант. Предпочитам да покажа на потребителя(или горкото дете, което се мъчи да се прави на хакер), че това което прави няма да премине. Все пак не е правилно, при подаване на грешни данни, да вадиш някакъв резултат.

@Replace, ако тези функции са в различни файлове, то това ще говори само едно - неправилно структуриране на файловете. Но да приключим с тази тема, относно array_map() и кое е по-удачно да се ползва. За тези неща няма какво да се говори за бързодействие, не са в състояние да се усетят така или иначе, но аз предпочитам подредеността на кода и намаляване размера на файла.
Много интересно сам твърдиш нещо, и в следващия пост се отричаш от него. Как говориш принципно, но пък всъщност много зависещо от частния случай. Но както каза, нека да я приключваме тази тема. Всеки си има глава на раменете, нека сам да си взема решенията.

Би ли писал на лично какво съм казал и от какво съм се отрекъл, за да не спамим тук.
 

Горе