Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Tietoturvasta: salasanat, PDO, istunnot

Quirzo [14.10.2013 22:23:11]

#

Moro, pitkästä aikaa php:n parissa ja opettelen myös PDO:n käyttöä. Ennen tuli käytettyä vaan perinteistä mysql_* -tapaa. Heräsi vähän kysymyksiä.

Salasanan luonti. Onko tarpeeksi suojaisa salasana / oikea tapa? Ennen käytin vain md5...

//Satunnainen suola:
$salt = strtr(base64_encode(mcrypt_create_iv(16, MCRYPT_DEV_URANDOM)), '+', '.');;
$cost = 10;
//Lisätään eteen  $2y$ = blowfish
$salt = sprintf("$2y$%02d$", $cost) . $salt;

$hash = crypt($salis, $salt);

Käyttäjän syöttämän datan sijoitus SQL -kyselyyn. Onko mitään injektiovaaraa kun ymmärsin ettei PDO:n kanssa tarvita mitään erikoismerkkien poistoa?

$user = $_POST['tunnus'];

try{
	$q = $sql->prepare("SELECT * FROM users WHERE u_login = ?;");
	$q->execute(array($user));
}catch(PDOException $e){
	//virhe
}

Ja lisäksi sessioneista. Onko oikea tapa tarkastaa että onko kirjauduttu sisään? Eli kun kirjaudutaan, kyseiset sessionit saavat tietyt arvot.

if(isset($_SESSION['session_id'])){
	if($_SESSION['session_ip'] == $_SERVER['REMOTE_ADDR']){
		//nyt ollaan 100% varma että on logged_in
	}
}

Harrastelijakoodari kiittää!

Metabolix [14.10.2013 22:37:11]

#

Älä nyt hyvä mies ala tuollaista omaa salasanaviritelmää sählätä, kun PHP:ssä on nykyään ihan oikeat salasanafunktiot. Sinänsä koodi kyllä näyttää suunnilleen oikealta, mutta miksi tehdä turhaa työtä potentiaalisesti huonommin?

PDO:ta käytät oikein.

Istuntoon on aivan turha laittaa mitään omatekoista id:tä. Istunnon tunnus kulkee omaa tietään (evästeessä), ja ylimääräinen muuttuja $_SESSION-taulukossa ei tuo siihen mitään lisäarvoa. Siis riittää esimerkiksi tällainen:

session_start();
if (isset($_SESSION["kayttaja"])) {
	// Käyttäjä on kirjautunut.
}

IP-osoitteita ei myöskään kannata tarkistella ilman erittäin hyvää syytä; sillä voit lähinnä suututtaa käyttäjän, jonka IP jostain syystä (esimerkiksi mobiililaitteella verkosta toiseen siirryttäessä) vaihtuu kesken istunnon. Jos välttämättä haluat jotenkin virittelemällä parantaa istunnon tietoturvaa, vaihda istunnon tunnusta joka sivunlatauksella. Jos oikeasti pelkäät, että istuntoja varastetaan liikennettä vakoilemalla, paras tapa lisätä tietoturvaa on käyttää salattua yhteyttä (HTTPS).

Quirzo [14.10.2013 22:56:39]

#

No perkele, oon jossain vaiheessa tuonkin sivun lukenut ja unohtanut nyt kun piti ruveta koodailemaan. Ainoa probleema on että palvelimella käytössä php 5.4.8 niin täytyy ilmeisesti includella ottaa nuo funktiot käyttöön, kuten oppaassa mainittiinkin.

Todella kätevää jos sql -injektio on tuolla PDO:lla estetty kertaheitolla! :)

Tuossa sessionhommelissa on itseasiassa semmonen vanha jäänne että aluksi ajattelin juuri tuota omaa id:tä, mutta nykyään tuo session_id = user_id. Eli homma hoidossa!

Niin, ja tuon salasanahommelin löysin täältä:
http://alias.io/2010/01/store-passwords-safely-with-php-and-mysql/
Vaikutti todella hyvältä mutta ehkä siirryn sittenkin tuohon mitä ehdotit.

Kiitos!

Quirzo [15.10.2013 09:15:33]

#

Sellainen kysymys vielä, että kuuluuko käyttää seuraavaa PDO:n kanssa?

$sql->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

Osassa paikoista lukee, että olisi parempi turva kun kyseinen arvo on asetettu epätodeksi. Onko näin?

The Alchemist [15.10.2013 10:37:29]

#

Ei tuolla ole mitään tekemistä tietoturvan kanssa. Kyse on vain siitä, käytetäänkö tietokantamoottorin (MySQL:n) omia prepared statementseja vai emuloidaanko niitä pdo:n päässä.

timoh [15.10.2013 13:52:20]

#

The Alchemist kirjoitti:

Ei tuolla ole mitään tekemistä tietoturvan kanssa.

Tämä ei täysin pidä paikkaansa. Riippuen myslin versiosta sekä käytetystä merkistökoodauksesta ja siitä kuinka se on asetettu, emuloidut preparet eivät välttämättä estä injektiota.

Näin yleisesti, kannattaa aina disabloida emulointi (juuri kuten Quirzo näytti) sekä asettaa merkistökoodaus DSN:ssä.

Quirzo [18.10.2013 09:21:13]

#

Selvä peli, kiitoksia. Näillä mennään.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta