Pár otazok ohladom php

Programovacie jazyky, rady, poradňa...
.:M4jco:.
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 442
Registrovaný: 01 máj 2007, 13:07
Bydlisko: Bassline lover
Kontaktovať používateľa:

Pár otazok ohladom php

Príspevok od používateľa .:M4jco:. »

Zdravím

Zasa som sa tu objavil a tentokrát sa chcem spýtať pár otázok ohľadne PHP a bezpečnosti. Takže idem na to:

1) Je prihlasovanie cez session bezpečné? Prípadne je to využitelnejšie než cookies? Pokiaľ hej, tak v čom?

2) Pokial používam .htaccess na adresy, je možno použiť xss?
Príklad: (bez htaccess) www.abcd.sk/index.php?id=abcd
kde namiesto abcd by mohol isť škodlivý kod
alebo príklad s htaccess: www.abcd.sk/abcd

3) Je nevhodné pokial používam parameter $_GET ? Niekde som čítal že sa to dá zneužiť, ale už neviem kde to bolo a čo tam písali.

4) Dá sa nejako ovplyvniť dížka session? Alebo to je dané v závislosti od servera?

A ešte jeden malý dotaz.
Mám pri prihlasovaní kód:

Kód: Vybrať všetko

       if($_POST['submit'] == "Prihlásiť sa"){
$email = $_POST['email'];
$pass = sha1($_POST['pass']);  
$result = mysql_query("SELECT pass FROM nodz_users WHERE email='$email'");
$row = mysql_fetch_row($result);
if($pass == $row[0])

{
session_start();
	$_SESSION['prihlaseny'] = 'ano';

}
else
{
	echo "Zadali ste neplatné meno alebo heslo!";
}
}
Ako spravím, aby po tom, ako sa zadal správny mail a správne heslo skontrolovalo cez databazu ktorému uživatelovi patrí ten mail a zároveň skontrolovalo jeho "level" a pokial by bol 1, tak session by sa nazvala "uzivatel" a pokial by bol level 2, tak session by sa nazvala "admin".

Ako to napísať?

Ďakujem za všetky zodpovedané otázky
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Príspevok od používateľa audiotrack »

1) session sa tiež prenáša len v cookies (resp nie session ako také ale session id) takže ak niekomu poskytneš svoje cookies tak sa dokáže prihlásiť pod tvoj účet bez toho aby vedel meno a heslo. Z toho vyplýva aj odpoveď - je to bezpečné natoľko, nakoľko bezpečne s tým pracuješ. Vždy ale bezpečnejšie ako samotné cookies kde by bolo meno a heslo, lebo ak niekto odchytí takéto cookies vie tvoje údaje. Ak niekto odchytí cookies so sessid, tak to musí využiť kým je dané session aktívne

2) áno, je. Zase ale záleží čo s daným parametrom robíš. Ak to vstupuje cez kvalitné ošetrovanie tak xss (prípadne iný typ útoku založený na podsunutí nekorektného vstupu) nepoužiješ ani keď je to bez .htaccess :) Modrewrite sa nepoužíva kôli bezpečnosti, ale kôli seo

3) platí to isté čo v bode 2. Ak vstup kvalitne ošetríš, nie je problém. Vela vecí vyžaduje predávanie cez get, inak to nespravíš (alebo len veľmi veľmi obtiažne), napríklad prelinkovanie medzi stránkami (ako príklad môže byť stránkovanie, navigačné tlačidlá..). Na druhú stranu - post nie je o nič bezpečnejšie, dáta posielané cez post dokážem rovnako lahko zfalšovať

4) v configu. Ak máš k nemu prístup (je to tvoj server) tak nie je problém. Ak nie, tak cez .htaccess: http://www.phpbuilder.com/board/showthr ... t=10351057

5)

Kód: Vybrať všetko

