Autor Zpráva
virgo86
Profil
zdravím do databaze ukladam hesla pomocí sha1 nebo password....heslo je v databazi spravně šifrované ale když se chci přihlasit tak se neschoduje heslo?
vyzkoušejte si to na cnc.virgonet.cz uživaltelské jmeno virgo má heslo qwertz a je uloženo pomocí sha1
můj zdrojový kod po zadaní přihlašovacích údajů:
<?php
require_once('fce.php');
session_start();
//vytvoreni promenne
$nickid = $_POST['nickid'];
$heslo = $_POST['heslo'];
if (!filled_out($HTTP_POST_VARS))
//Pokud uživatel klikne na prihlasit aniz by zadal udaje tohle ho zastavy
   {
      
      hlavicka('Chyba','',$strana);
      echo 'Nevyplnily jste žádné přihlašovací údaje.'
          .' Zkuste to znovu.';
      konec();
      exit; 
   }    
$conn = db_connect();
if (!$conn)
  {
     hlavicka('chyba MYSQL','', $strana);
     echo 'chyba: k databazi se nelze připojit';
     konec();
     exit;
  }
if ($nickid && $heslo)
// Pravě se pokouší přihlásit
{
    if (login($nickid, $heslo))
    {
      // je-li v databazi zaregistruje jeho ID
      $HTTP_SESSION_VARS['valid_user'] = $nickid;
    }  
    else
    {
      // neuspesne prihlaseni
    hlavicka('Computer Numeric Control', '', $strana);
          ?> 
          <h1>UPOZORNĚNÍ: </h1>špatne heslo nebo přezdívka
            <a href="http://firma.virgonet.cz">VIRGOnet.cz</a>
          <?php
          echo 'nick: '.$nickid.'heslo: '.$heslo;
          ?>
            </p>
              <?
        konec();
  exit;
    }      
}
hlavicka2('Computer Numeric Control', '', $strana);
echo 'Vítejte jste úspěšně přihlašen.<br />';
echo 'Jako registrovaný uživatel se můžete stát spoluautorem obsahu tohoto webu.
pokud máte zájem přispět můžete například rovnou nějakým článkem přispět tady. Váš článek pokud nejste
ověřeným autorem bude nejprve přečten administratorem a poté publikován.';

konec();
?>



funkce login()
function login($nickid, $heslo)
// kontrola uzivatelskeho jmena a hesla podle hodnot z databaze
// pokud souhlasi, vrati true
// jinak vola false
{
  // pripojeni k databazi
  $conn = db_connect();
  if (!$conn)
    return false;

  // kontrola, zda je uzivatelske jmeno jedinecne
  $result = mysql_query("select * from uzivatele 
                         where nickid='$nickid'
                         and heslo = sha1('$heslo')");
  if (!$result)
     return false;
  
  if (mysql_num_rows($result)>0)
     return true;
  else 
     return false;
}


vše skončí tím že skript vypiše špatne heslo nebo přezdívka
Cpk
Profil
skus toto
  // kontrola, zda je uzivatelske jmeno jedinecne
  $result = mysql_query("select * from uzivatele 
                         where nickid='$nickid'
                         and heslo = sha1('$heslo')");


prerobit na:

$hash = sha1('$heslo');
  $result = mysql_query("select * from uzivatele 
                         where nickid='$nickid'
                         and heslo = '$hash' ");
mckay
Profil
virgo86:
Řešíš to dost neohrabaně. Vezmi si příklad, kdy se někdo loguje, a někdo mu stojí za zády. Náhodou se překlepne jedním písmenkem, a ten člověk za ním si přečte jeho špatné heslo. Třeba bude znát to slovo a domyslí si, kde byl překlep ;-).


Já bych na to šel tak, že si heslo uložím do databáze zašifrované. Potom, co mi přijdou data z formuláře, přeměním ve jméně nebezpečné znaky (kvůli sql injection), přijaté heslo zašifruji, a jako to máš ty, vytáhnu z databáze řádek, který obsahuje tyto hodnoty. Otestoval bych to ale kvůli rychlosti spíš než přes mysql_num_rows, přes if(empty($vybrana_data)). Jako když je prázdné :-). To by bylo k teorii. Budeš mít jednodušší a přehlednější kód -> tudíš se ti budou lépe chytat chybky.
virgo86
Profil
mckay:
Řešíš to dost neohrabaně
hele to tam je jenom ted......nejsem vůl:) to tam mám proto abych si ověřil co jsem napsal jsetli třeba nedělam chybu při psaní píši na notebooku jednou mam klavesnici anglickou jednou českou.

