Autor Zpráva
Brouzdalek
Profil
Zdravím!
Vytvářím přihlášení do redakčního systému. Objevil jsem jednu drobnou chybu. Spočívá v tom, že pokud uživatel SPRÁVNĚ zadá jméno a heslo, tak místo přesměrování na hlavní stránku, zůstane na stránce přihlašovací. To se děje jenom v případě, pokud se přihlašování provádí prvně při daném spuštění prohlížeče. Pokud zadá ŠPATNÉ údaje, vrátí skript správně a ihned hlášku. Předem díky za cenné rady !
Tady je kus kódu:

if ($_REQUEST["submit"]):
if (($_REQUEST["input_name"]!="") && ($_REQUEST["input_psw"]!="")):	
     // pokud byla všechna pole vyplněna
 $dotaz = MySQL_Query("SELECT * FROM $prefix".login." WHERE login='".AddSlashes($_REQUEST["input_name"])."'"); 
 if ($dotaz): 								
     // pokud byl nalezen uživatel s daným jménem
  $vypis = MySQL_Fetch_Array($dotaz);
  if ($_REQUEST["input_psw"]==$vypis["psw"]):				
     // pokud odpovídá heslo
     // všechno v pořádku
   $_SESSION["zobraz_menu"] = true;					
     // pokud 'true' zobrazuje se menu, ovládání atd.
   $_SESSION["user"] = $_REQUEST["input_name"];				
     // nastavení identifikačních sessions
   $_SESSION["psw"] = $_REQUEST["input_psw"];
   Header("Location: $abs_url/home.php");				
     // přesměrování  
  else:
   $news = true;
   $_SESSION["zobraz_menu"] = false;
  endif;
 else:
  $news = true;
  $_SESSION["zobraz_menu"] = false;
 endif;
else:
 $news = true;
 $_SESSION["zobraz_menu"] = false;
endif;
endif;


A tady je přihlašovací formulář:
<form action="<? echo $PHP_SELF; ?>" method="post">
<table border="0" cellpadding="3" align="center">
<tr><th colspan="2">Přihlášení do systému</th></tr>
<tr height="5px"></tr>
<tr><td class="descript">Přihlašovací jméno</td><td><input type="text" name="input_name" class="input_login"></td></tr>
<tr><td class="descript">Přistupové heslo</td><td><input type="password" name="input_psw" class="input_login"></td></tr>
<tr><td colspan="2" id="submit_field"><input type="submit" value="Přihlásit" name="submit" id="submit_login"></td></tr>
</table>
</form>
Mastodont
Profil
"SELECT * FROM $prefix".login." ...


Ten login je co?
Brouzdalek
Profil
$prefix je jako předpona tabulky, login je část názvu, takže celý název je třeba:
tab_login


takže by byla chyba v těch úvozovkách ?
jinak už nevím, v čem je chyba, určitě to bude nějaká blbost...
Mastodont
Profil
No jistě že v těch uvozovkách - login je mimo, čili není brán jako string.
Brouzdalek
Profil
Tak jsem to nahradil tímto zápisem:
$dotaz = MySQL_Query("SELECT * FROM {$prefix}login WHERE login='".AddSlashes($_REQUEST["input_name"])."'"); 

a problém stále přetrvává..

Mně ve skutečnosti funguje select zapsaný tímto způsobem, data se vypíšou, ale při správném zadání dat do formuláře se všechna vymažou, neobjeví se žádná chyba. Pokud provedu toto přihlášení podruhé, tak se vyhodnocení provede, jak má, dojde k přesměrování..
Díky za radu..
Brouzdalek
Profil
Zdravím po delší době.
Skript o kterém se všechno točí jsem napsal znova, s nadějí že to třeba pomůže :) Bohužel, už si nevím rady, tak doufám, že mi někdo z vás poradí. Jak mě radil Mastodont, tak jsem to zkoušel, ale pro jistotu jsem ten select napsal "napevno".
Pro jistotu ještě zopakuju můj problém:
Pokud otevřu prohlížeč, zadám adresu, napíšu SPRÁVNÉ přihlašovací údaje, tak místo přesměrování na další stránku se formulář vymaže a nic se nestane. Tento postup zadávání dat musím opakovat po druhé, až teď dojde k přihlášení. Při nesprávně zadaných údajích, se tento problém nevyskytuje.

