Autor Zpráva
mackopu
Profil
To mi tedy řekněte,
na stránkách mám formulář s loginem do administrace:
<?

if (isset($login_admin)):
if ($jmeno_admin=="aaa" && $heslo_admin=="bbb"):
Header("Location: index.php");
else:
echo "Špatné jméno nebo heslo !";
endif;
endif;
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=windows-1250">
<title>Administrace</title>
</head>
<body>
<form method="POST" action="">
<div align="center">
<center>
<table border="0" cellpadding="2" cellspacing="1">
<tr>
<td>Jméno:</td>
<td><input type="text" name="jmeno_admin" size="20"></td>
</tr>
<tr>
<td>Heslo:</td>
<td><input type="password" name="heslo_admin" size="20"></td>
</tr>
<tr>
<td colspan="2">
<p align="center"><input type="submit" value="Vstup" name="login_admin"></td>
</tr>
</table>
</center>
</div>
</form>
</body>
</html>
a když ten skript spustím, NIC se nestane. Načte se, to ano, ale nepřepošle mě na index.php, dokonce ani když vypíšu špatné heslo, tak mi nevynadá. Prostě nic. Na localhostu to funguje normálně. Proboha, kde dělám chybu???
Wan-To
Profil *
K datům z formuláře přistupuj pomocí pole $_POST[].

<?
if ($_POST["login_admin"] != ""):
if ($_POST["jmeno_admin"]=="aaa" && $_POST["heslo_admin"]=="bbb"):
Header("Location: index.php");
else:
echo "Špatné jméno nebo heslo !";
endif;
endif;
?>

Mělo by to fungovat.
mackopu
Profil
Už to šlape - díky moc. To pole znám, ale neobtěžoval jsem se ho použít :-/ Jen tak ze zájmu: netušíš PROČ to chodí na lokálu?
Wan-To
Profil *
Dá se to vypnout v konfiguraci PHP kvůli bezpečnosti. Server, na kterém máš stránky, chce být asi bezpečný a tak to vypíná.
Honza Hučín
Profil
Doplním, co napsal Wan-To. Automatické přebírání hodnot z formulářů do proměnných je zařízeno direktivou register_globals v php.ini. Obvykle to bývalo spuštěné, ale z hlediska bezpečnosti je lepší to mít vypnuté a přebírat hodnoty přes superglobální pole (např. $_POST, $_GET, $_COOKIE apod.). Taky jsem s tím měl svého času podobný problém.
mackopu
Profil
Tak to je zřejmě důvod, proč mi při přechodu na jiný hosting přestaly "zčistajasna" chodit některé skripty. Díky za osvětlení :-)
Wan-To
Profil *
Typický příklad - includovaný skript je vytvořen tak, aby se spustil jen pokud bude proměnná $aaa nastavená nějakým vnějším skriptem na "bbb":

if($aaa != $bbb) {
echo "Nepovolený přístup";
exit;
}
//zbytek skriptu


Kdyby bylo povolené získávání proměnných bez polí $_GET[] ($HTTP_GET_VARS[]) nebo $_POST[] ($HTTP_POST_VARS[]), dalo by se napsat do adresy chraneny.php?aaa=bbb a skript by šel spustit.
Wan-To
Profil *
Takže předchozí skript bude fungovat pouze vložením z jiného skriptu:

$aaa = "bbb";
include "./chraneny.php";
mackopu
Profil
Rozumím. Pak tedy ve všech skriptech, které zpracovávají proměnné předané pomocí metody POST, musím tyto proměnné přepsat. Neplatí něco podobného o proměnných předávaných prostřednictvím adresního řádku (odkazem)?
Wan-To
Profil *
V adresním řádku se používá metoda GET, takže pole $_GET[] nebo $HTTP_GET_VARS[]. Taky přepsat ;-)
mackopu
Profil
No jo vlastně :-/
Tak to bude docela opruz. Leda bych si na začátku skriptu zjednodušil práci např.
$login_admin=$_POST["login_admin"];
atd.
Wan-To
Profil *
Opruz to je, vím to z vlastních zkušeností ;-)
Navíc myslím nemůžeš používat funkci isset(), protože ta prověřuje existenci proměnné, ale pole ti nikdy nevrátí neexistující proměnnou, ale místo ní prázdný řetězec. Tím si však nejsem moc jistý, každopádně prověřování prázdného řeteězce mi funguje.
Wan-To
Profil *
Možná by šla napsat funkce, která data z pole vytáhne do normálních proměnných, to by ale nebylo moc bezpečné.
Honza Hučín
Profil
Šla, podívej se na http://interval.cz/clanek.asp?article=2264 dolů.
Wan-To
Profil *
Ale nebude bezpečná, skript se totiž bude chovat jako se zapnutými register_globals.
mackopu
Profil
Tak to by bylo přesně ono, jen bych ještě potřeboval nějaký polopatistický příklad použití u konkrétních proměnných :-)
Wan-To
Profil *

foreach($_GET as $ind => $val)
{
$val=addslashes($val);
eval("$".$ind."=\"".$val."\";");
}
foreach($_POST as $ind => $val)
{
$val=addslashes($val);
eval("$".$ind."=\"".$val."\";");
}
foreach($_COOKIE as $ind => $val)
{
$val=addslashes($val);
eval("$".$ind."=\"".$val."\";");
}

Tenhle sriptík ti v podstatě zapne register_globals. Ale jak jsem asi třikrát říkal, není bezpečný!!!
mackopu
Profil
Díky. Dobře si to rozmyslím ;-)
Wan-To
Profil *
Funguje ti?
Toto téma je uzamčeno. Odpověď nelze zaslat.

0