if($_POST['submit'] == "Prihlásiť sa"){ 
	$email = $_POST['email']; 
	$pass = sha1($_POST['pass']);  
	$result = mysql_query("SELECT * FROM nodz_users WHERE email='$email' and pass='$pass' limit 1"); 
	if(mysql_num_rows($result) > 0) {
		$row = mysql_fetch_array($result); 
		session_start(); 
		$_SESSION['prihlaseny'] = 'ano'; 
		$_SESSION['level'] = ($row['level'] == 2) ? "admin" : "uzivatel";
	} 
	else 
	{ 
	   echo "Zadali ste neplatné meno alebo heslo!"; 
	}
}
Pozn: namiesto $_SESSION['prihlaseny'] = 'ano'; by som radšej dal $_SESSION['prihlaseny'] = $row['id'] pretože jeho id budeš určite v budúcne na iných stránkach potrebovať. To či je prihlásený zistíš napríklad pomocou isset($_SESSION['id']) /potom ale nezabudni pri odhlásení session zničiť./
.:M4jco:.
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 442
Registrovaný: 01 máj 2007, 13:07
Bydlisko: Bassline lover
Kontaktovať používateľa:

Príspevok od používateľa .:M4jco:. »

Díky moc za všetky odpovede aj za vyriešený problém, upravil som to podla teba už a vyzerá to tak že všetko funguje ako má.

A ešte jedna vec.
Ako ošetrím parameter $_GET pred XSS? Pretože pokial mám adresu

http://abcd.net/index.php?id='';!--"<XSS>=<SCRIPT>alert(String.fromCharCode(88,83,83))</SCRIPT>

a namiesto id článku dám xss kod, tak to vyhodí hlášku, a netuším vobec ako to zabezpečím.
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Príspevok od používateľa audiotrack »

keďže predpokladám že tvoje id je id článku (alebo niečoho iného, proste je to číslo) tak stačí ošetriť aby mohol byť vstup iba číselný, nejak takto:

Kód: Vybrať všetko

(int)$_GET['id']
Pri textových premenných by to bolo kúštik zložitejšie.
.:M4jco:.
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 442
Registrovaný: 01 máj 2007, 13:07
Bydlisko: Bassline lover
Kontaktovať používateľa:

Príspevok od používateľa .:M4jco:. »

Hmm, pokial som použil toto:

Kód: Vybrať všetko

if(!isset((int)$_GET['id']))
Tak to vyhodilo error:
Parse error: syntax error, unexpected T_INT_CAST, expecting T_VARIABLE or '$' in /data/m/4/m4jco.net/sub/nodz/fnc/show.php on line 69

A lime 69 je práve hore uvedený kód. Neviem, ako inak by malo byť to (int) zapísane?
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Príspevok od používateľa audiotrack »

to je pretypovanie na integer, ja som ti nekázal do dávať do podmienky :)
ty si môžeš cez isset($_GET['id']) overiť či bola daná premenná poslaná, no do db už vkladáš (int)$_GET['id'] (alebo na stránke vypisuješ..) aby sa odstránili všetky znaky (ak tam sú znaky, lebo ty chceš číslo)
.:M4jco:.
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 442
Registrovaný: 01 máj 2007, 13:07
Bydlisko: Bassline lover
Kontaktovať používateľa:

Príspevok od používateľa .:M4jco:. »

Hmm neviem, skúšal som to ale vždy mi to nefungovalo. Buď mi to vyhodilo error, alebo to nič nerobilo.

Tu je kód ktorý mám použitý na stránke

Kód: Vybrať všetko

  <?php
            if(!isset($_GET['id']))
			{
                  $query = "SELECT id, nadpis, obsah, kategoria, DATE_FORMAT(datum, '%d.%m, %Y') AS datum FROM nodz_nodes ORDER BY id DESC";
                  $result = mysql_query($query)
                  or die("Query nepresl1\n");
                  while($row = mysql_fetch_array($result))
				  { 
			?>     

A akokolvek som kúšal upravovať tu premennú GET tak som bol neuspešný.
Nemožeš mi ukázať ako by to malo byť v tomto kode urobené? Dakujem
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Príspevok od používateľa audiotrack »

och môj bože, ale veď ty tam ten vstup nikde nepoužívaš (iba overíš či je nastavený a potom sa vykoná query, tak je jedno či tam príde číslo alebo škodlivý kod, nepoužívaš ho v db, ani nevypisuješ) tak neviem čo tam chceš ošetrovať. V konkrétne tomto kode ti nemám čo zmeniť, ignoruj čo som písal vyššie :)
.:M4jco:.
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 442
Registrovaný: 01 máj 2007, 13:07
Bydlisko: Bassline lover
Kontaktovať používateľa:

Príspevok od používateľa .:M4jco:. »

Už to mám urobené :lol: sorry že som ťa otravoval až tak moc, už musíš mať na mňa nervy. Ale každopádne, ďakujem :wink:
Napísať odpoveď