Přikládám i odkaz na soubor txt, kde je zdrojový kód:
http://astro.okamzite.eu/login.txt
Moc všem díky..
Brouzdalek
Profil
Nyní jsem zkoušel dát i přihlašovací skript zvlášť do souboru, ale problé se zase opakuje :((

Prosím o pomoc !! :'(
Paja
Profil
a když zadáš správné údaje, zmizí ti ten formulář a ručně zadáš stránku "home.php" jsi přihlášen nebo ne?
Brouzdalek
Profil
Když zadám správné údaje, tak se vrátím na původní stránku. Zobrazí se tak, jako by byla zobrazena poprvé, tzn. bez chybových hlášek, atd. Jednodušše, nic se nestane. Error_reporting mi taky nic neřekl, nevím..
Na stránku home se dostanu jenom tehdy, pokud údaje souhlasí s databází..což by mělo fungovat, ale právě nefunguje (respektive funguje až na druhé zadání též dat)..

Díky za pomoc..
Paja
Profil
sry ze tak dluho neodpovidam.. snad ti tohle nebude vadit, pár věcí bych ti vytknul:
1) ošetření formuláře dělej následovně!
if ( $_POST["submit"] )
{
  // ošetření formuláře
}
else
{
  // vykreslení formuláře
} 
// PROČ? není nutné používat ob_start();

2) zapni si safe mode ( kde se ti tam vezme proměnná $submit ?? )
3) používej pole _POST .. ne _REQUEST
4) do databáze neukládej $password ale md5( $password ) a pak to porovnávej takhle
$result = .."select pass from tabulka where user='name'";
$row = mysql_fetch_assoc($result);
if ( md5( $_POST["pass"]) == $row["pass"] )
{
   session_start();
}

