Защитен ли е кода?

farzy

Registered
Здравейте, тъй като съм нов в сверата на PHP, реших да ви попитам, има ли уязвимости в този код?

Код:
<?php
$_GET['p'] = htmlspecialchars($_GET['p']);
if (!isset($_GET['p'])){
	$page = "page/home.php";
}else{
	if (!isset($_GET['ext']) || $_GET['ext'] == ''){
		if ($_GET['p'] == "home") {
			$page = "page/home.php";
		}else{
		if ($_GET['p']) {
$page = "page/" . $_GET['p'] . "/index.php";
	}else{
				$page = "page/home.php";
			}
		}
	}else{
		if ($_GET['p']) {

$page = "page/" . $_GET['p'] . "/" . $_GET['ext'] . ".php";
}else{
			$page = "page/home.php";
		}
	}
}
if(!file_exists($page))
{
echo '<br><br><font color="red" size="5"><b>Няма такава страница !!!</b></font><br><br>';
}
else
{
include("$page");
}
?>
 
PHP:
<?php

if ( isset($_GET['p']) )
	$page = $_GET['p'];
else
	$page = 'home';

$pages = array('home', 'stranica1', 'stranica2', 'stranica3');
if ( in_array($page, $pages) )
{
	include($page);
}
else
{
	echo '<br><br><font color="red" size="5"><b>Няма такава страница !!!</b></font><br><br>';
}

?>

Разгледай го и си добави имената на страниците
 
fcvc_gaming каза:
А ако се ползва switch и имаме $p = $_GET['page'] по защитено ли е?
relax4o каза:
И за какво ти e switch() на @Storm е много по-оптимизиран кода.

Да , със switch може да се постигне същият ефект.
За да ти е 'защитен' кода трябва да се насочиш към няколко неща :
1 - да се опиташ да предвидиш колкото се може повече вероятности който могат да се случат. Главно да се въведат невалидни данни.
2 - да опростиш нещата максимално. Колкото е по-просто нещо, толкова по-малка вероятност има за да възникне проблем. Примера със switch е по-лесен видимо, но не обхваща доста вероятности, както за всяка една страница ще трябва да пишеш условие.
Пример:
PHP:
switch ($i) {
    case "apple":
        echo "i is apple";
        break;
    case "bar":
        echo "i is bar";
        break;
    case "cake":
        echo "i is cake";
        break;
    case "bar":
        echo "i is bar";
        break;
    case "cake":
        echo "i is cake";
        break;
    case "bar":
        echo "i is bar";
        break;
    case "cake":
        echo "i is cake";
        break;
    case "bar":
        echo "i is bar";
        break;
    case "cake":
        echo "i is cake";
        break;
}

Виж този промер. Абстрахирай се от това , че има няколко думи който се въртят. Какво ще стане ако имаш 1001 страници - ще имаш минимум 3003 реда. Не е много оптимизирано нали ? При положение , че можеш да имаш страниците в масив, в който да търсиш и след това да правиш каквото и да е като заместваш с това което имаш.А ако го няма - ще вади нещо като основа......


Също така при switch има и един недостатък.
Започва да се проверят нещата от горе на долу едно по едно.Нека да гледаме ресурсите и времето, а това какви проблеми може да създаде.
Ако имаш да кажем 10 променливи , и ги обходиш със switch , и си допуснал грешка или имаш невалидни входящи данни ще стане много кофти ,защото ще се извикат, примерно номер 1 , номер 3, и номер 5 от този switch . Докато в примера който колегата ти даде ще се изпълни само едно.Което вярвам , че това желаеш. Ако в тези страници има дизайн, не само логика , може да ти прецака най-малкото визията на сайта.
 
Добре но защо никъде в кода на @StormBreaker няма разширението на файла иначе и аз мисля че наговия начин е по-добър но за информация исках да знам за switch иначе защото в кода му никъде няма разширение за страницата?
 
Защото съм го пропуснал:

PHP:
<?php

if ( isset($_GET['p']) )
        $page = $_GET['p'];
else
        $page = 'home';

$pages = array('home', 'stranica1', 'stranica2', 'stranica3');
if ( in_array($page, $pages) )
{
        include($page . '.php');
}
else
{
        echo '<br><br><font color="red" size="5"><b>Няма такава страница !!!</b></font><br><br>';
}

?>
 
Мерси за разяснението. Въпроса дето питах за switch беше просто информативен за да си направя сравнение, кой метод е по компактен, по-оптимизиран и т.н
 
Опитавай се всички $_GET да са ти числа. И проверявай ако е число въведеното в $_GET тогава да изпълни кода.

Виж има една тема направена е важна в този раздел, специално за защити е.
 
eddyy93 каза:
Опитавай се всички $_GET да са ти числа. И проверявай ако е число въведеното в $_GET тогава да изпълни кода.

Виж има една тема направена е важна в този раздел, специално за защити е.

Неговия въпрос е далеч по-различен от това, което ти предлагаш.
 

Back
Горе