Autor Zpráva
Rob
Profil
Takže,
pokud vše vyjde, tak budu dělat docela rozsáhlý projekt. Bude to i v rámci školy. No a prostě plánuju se na tom naučit nové věci. Takže asi v téhle souvislosti tady v budoucnu bude hodně dotazů :-). Ale nebudu předbíhat.

Takže. Doposud jsem dělal tajné sekce do jednoho souboru přes switch. Tady jsem to zabezpečoval tak, že jsem switch obalil if ($_COOKIE['povoleni_k_pristupu'] == 'povoleno') { a tady byl ten swith no a } else { trhněte si nohou (tohle tam sice není, ale vypadá to líp) no a tady to je jednoduché. Takhle jsem původně dělal i vkládání obsahu. Teď jse se naučil index.php?sekce=neco a script udělá to, že includne stránku neco.php. Určitě to znáte. No a já se ptám: Když bych udělal tu podmínku na cookie a když to povolení bude, tak teprve ten script na vložení stránky podle $_GET['sekce']. Jde mi o to: nevidíte někdo v tomhle nějakou bezpečnostní mezeru oproti načítání ze switche?? No a pokud bych chtěl začít zabezpečovat pomocí session: jak se správně ověřuje povolení. předpokládám, že if $_SESSION['povoleni_dsfsfsdfs'] == 'jasne_ze_jio' se to asi dělat nebude.

Takhle to zní docela nepochopitelně, takže ukázky:

původně:
if ($_COOKIE['povoleni_k_pristupu'] == 'jiste_ze_jo') {
switch ($_GET['sekce']) {
case:
spojit databázi
vykonat příkaz
echnout výsledek
break;
case:
spojit databázi
vykonat příkaz
echnout výsledek
break;
}
} else {echo 'trhni si!!!'; }

No a teď vkládám příkazem:
$page = $_GET['sekce'];
$dir = 'adresar/';
$uvodni = 'uvodni.php';

if ($page) {
if (file_exists($dir.$page.'.php')) {
include ($dir.$page.'.php');
} else { include ($dir.'404.php'); }
} else {
include ($dir.$uvodni);
}

no a jde mi o to: když tenhle script na vkládání obalím tím co kontroluje povolení a budu vkládat třeba
nejakastranka.php:
<?
spojit databázi
vykonat příkaz
echnout výsledek
?>
Tak jestli v tom není nějaká bezpečnostní díra.
jogurt
Profil
jestli sem to dobre pochopil (to bylo dost tezky :-), tak prestoze nejsem profesionalni hacker, tak tam vidim dve diry.
1) kdyz si potencialni utocnik nahraje primo stranku nejakastranka.php, tak je tam i bez hesla...
--> takze by bylo asi lepsi includovat nejakej script na zabezpeceni do kazde stranky.
2) kdyz pouzijes to "if ($_COOKIE['povoleni_k_pristupu'] == 'jiste_ze_jo') ", tak si muze do cookie sam napsat 'jiste_ze_jo' i bez znalosti hesla...
--> to se resi vetsinou tak, ze do cookie ulozis pomoci md5 zasifrovane heslo a pri kazdem nahravani tajne stranky ho testujes. Ale nejlepsi je vubec to nedelat pres cookie, ale pres sessions nebo v databazi.
j
Rob
Profil
jogurt
Nojo, to jsem tušil, takže bych asi zůstal u toho jednoho souboru ve switchi a ověřoval to pomocí toho hesla při každé akci. Ale tím pádem jeden dotaz ke spojení s MySQL. Když bych to takhle udělal, jak mám vymyslet spojení, aby nějak příliš nenaskakoval počet těch spojení???
Něco jako před začítkem toho switche spojit databázi a pak????.....kde bych to spojení měl ukončit, abych měl co nejmelší počet přístupů? A stejně nevypadalo by to tak, že při každém volání toho scriptu by se to spojení otevřelo znovu? Tedy při každém kliknutí...