5) je dobré kontrolovat session_id();
6) session_start() bych raděj dal na začátek stránky
7) bylo by vhodné psát kód se složenýma závorkama, ne if: endif;
pokud chceš dobrý login, tak začni od znovu a pořádně .. pokud chceš jen zaheslovat nějaký svůj blog, který ti nikdo nebude chtit hacknout, pak ok. Ale safe mode bys měl mít zapnutý, pakliže ho nemáš, :-)
......... už spím a monitor mám tak "v dálce" tak snad nepíšu uplné blbosti
Brouzdalek
Profil
Díky za odpověď. Tohle je jenom takový návrh, už to taky nějako upravuju. $submit je "name" tlačítka..nyní jsem to udělal jsem to jednodušší a md5 tam taky dodám.. potom by už to mělo být bezpečnější ? Kdybych to chtěl dělat přes https, tak to bych toho chtěl asi moc co ? :D
Zpět k hlavnímu problému. Po mnoha pokusech jsem zjistil toto: Při prvním přihlášením, tedy pokud jsou splněny všechny podmínky, se dostanu na stránku "home.php". Když si na ní vypíšu hodnoty SESSIONS, tak tam žádné nejsou. Pokud provedu přihlášení podruhé, všechno je v pořádku.
Předtím jsem se nedostal ani na stránku home.php, protože jsem na ní měl skript pro přesmrování, pokud neexistujou sessions, tak proto. Teď tedy nastal problém, proč při prvním přihlášení se neuložej session ?! :(
Tady jsem to ještě trochu "ten úsek" upravil:

if ($submit):												
 MySQL_Query("SET NAMES 'cp1250';");
 $dotaz = MySQL_Query("SELECT id_user, login, psw FROM astro_login WHERE login ='".$_REQUEST["input_name"]."'");
 if ($dotaz):												
  $vypis = MySQL_Fetch_Array($dotaz);
  if (($_REQUEST["input_name"] == $vypis["login"]) && ($_REQUEST["input_psw"] == $vypis["psw"])):
   session_register("id_user");
   session_register("user");
   session_register("psw");
   session_register("zobraz");
   $_SESSION["id_user"] = $vypis["id_user"];
   $_SESSION["user"] = $vypis["login"];
   $_SESSION["psw"] = $vypis["psw"];
   $_SESSION["zobraz"] = true;
   Header("Location:$abs_url/home.php");
  else:
   $error_log = true;
  endif;
 else:
  $error_log = true;
 endif;
endif;


MD5 ještě dodám a celý upravím, buffer tam mám pro jistotu, aby to neprotestovalo "headers already.. :), je to jenom návrh, tak se nelekni..ale nevím, proč ty sessions nejedou..
ještě jedna poznámka: na začátku mám session_start()
Paja
Profil
proměnná $submit nemá právo existovat -> zapni safe mode .. představ si že ti někdo zadá takovou adresu
domena.domena/login/?submit

bude tam ta proměnná existovat?
za další REQUEST je obecný pojem pro _GET _POST _COOKIE .. pokud hlídáš _REQUEST["psw"] tak hlídáš všechno. co se bude dít když bude existovat _GET["psw"] i _POST["psw"] ? směřuji k tomu že u loginu bys měl používat _POST

co se týče session tak nevím proč ti to nejede .. pokud jsi před $_SESSION[] = neco neudělal žádný výstup, máš nastartované session, tak není důvod aby se session nenastartovaly ..

session_register() používat nemusíš.
Brouzdalek
Profil
OK, beru na vědomí, upravím to tak. Jen mě s..rou ty sessions, nevím, co s tím je..jenom to první přihlášení, druhý a další jsou v pořádku..
Paja
Profil
<?php
  session_start();
  if ( isset( $_GET["login_ok"]))
  {
    echo "přihlášen ".$_SESSION["user"]."<br />";
    echo "heslo: ".$_SESSION["psw"]."<br />";
  }
  else if ( isset( $_POST["submit"] ))
  {                   
    // $dotaz = MySQL_Query("SELECT id_user, login, psw FROM astro_login WHERE login ='".$_REQUEST["input_name"]."'");
    $dotaz = true;
    if ( $dotaz )
    {                       
      $vypis = array( "login" => "paja", "psw" => "ahoj" );
      if (( $_POST["name"] == $vypis["login"] ) && ( $_POST["psw"] == $vypis["psw"] ))
      {
        $_SESSION["user"] = $vypis["login"];
        $_SESSION["psw"] = $vypis["psw"];
        Header("Location: ".$_SERVER["REQUEST_URI"]."?login_ok" );
      }
      else 
      {
        die("bad_login");
      }
    }
    else
    {
      $error_log = true;
    }
  }
  else
  {
    ?>
    <form method="post" action="<?php $_SERVER["REQUEST_URI"]; ?>" >
      <fieldset>
        <input type="text" id="name" name="name" />
        <input type="password" id="psw" name="psw" />
        <input type="submit" name="submit" id="submit" />
      </fieldset>
    </form>
    <?php
  }
  ?>


a to je hodně hrubý koncept .. vyzkousej
Brouzdalek
Profil
Díky za kód, chápu to, jsem si to vyzkoušel, funguje bezvadně.. :)
Já to mám podobné, i ten skript jsem dal nahoru, upravil jsem to tak, jak jsi říkal a stále nic..za tím bude asi nějaká blbost.. :'(
Brouzdalek
Profil
Toto mám na začátku index.php:
<?php 
session_start();
include("config.php");

if ($_POST["submit"]):												
 MySQL_Query("SET NAMES 'cp1250';");
 $dotaz = MySQL_Query("SELECT id_user, login, psw FROM astro_login WHERE login ='".$_POST["input_name"]."'");
 if ($dotaz):												
  $vypis = MySQL_Fetch_Array($dotaz);
  if (($_POST["input_name"] == $vypis["login"]) && (md5($_POST["input_psw"]) == $vypis["psw"])):
   $_SESSION["id_user"] = $vypis["id_user"];
   $_SESSION["user"] = $vypis["login"];
   $_SESSION["psw"] = $vypis["psw"];
   $_SESSION["zobraz"] = true;
   Header("Location:".$abs_url."/home.php");
  else:
   $error_log = true;
  endif;
 else:
  $error_log = true;
 endif;
endif;
?>
Brouzdalek
Profil
Tak hlásím zajímavou informaci:
Celý web jsem nahrál na IC.CZ a tam to funguje, jak má !! Takže chyba je někde na localhostu, ale kde ?? :'( Tak teď už vážně nevím..asi to přeinstaluju..

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: