NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Bezpečnost kódu

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
kom72
Člen
Avatar
kom72:28.2.2016 7:40

Ahoj,
jako naprostý PHP analfabet, jsem se pustil do překopání svých statických stránek na stránky využívající PHP a MySQL. http://www.kom72.cz/index.php
Podle jakéhosi návodu na webu, jsem udělal to, že mám hlavní stránku index.php, kde mám hlavičku, menu, patičku a pouze do ní pomocí příkazu

include

vkládám do určité části obsah. Udelal jsem si slozky OBSAH (kde mám php stránky s jednotlivým obsahem) a DEFINICE (kde mám např. kód prave na nacitani stranek do obsahu, scripty z hlavikcy atd.) Otázka zní, je to takto bezpečné a správně pojaté?
Ještě přikládám zatím na kontrolu kód na skládání jednotlivých stránek webu. Díky za váš čas a ochotu poradit.

Volání kódu:

<?php include ("definice/skladani_stranek.php"); ?>

Kód:

<?php
        if (isset($_GET['stranka']))
            $stranka = $_GET['stranka'];
        else
            $stranka = 'uvod'; // pokud parametr není zadaný, zobrazí se tento obsah
        if (preg_match('/^[a-z0-9_]+$/', $stranka)) // zabezpečení -> v hranaté závorce jsou povolené pismena, cislice a podtržítko, ktera se mohou objevit za: index.php?stranka=
        {
            $vlozeno = include('obsah/' . $stranka . '.php');
            if (!$vlozeno)
                echo('Obsah nenalezen');
        }
        else
            echo('Neplatný parametr.');
?>
 
Odpovědět
28.2.2016 7:40
Avatar
Deart
Tvůrce
Avatar
Deart:28.2.2016 19:03

Doporučuji všechny proměnné které může uživatel nějakým způsobem ovlivňovat ošetřit funkcí htmlspecialchars.

$stranka=htmlspecialchars($_GET['stranka']);

Do první podmínky bych ještě přidal...

&& !empty($_GET['stranka']))

Pak by bylo ještě vhodné ošetřit zda požadovaný soubor existuje.

 
Nahoru Odpovědět
28.2.2016 19:03
Avatar
Petr Juhanak
Člen
Avatar
Petr Juhanak:11.7.2016 20:48

Ahoj,
podívej se na OWASP projekt ESAPI, to jsou knihovny pro validaci vstupních dat, která je dostupná i pro PHP. Jinak validaci hodnot v byznys/aplikační logice bys měl dělat taky, to za tebe bezpečnostní knihovna neudělá.

Petr

 
Nahoru Odpovědět
11.7.2016 20:48
Avatar
Martin Konečný (pavelco1998):11.7.2016 21:41

A mně zas přijdou obě odpovědi mimo mísu :D
htmlSpecialChars je tady úplně useless a podmínka isset stačí. Jelikož je tazatel začátečník, pak řešit nějakou velkou security je trochu nad rámec.

@kom72: Tady je cílem v podstatě jen to, aby se podle parmetru v URL vložil správný soubor. Pokud parametr neexistuje, použije se "uvod" jako default, OK. To ti zabrání errorům typu "notice: undefined index 'stranka' in ...".
Pak potřebuješ zamezit možnosti vložení jiného souboru, než které jsou povolené (typická chyba při include $_GET["stranka"]). Ten regulární výraz mi na to připadá OK.

Mám pocit, že include ti hodí notice, pokud daný soubor neexistuje. Osobně bych to raději pořešil funkcí file_exists().

Jinak se mi to zdá v pohodě.

Nahoru Odpovědět
11.7.2016 21:41
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Vladislav Domin:12.7.2016 9:26

Ja na svojej stranke to mam poriesene takto, neviem ake bezpecne to je, ale urcite kratsie ako tvoje riesenie

if (isset($_GET['page']))
            {
                $page = $_GET['page'];
                if (file_exists('sub/' . $page . '.php'))
                {
                    include('sub/' . $page . '.php');
                }
                else
                    include('sub/error404.php');
            }
            else
            {
                include('sub/home.php');
            }
 
Nahoru Odpovědět
12.7.2016 9:26
Avatar
Odpovídá na Vladislav Domin
Martin Konečný (pavelco1998):12.7.2016 12:03

takhle se můžu dostat i k úplně jiným souborům, když ti do URL hodim "../"

Nahoru Odpovědět
12.7.2016 12:03
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Vladislav Domin:12.7.2016 14:00

vtedy by ti to malo vyhodit 404, ak sa budes pokusat nejaky otvorit nie?

 
Nahoru Odpovědět
12.7.2016 14:00
Avatar
Odpovídá na Vladislav Domin
Martin Konečný (pavelco1998):12.7.2016 16:45

Pokud ten soubor bude existovat, pak se prostě vloží :) když ti pak vyjde třeba

include "sub/../../../soubor.php";

tak je to jako bys měl jenom

include "../../soubor.php";

a najednou se ti do obsahu vloží soubor, který by se vůbec vložit neměl (mimo složku sub).
Myslim, že v tomhle nepomůže ani .htaccess. Je tedy potřeba zamezit možnost do toho parametru v URL vložit tečky a lomítka (nebo to prostě nějak ošetřit, aby nešlo vložit nic mimo tu složku sub).

Nahoru Odpovědět
12.7.2016 16:45
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Vladislav Domin:12.7.2016 19:12

Sorry za palec dole (preklik) ...

Ta stranka a jej struktura je urobena tak, ze aj keby sa nieco take stalo, tak sa nic nestane, ale kazdopadne osetrim to nejako pre buducnost

Editováno 12.7.2016 19:13
 
Nahoru Odpovědět
12.7.2016 19:12
Avatar
Odpovídá na Vladislav Domin
Martin Konečný (pavelco1998):12.7.2016 20:13

Nespoléhej se na něco, co se může kdykoliv změnit :D pak se na to zapomene a je problém. Obecně je lepší vůbec nenechat možnost zajít do jiných adresářů

Nahoru Odpovědět
12.7.2016 20:13
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 10.