Jde o to, že to bude celkem velký, i když asi i docela bezvýznamný projek. A budu se na tom učit některé nové věci. No a prostě to chci pojmout co nejprofesionálněji. A u zabezpečení to asi začíná.....
Rob
Profil
A k tomu vkládání:
Pokud by ty vkládané soubory byly pouze pro práci s databází, tak:
Sice můžete tu adresu zadat rovnou, ale když zadáte adresu toho jednoho scriptu, tak vám to nic nevypíše, protože nebude mít co vypisovat. Z něčeho musí získat informaci, co má vyspat. Nebo mi prostě něco uniklo? A nebo ještě lépe: Jak vůbec tyhle problémy řešíte vy?
printf_jinde
Profil *
includování souborů s názvem přejatým z proměnné GET, POST, COOKIE je IMHO jeden z nejhorších způsobů, ale pokud to zabezpečíte, můžete leckoho nachytat a pak se podívat do logu, co vám to chtěl podstrčit (četba logů je ideální pro dlouhé zimní večery...):

s tou proměnnou $_GET['sekce'] bych tedy naložil následovně:
zalogovat ji do souboru, otestovat jestli neobsahuje znaky, které nemá obsahovat (třeba lomítko či dvojtečku) a pokud ne, předat ji do proměnné $sekce:
$pole = array ('hlavni.php'=>'adresar/inc_hlavni.php','dalsi.php'=>'adresar/inc_dals i.php'); atd..
if (file_exists($pole[$sekce])) { include ($pole[$page]); } else...

pole zde funguje jako takový překladatel s kontrolou

Do cookie bych uložil maximálně číslo seance nebo něco neškodného, jako počet zobrazených fotek u fotogalerie a podobně. Je to také proměnná od uživatele, která může obsahovat leccos co si vymyslí, takže kontrolovat jako ostatní proměnné od uživatele.

Během skriptu se samozřejmě jedno spojení s db otevřít musí. V tom spojení se pak položí minimální počet skromných dotazů, které databázi zbytečně nezatíží a zpracují se výsledky. I přesto těch dotazů někdy musí být několik a databáze se s tím holt musí poprat.

No a prostě to chci pojmout co nejprofesionálněji.
chválím, jen vytrvat :-)
jozob
Profil
http://interval.cz/clanek.asp?article=2730
http://interval.cz/clanek.asp?article=2405
http://interval.cz/clanek.asp?article=895
http://www.pcsvet.cz/art/article.php?id=1072
http://www.pcsvet.cz/art/article.php?id=5562
http://www.pcsvet.cz/art/article.php?id=2722
http://www.pcsvet.cz/art/article.php?id=3509
Rob
Profil
printf_jinde
Já jsem na to šel a půjdu takhle:
Takže vkládání dělám tak, že (už to vlastně bylo nahoře)

$page = $_GET['sekce'];
$dir = 'adresar/';
$uvodni = 'uvodni.php';

if ($page) {
if (file_exists($dir.$page.'.php')) {
include ($dir.$page.'.php');
} else { include ($dir.'404.php'); }
} else {
include ($dir.$uvodni);
}

takže pokud budě nějaká špatná adresa, tak to hodí 404. Proměnné do $_GET['sekce'] dávám přes odkazy, takže nevidím samo o sobě nějaký problém.

A jak na to půjdu.
Konečně jsem přišel na to, kde dělám chybu v sessions, takže už je umím používat. Proto všechno hodím do sessions a když už budu muset otevřít připojení k databázi, tak rovnou ověřím znovu i to heslo v md5(). To už nebude takový problém. A aspoň mi to zvýší bezpečnost i v tom, že prozatím jsem hesla ukládal přes MySQL funkci PASSWORD(). Takže to samo o sobě asi moc bezpečné taky nebylo.

A ještě si neodpustím nějaký dotaz:
1) Zdá se vám to co jsem nastínil bezpečnostně použitelné??
2) a jeden takový docela (ok, velmi) trapný dotaz: Jak vypnout session?? Nemůžu to nějak najít.

No a prostě to chci pojmout co nejprofesionálněji.
chválím, jen vytrvat :-)

Díky. Pokusím se. Do budoucna to stejně asi jinak nepůjde.
Rob
Profil
jozob
Díky!
Rob
Profil
Aha,
session_destroy();
našel jsem to na tom intervalu.
Toto téma je uzamčeno. Odpověď nelze zaslat.

0