Autor Zpráva
intimidant
Profil *
Dlouho jsem hledal dobrý přihlašování, nakonec jsem zvolil kombinaci JS a PHP. jelikož si myslím, že to dost lidí ocení, předkládám ho tady. Navíc prosím zkušenější programátory o připomínky k mému kódu, jestli není někde díra... Díky
ještě poznámka - budete potřebovat stáhnout sha1, třeba odtud: http://pajhome.org.uk/crypt/md5/sha1.js
a tohle je kód formuláře v souboru auth.php
<?
echo "<script type='text/javascript' src='sha1.js'></script>";
echo "<br><center>Pro přihlášení musíte mít povoleny cookies a javascript.</center>";
echo "<br><form method='POST'>Uživatel:<input type='text' size='20' name='uzivatel'><br>";
echo "Heslo: <input type='password' size='20' name='heslo'>";
echo "<input type='submit' onclick='sha1_heslo.value = hex_sha1(heslo.value)' value='Přihlásit'><input type='hidden' name='sha1_heslo'></form>";//tohle převede heslo na sha1 ještě než ho odešle na server
?>
na další stránce proběhne kontrola s db, něco jako
<?
if($_POST["heslo"]===$db["heslo"])
{
$_SESSION["logged"] = true;
}
?>
na každé chráněné stránce se zeptáme, jestli je v $_SESSION["logged"] hodnota true
<?
if(isset($_SESSION["logged"]))
{
if($_SESSION["logged"] !== true)
{
Header("Location:auth.php");
}
}
else
{
Header("Location:auth.php");
}
?>

Můžete mi to někdo zkontrolovat? díky
piko.x
Profil *
dobrá práce, kámoš to myslím řešil podobně ;)
Leo
Profil
Onclick na submitu bych urcite nahradil onsubmit na formu, Leo
tajo
Profil *
no nevim nakolik je rozumné spoléhat se na to, že má uživatel povolený JS, tot otázka...
krteczek
Profil
Jestli se nepletu tak z hashe hesla děláte heslo na nezabezpečené cestě... Je to drbání se pravou rukou na levé hýži... jestli chcete bezpečný přenos dat používejte ssh nebo jinou technologii, popřípadě tam kde ssh neni možne ,klienta který bude zvládat asymetrické šifrování (třeba 128bit) a serverovou aplikaci která si příchozí data dešifruje a šifrovaná data opět odesílá.... krteczek
joejoe
Profil *
udelal jsem neco podobneho:
http://www.volny.cz/joejoe/download/php_auth.rar
finc
Profil
to krteczek: nemel jste na mysli SSL?

to intimidant:
Po header("Location:") by měl vždy následovat exit();
I když je zde na konci skriptu, tak špatnými návyky se může stát dost závažná chyba.

Zde je uvedena navíc session_regenerate_id(); ochrana proti SESSION fixaci.
http://php.vrana.cz/prihlasovani-uzivatelu.php
sess
Profil *
na moj vkus tam chyba session_regenerate_id() .sess
intimidant
Profil *
díky všem za připomínky :) určitě to předělám

to krteczek: podle mě to není až tak beze smyslu. je pravda, že nemám možnost použít ssl, ale myslím si, že je lepší odesílat nezabezpečeně hash hesla, než heslo v otevřené formě. nebo se pletu? když někdo zychytí hash, je mu celkem k ničemu, ale když zachytí otevřené heslo, prostě ho naťuká a přihlásí se...
krteczek
Profil
intimidant:jenže vy tím že místo hesla používáte hash děláte z něj heslo, takže proto je to blbost. bezpečnost nezvýšíte, spíše bych řekl že ji snížíte.
Nechal bych posílat normálně heslo (je to bez práce) a staral bych se být vámi o zabezpečení proti ukradení session (kontrola ip => snížení rizika ukradení, navíc všechny formuláře pomocí kterých měníte něco duležitého bych doplnil o skryté pole v kterém bude generonaný náhodný řetězec a před zpracováním dat z formuláře kontrolovat shodnost tohoto řetězce (třeba proti hodnotě uložené v session, databázi...)...
krteczek
llook
Profil
Nikde tam nevidím, že bys ten formulářový prvek s nezakódovaným heslem nějak mazal (heslo.value = ''), řekl bych, že ho normálně posíláš. Krom toho je fakt, co říkal krteček - ty z toho hashe vlastně děláš heslo.

Trochu jsem si s tím teďka taky pohrál a vzniklo tohle:
<?php

session_start();
$starySID = session_id();
session_regenerate_id();

// pokud byl odeslan formular
if (isset($_POST['uzivatel'], $_POST['heslo'])) {
// tady se nejak ziska hash hesla z DB
$dbheslo = sha1('test');

$_SESSION['logged'] = false;
// pokud uzivatel nema zaply javascript
if (empty($_POST['hash'])) {
if (sha1($_POST['heslo']) === $dbheslo) {
$_SESSION['logged'] = true;
}
// pokud ma javascript
} elseif ($_POST['hash'] === sha1($starySID . $dbheslo)) {
$_SESSION['logged'] = true;
}
}

if ($_SESSION['logged']) {
echo '<h1>Prihlasen</h1>';
} else {
echo '<h1>Neprihlasen</h1>';
}

var_dump($_POST);
?>

<script src="sha1.js"></script>

<form method="post" onsubmit="hash.value = hex_sha1('<?php
echo session_id();
?>' + hex_sha1(heslo.value));
heslo.value = '';">
<input type="text" name="uzivatel"><br>
<input type="password" name="heslo"><br>
<input type="submit" value="Odeslat">

<input type="hidden" name="hash">
</form>
intimidant
Profil *
to krtezcek: Jo, už mi to došlo s tím hashem. Je to pravda. Moc díky za připomínku ohledně session stealing
to llook: díky moc za námět. udělám to podle vašeho kódu, je to moc pěkně napsaný ;)
Toto téma je uzamčeno. Odpověď nelze zaslat.

0