heslo při registeaci ukladám pomocí sha1 nebo password.

ale to neni ten problém problém je v tom že se mi to heslo nevratí true i když je správně napsané. když nepoužiji sha1 při ukladaní nebo password tak to funguje bezproblemu..
virgo86
Profil
Cpk:
tak to nepomohlo ale jen pro informaci
$hash = sha1('$heslo');
je správně nebo má být bez apostrovu? tedy
$hash = sha1($heslo);

tak či tak ani jedno nejde:(
mckay
Profil
virgo86:
Nemusí tam být ani apostrof, ani uvozovky, v případě, že jde o proměnnou. Navíc, pokud se nemýlím, když máš proměnnou v apostrofech, nahlíží se na ní jako na string (jak ti prozradil určitě zvýrazňovač syntaxe).
virgo86
Profil
mckay:
ja sem si toho pravě všiml ale raději jsem se ptal:) a nevíš kde tedy muže být chyba že to nechce načíst to heslo?
Alphard
Profil
heslo je v databazi spravně šifrované ale když se chci přihlasit tak se neschoduje heslo
Zkusil jste se podívat do databáze a ručně porovnat, jestli je ten hash správný?
Alphard
Profil
A je chyba skutečně v porovnání? Neskončí se třeba už na řádcích s ověřením dotazu?
 if (!$result)
     return false;
virgo86
Profil
Alphard:
Zkusil jste se podívat do databáze a ručně porovnat, jestli je ten hash správný?
něco na tom bude koukejte v phpmyadmin jsem zadal příkaz
select * from uzivatele where nickid='virgo' and heslo = sha1('qwertz')


hodilo to hlašku: MySQL vrátil prázdný výsledek (tj. nulový počet řádků). (Dotaz zabral 0.0004 sekund)

myslel jste to takto porovnat?
Alphard
Profil
Myslel jsem vypsat celou tabulku (nebo jen ten sloupec) a podívat se, jak vypadají hodnoty ve sloupci hash.
virgo86
Profil
Alphard:
vypsal jsem si je ve sloupcich heslo jsou šifrovane udaje ....když ale se zeptam v databazi takto
select * from uzivatele where nickid='virgo' and heslo='8c829ee6a1c6ffd'

vypiše mi to celý řadek tedy je to ok ale když napišu takto
select * from uzivatele where nickid='virgo' and heslo=sha1('qwerty')
nevypiše nic tak nevím kde může být chyba. ani místo sha1 když dam password nepomůže to.
Alphard
Profil
virgo86:
and heslo='8c829ee6a1c6ffd'
To je na sha1() nějak krátké. Má sloupec nastavenou dostatečnou velikost? A jak tam hashe ukládáte?
virgo86
Profil
Alphard:
je to možné ja mám asi nastaveny špatně parametry sloupce pro heslo mám tam varchar=16. co tam mám tedy nastavit jestli je to tím?
virgo86
Profil
ok děkuji vyřešeno opravdu to bylo nastavením sloupce pro uložení hesla já totiž nastavil jen 16 pismen v domění že delší heslo si nikdo neuloži ale nenapadlo mě že se po šifrovaní udělá slovo delší..
Teď mám v databazi nastaveno ve sloupci typ: text. Můžu to tak nechat?
Alphard
Profil
virgo86:
Můžu to tak nechat?
Můžete, ale stačilo by char(40).
virgo86
Profil
Alphard:
ještě jednou dík

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: