| Autor | Zpráva | ||
|---|---|---|---|
| Loup Profil * |
#1 · Zasláno: 25. 8. 2012, 15:58:58 · Upravil/a: Loup
Zdravím, vytvářím stránky, na kterých se uživatel registruje a potom si může rezervovat termíny v kalendáři. Použil jsem registrační formulář z těchto stránek. Při vyplnění formuláře a jeho odeslání mi Google Chrome zahlásí:
"Chyba serveru Při načítání adresy http://localhost/securelogin/register.php narazily stránky na chybu. Na této adrese možná právě probíhá údržba stránek, nebo jsou stránky chybně nakonfigurovány." Na různých fórech je tato hláška většinou asociovaná s chybnou syntaxí formuláře. Zkusil jsem do skriptu register.php vepsat řádek, který úspěšně vložil do tabulky v databázi konstantní hodnoty (tedy ne pomocí proměnných, ale přímo). Komunikace s databází tedy očividně funguje. Chyba by tedy měla tkvět někde ve skriptu, ale moc se mi to nezdá, protože v diskuzi pod článkem na php-developerovi se o tomto problému nikdo nezmiňuje. Přijde mi, že chyba je někde na půli cesty. Prosím poraďte, nebo já už nevím kudyma. Budu moc vděčnej. <?php
//require user configuration and database connection parameters
require('config.php');
//pre-define validation parameters
$usernamenotempty=TRUE;
$usernamevalidate=TRUE;
$usernamenotduplicate=TRUE;
$passwordnotempty=TRUE;
$passwordmatch=TRUE;
$passwordvalidate=TRUE;
$captchavalidation= TRUE;
//Check if user submitted the desired password and username
if ((isset($_POST["desired_password"])) && (isset($_POST["desired_username"])) && (isset($_POST["desired_password1"]))) {
//Username and Password has been submitted by the user
//Receive and validate the submitted information
//sanitize user inputs
function sanitize($data){
$data=trim($data);
$data=htmlspecialchars($data);
$data=mysql_real_escape_string($data);
return $data;
}
$desired_username=sanitize($_POST["desired_username"]);
$desired_password=sanitize($_POST["desired_password"]);
$desired_password1=sanitize($_POST["desired_password1"]);
//validate username
if (empty($desired_username)) {
$usernamenotempty=FALSE;
} else {
$usernamenotempty=TRUE;
}
if ((!(ctype_alnum($desired_username))) || ((strlen($desired_username)) >11)) {
$usernamevalidate=FALSE;
} else {
$usernamevalidate=TRUE;
}
if (!($fetch = mysql_fetch_array( mysql_query("SELECT `username` FROM `authentication` WHERE `username`='$desired_username'")))) {
//no records for this user in the MySQL database
$usernamenotduplicate=TRUE;
}
else {
$usernamenotduplicate=FALSE;
}
//validate password
if (empty($desired_password)) {
$passwordnotempty=FALSE;
} else {
$passwordnotempty=TRUE;
}
if ((!(ctype_alnum($desired_password))) || ((strlen($desired_password)) < 8)) {
$passwordvalidate=FALSE;
} else {
$passwordvalidate=TRUE;
}
if ($desired_password==$desired_password1) {
$passwordmatch=TRUE;
} else {
$passwordmatch=FALSE;
}
//Validate recaptcha
require_once('recaptchalib.php');
$resp = recaptcha_check_answer ($privatekey,
$_SERVER["REMOTE_ADDR"],
$_POST["recaptcha_challenge_field"],
$_POST["recaptcha_response_field"]);
if (!$resp->is_valid) {
//captcha validation fails
$captchavalidation=FALSE;
} else {
$captchavalidation=TRUE;
}
if (($usernamenotempty==TRUE)
&& ($usernamevalidate==TRUE)
&& ($usernamenotduplicate==TRUE)
&& ($passwordnotempty==TRUE)
&& ($passwordmatch==TRUE)
&& ($passwordvalidate==TRUE)
&& ($captchavalidation==TRUE)) {
//The username, password and recaptcha validation succeeds.
//Hash the password
//This is very important for security reasons because once the password has been compromised,
//The attacker cannot still get the plain text password equivalent without brute force.
function HashPassword($input)
{
//Credits: http://krackstation.net/hashing-security.html <--tady není krack, ale tenhle web mi nedovolí tam napsat to slovo na c :)
//This is secure hashing the consist of strong hash algorithm sha 256 and using highly random salt
$salt = bin2hex(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM));
$hash = hash("sha256", $salt . $input);
$final = $salt . $hash;
return $final;
}
$hashedpassword= HashPassword($desired_password);
//Insert username and the hashed password to MySQL database
mysql_query("INSERT INTO `authentication` (`username`, `password`) VALUES ('$desired_username', '$hashedpassword')") or die(mysql_error());
//Send notification to webmaster
$message = "New member has just registered: $desired_username";
mail($email, $subject, $message, $from);
//redirect to login page
header(sprintf("Location: %s", $loginpage_url));
exit;
}
}
?>
<!DOCTYPE HTML>
<html>
<head>
<title>Register as a Valid User</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<style type="text/css">
.invalid {
border: 1px solid #000000;
background: #FF00FF;
}
</style>
</head>
<body >
<h2>User registration Form</h2>
<br />
Hi! This private website is restricted to public access. If you want to see the content, please register below. You will be redirected to a login page after successful registration.
<br /><br />
<!-- Start of registration form -->
<form action="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>" method="POST">
Username: (<i>alphanumeric less than 12 characters</i>) <input type="text" class="<?php if (($usernamenotempty==FALSE) || ($usernamevalidate==FALSE) || ($usernamenotduplicate==FALSE)) echo "invalid"; ?>" id="desired_username" name="desired_username"><br /><br />
Password: (<i>alphanumeric greater than 8 characters</i>) <input name="desired_password" type="password" class="<?php if (($passwordnotempty==FALSE) || ($passwordmatch==FALSE) || ($passwordvalidate==FALSE)) echo "invalid"; ?>" id="desired_password" ><br /><br />
Type the password again: <input name="desired_password1" type="password" class="<?php if (($passwordnotempty==FALSE) || ($passwordmatch==FALSE) || ($passwordvalidate==FALSE)) echo "invalid"; ?>" id="desired_password1" ><br />
<br /><br />
Type the captcha below:
<br /> <br />
<?php
require_once('recaptchalib.php');
echo recaptcha_get_html($publickey);
?>
<br /><br />
<input type="submit" value="Register">
<br /><br />
<a href="index.php">Back to Homepage</a><br />
<!-- Display validation errors -->
<?php if ($captchavalidation==FALSE) echo '<font color="red">Please enter correct captcha</font>'; ?><br />
<?php if ($usernamenotempty==FALSE) echo '<font color="red">You have entered an empty username.</font>'; ?><br />
<?php if ($usernamevalidate==FALSE) echo '<font color="red">Your username should be alphanumeric and less than 12 characters.</font>'; ?><br />
<?php if ($usernamenotduplicate==FALSE) echo '<font color="red">Please choose another username, your username is already used.</font>'; ?><br />
<?php if ($passwordnotempty==FALSE) echo '<font color="red">Your password is empty.</font>'; ?><br />
<?php if ($passwordmatch==FALSE) echo '<font color="red">Your password does not match.</font>'; ?><br />
<?php if ($passwordvalidate==FALSE) echo '<font color="red">Your password should be alphanumeric and greater 8 characters.</font>'; ?><br />
<?php if ($captchavalidation==FALSE) echo '<font color="red">Your captcha is invalid.</font>'; ?><br />
</form>
<!-- End of registration form -->
</body>
</html>V souboru config.php mám potom nastaveny tyto hodnoty: $username = "root"; $password = "tady je moje heslo"; $hostname = "localhost"; $database = "název databáze"; $domain = "http://localhost/"; $privatekey ="kód ze serveru http://www.google.com/recaptcha"; $publickey = "kód ze serveru http://www.google.com/recaptcha"; Používám: Windows XP Home Edition SP3 PHP 5.2.17.17 Apache 2.2.22.0 MySQL Server 4.1 |
||
| Loup Profil * |
#2 · Zasláno: 25. 8. 2012, 17:27:32
Když zkusím vepsat řádek:
echo mysql_query(select * from authentication); a zakomentuju přesměrování a zápis do databáze, tak to hlásí tu stejnou chybu. |
||
| mimochodec Profil |
#3 · Zasláno: 25. 8. 2012, 17:37:49
Loup:
„Na různých fórech je tato hláška většinou asociovaná s chybnou syntaxí formuláře.“ Myslím že je v první řadě spojována s wordpressem. |
||
| Loup Profil * |
#4 · Zasláno: 25. 8. 2012, 19:10:08
WordPress ani žádné jiné CMS nepoužívám.
|
||
| mimochodec Profil |
#5 · Zasláno: 25. 8. 2012, 19:20:48
No nevím, ale tu hlášku určitě negeneruje php a když jsem hledal, našel jsem http://www.google.cz/search?client=opera&rls=cs&q=narazily+str%C3%A1nky+na+chybu.+Na+t%C3%A9to+adrese+mo%C5%BEn%C3%A1+pr%C3%A1v%C4%9B+prob%C3%ADh%C3%A1+%C3%BAdr%C5%BEba+str%C3%A1nek,+nebo+jsou+str%C3%A1nky+chybn%C4%9B&sourceid=opera&ie=utf-8&oe=utf-8&channel=suggest
|
||
| Davex Profil |
#6 · Zasláno: 25. 8. 2012, 19:42:15
Loup:
Možná to bude tím, že není definována proměnná $loginpage_url.
Jinak nechápu, jak může fungovat databáze, když se k ní skript nepřipojuje, to je záhada. |
||
| Loup Profil * |
#7 · Zasláno: 25. 8. 2012, 20:46:02 · Upravil/a: Loup
V souboru config.php je řádek:
$loginpage_url= $domain.'securelogin/';$loginpage_url= $domain.'securelogin/'; Když vložím: mysql_query("insert into authentication (username, password) VALUES ('loupacek', 'heslo')");$hashedpassword= HashPassword($desired_password); Přičemž to samozřejmě pokaždé vyhodí to chybový hlášení. Jo a prve jsem přehlídl jeho druhou část: Chyba protokolu HTTP 500 (Internal Server Error): Při pokusu o splnění požadavku došlo na serveru k neočekávané situaci. |
||
| Loup Profil * |
#8 · Zasláno: 25. 8. 2012, 21:46:41
Ok, takže jsem zatím zjistil, že je něco v nepořádku s hashováním hesla. Když zakomentuju všechny pasáže, ve kterých se hashuje a použiju při kontrole formuláře skutečné heslo, tak se mi daří se zaregistrovat i přihlásit. Teď ale fakt netuším, co může být blbě s hashem. S tímhle dělám poprvé v životě.
|
||
| abc_ Profil * |
#9 · Zasláno: 25. 8. 2012, 21:57:31
Loup:
Verze PHP na serveru? |
||
| Keeehi Profil |
#10 · Zasláno: 25. 8. 2012, 21:58:39
Začal bych tímto:
var_dump(function_exists('mcrypt_create_iv'));
var_dump(function_exists('hash')); |
||
| Loup Profil * |
#11 · Zasláno: 25. 8. 2012, 22:11:15
Áha, takže mcrypt_create_iv nemám. Co s tím? Jak to napravit? Dá se to nějak připojit?
|
||
| Keeehi Profil |
#12 · Zasláno: 25. 8. 2012, 22:16:53
V komentářích jsem našel toto:
function alt_mcrypt_create_iv ($size) {
$iv = '';
for($i = 0; $i < $size; $i++) {
$iv .= chr(rand(0,255));
}
return $iv;
} |
||
| Loup Profil * |
#13 · Zasláno: 26. 8. 2012, 00:42:41 · Upravil/a: Loup
No, já si asi vystačím s tou funkcí samotnou, jestli chápu správně, o co jde. Jenom mi vrtá hlavou, proč ta funkce samotná není nalezena (stejně jako i MCRYPT_DEV_URANDOM), když knihovnu php_mcrypt.dll mám ve složce \ext se všema ostatníma.
Tak už vím, proč to nešlo předtím. Ta knihovna byla zakomentovaná v php.ini, ale já ji odkomentoval a php spustil znova a pořád se chová, jakoby tam prostě nebyla. |
||
| Loup Profil * |
#14 · Zasláno: 26. 8. 2012, 13:54:05
mcrypt_create_iv už funguje, ale MCRYPT_DEV_URANDOM pořád ne. Našel jsem tohle, ale nejsem si jistý, jak mi to má pomoct.
|
||
| Keeehi Profil |
#15 · Zasláno: 26. 8. 2012, 14:16:02
Loup:
V jednoduchosti, v tom odkazu je, že pokud jsi na windows, tak máš použít MCRYPT_RAND. Celé mi to však přijde zbytečně složité. alt_mcrypt_create_iv by úplně stačilo, stejně jsou to všechno pseudonáhodné generátory. |
||
| Loup Profil * |
#16 · Zasláno: 26. 8. 2012, 14:22:53
No dobře, to by v zásadě asi šlo. A myslíš, že bude stačit mcrypt_create_iv? Protože alt_mcrypt_create_iv taky nemám.
|
||
| Keeehi Profil |
#17 · Zasláno: 26. 8. 2012, 14:30:47
alt_mcrypt_create_iv není žádná oficiální funkce. je to uživatelská funkce, která dělá to samé jako mcrypt_create_iv, jen jinak. To alt_ znamená alternativní verze. Její kód je v [#12].
|
||
| Loup Profil * |
#18 · Zasláno: 26. 8. 2012, 14:39:54
Ach so! Už tomu začínám rozumět.
|
||
| Loup Profil * |
#19 · Zasláno: 26. 8. 2012, 18:09:01
Děkuju moc všem a hlavně Keeehimu. Moc jste mi pomohli a už mi to jede.
|
||
|
Časová prodleva: 13 let
|
|||
0