spravil som si php kod na login no vyhadzuje mi stale toto
Parse error: syntax error, unexpected T_IF in /home/free/yw.sk/k/klodye/root/www/reg/login.php on line 46
vedeli by ste mi pomoct aku mam v kode chybu?Kod viz. nizzsie
za pomoc vopred dakujem
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Untitled Document</title>
</head>
<body>
<?php
session_start();
function index() {
echo "<form action='?act=login' method='post'>"
."Uzivatelske meno: <input type='text' name='user' size='30'>"
."Heslo: <input type='password' name='password' size='30'>"
."<input type='submit' value='Prihlasit'>"
."</form>";
}
function login() {
$user = $_REQUEST['user'];
$password = $_REQUEST['password'];
$connect = mysql_connect("host", "login", "password");
if(!$connect){
die(mysql_error());
}
$select_db = mysql_select_db ("database", $connect);
if(!$select_db) {
die(mysql_error());
}
$result = mysql_query("SELECT * FROM users WHERE user = '$user' AND password = '$password'");
$row = mysql_fetch_array($result);
$id = $row['id'];
$select_user = mysql_query("SELECT * FROM users WHERE id = '$id'");
$row2 = mysql_fetch_array($select_user);
$user2 = $row2['user']
if($user !=$user2){
die("Usernameiswrong!");
}
$pass_check = mysql_query("SELECT * FROM users WHERE user = '$user' AND id = '$id'");
$row3 = mysql_fetch_array($pass_check);
$email = $row3['email'];
$select_pass = mysql_query("SELECT * FROM users WHERE user = '$user' AND id='$id' AND email = '$email'");
$row4 = mysql_fetch_array($select_pass);
$real_password = $row4['password'];
if($password != $real_password) {
die('Nespravne heslo');
}
session_register("user", $user);
session_register("password", $password);
echo "Welcome,".$user."please come here <a href=index.php>Index</a>"
}
switch($act) {
default;
index();
break;
case "login";
login();
break;
}
?>
</body>
<HTML>Chtělo by to říct, který je řádek 46. Ale každopádně tady ti chybí středník:
<code>
$user2 = $row2['user']
</code></HTML>
Každopádně těch středníků tam bude chybět víc ... ;)
<HTML>Jen tak mimochodem doufám, že až odstraníte všechny syntaktické chyby, že váš systém nebude v ostrém provozu. Těch několik dotazů na jednoho usera a zjišťování, zda se 1 opravdu rovná 1... Myslím, že se dá SQL injection předejít i jinak, mnohem jednodušším a spolehlivějším způsobem.</HTML>
$result = mysql_query("
SELECT * FROM users WHERE
(user = '$user' AND password = '$password') OR
(user = '$user' AND id = '$id' AND email = '$email') OR
(user = '$user' AND id = '$id') OR
(id = '$id')
");
Hm? :) Jenom treba zacit delsi podminkou, aby nebyl preskocena
<HTML>Nikoliv, peto, nepochopils, proč to tazatel dělá. Tvůj kód je dobrý pro přihlášení, pokud to lze několika způsoby. Tazatel však na základě jména a hesla zjistí ID, na základě toho ID zjistí jméno a porovná. To je prakticky 1 = 1. Pak zjistí email (tenhle dotaz je naprosto zbytečný) a potom heslo a zase porovná. To je 1×2 = 1×2. Je to dobré pouze na jednu věc - má to zabránit SQL injection typu jméno = ' OR 1=1 apod. Nezabrání to zajímavějším druhům SQL injection (jméno = '; UPDATE users SET password = tohlehesloznam WHERE id = 1 -- zbytek je komentář) (ano, starší MySQL tohle naštěstí neumí) a potřebuje to 4 dotazy (vlastně 3, jeden je FAKT zbytečný) místo jednoho.</HTML>
Nípal (moderátor)
:)
SQL dotaz najdi uzivatele a vsechny udaje o nej.
Pak vsechny tyhle udaje porovnej ifem.
jméno = ' OR 1=1
toto mu nemuze nastat, pokud dusledne odfiltuje nezadouci znaky, jako je = ze jmena a mezery a dalsi
V podstate jsem chtel rici neco podobne, jako ty, ze tam naprosto zbytecne vola 4x SQL, ze by mu v podstate stacil jeden dotaz, kterym se bud uzivatel prihlasi pres mail nebo nick nebo id a prislo mi to podobne formularum Zapomenute heslo.