HTML giriş formu dönüş hatası

4 Cevap php

Benim şirket oldukça birkaç yıl önce inşa edilmiş bir sitede bazı hatalar temizlik ile görevlendirildi. Ben bunu yazmadım ki ihtar ile burada yayınlamak ve bunu çok güvenli bir giriş sistemi olmadığını biliyoruz kodunu Önsöz istiyor, ama ben sadece eldeki hatayı düzeltmek için tahsis edilmiştir.

SORUN: Kullanıcıların kendi kimlik bilgilerini yeniden yazmak onları gerektiren, sayfa yenilenmesini görünen formu gönderdikten sonra, giriş için gittiğinizde. Hayır giriş hatası rapor ediliyor. Ben sadece bugüne kadar Firefox ve Safari bu sorunu çoğaltmak olabilir. Bir çıkış yapıp tekrar giriş olsaydı Başarılı bir girişten sonra, her şey iyi iş gibi görünüyor. Başlangıçta tarayıcıyı başlatmak ve ilk defa giriş yapmaya hemen sonra bu. Ben de farklı Mac / Windows PC'ler üzerinde bu çoğaltılamaz.

Burada temel giriş sayfası HTML. Ben gereksiz bir şey dışarı kırparak yaşıyorum, ama gerekirse daha kod sağlayabilir.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
...

<body>
            <form name="login" method="post" id="mainform" action="clogin.php">
                 <label for="username">Username:</label>
                 <input type="text" id="username" name="username"><br />
                 <label for="password">Password:</label>
                 <input type="password" id="password" name="password"><br />
                 <input type="submit" name="Submit" class="button" style="float:right;" value="Login">                
            </form>
</body>

Burada da yağ için kesilmiş PHP gibidir:

<?php
$db = mysql_connect('***', '***', '***') or die("Couldn't connect to the database."); 
mysql_select_db('***') or die("Couldn't select the database"); 

$result = mysql_query("SELECT count(id) FROM merchants WHERE passw='$_POST[password]' AND usern='$_POST[username]'") or die("Couldn't query the user-database."); 
$num = mysql_result($result, 0); 

if (!$num) { 

// When the query didn't return anything, 
// display the login form. 

$message = "Login Failed: Incorrect username or password";

header('Location: login.php?message='.$message);


} else { 

// Start the login session 
session_start(); 


// All output text below this line will be displayed 
// to the users that are authenticated. Since no text 
// has been output yet, you could also use redirect 
// the user to the next page using the header() function. 
header('Location: merchants/index.php'); 
}

Herkes aramaya başlamalıdır nerede bir fikir var mı? Benim ilk düşünce belki form gerçekten tam teslim olmasıdır? Bu oluyor eğer nasıl söyleyebilir? Herhangi bir ipucu veya işaretçiler olurdu. Ben şahsen bu neden olabilir bir "kod" sorunu bulamıyorum.

4 Cevap

Bağırmaya dürtü karşı 'SQL enjeksiyonu saldırısı!! 1111', dediğiniz gibi oldukça doğru teslim edilmemesi şeklinde benziyor. Fikirlerin bir çift:

Eğer veritabanını sorgulamak önce form kod teslim edildiğini bir şekilde kontrol musunuz? Eğer öyleyse, bu değer kesinlikle yayınlanmıştır ediliyor?

Ben bir

Firefox için Tamper Data add on alın. Bu formu yazı ve arka sunucudan yanıt seyretmek izin vereceğim. Orada diğer aynı yapacak eklentiler ya da IE aynı verileri görmek gerek eğer alabilirsiniz Fiddler.

Ya yerine seçerek COUNT(id) yerine sadece * seçilmiş ve mysql_result mysql_num_rows, hatalar hala ortaya çıkabilir için değiştirilir?

$result = mysql_query("SELECT * FROM merchants WHERE passw='$_POST[password]' AND usern='$_POST[username]'") or die("Couldn't query the user-database."); 
$num = mysql_num_rows($result); 

if ($num < 1) {

Sadece burada yeniden yazmak için gidin ve nasıl çalıştığını görelim:

<?php
$db = mysql_connect('***', '***', '***') or die("Couldn't connect to the db."); 
mysql_select_db('***') or die("Couldn't select the db"); 

$result = mysql_query("SELECT id FROM merchants WHERE passw='%s' AND usern='%s'",
                      mysql_real_escape_string($_POST['username']),
                      mysql_real_escape_string($_POST['password'])) 
      or die("Couldn't query the user table."); 

if (mysql_num_rows($result) != 0) {
     $user = mysql_fetch_assoc($result);
     $userId = $user['id'];

     // Destroy any old session data from before for a fresh session
     session_destroy();
     session_start(); 

     header('Location: merchants/index.php'); 
     exit();
} else {
    $message = "Login Failed: Incorrect username or password";

    header('Location: login.php?message='.$message);
    exit();
}
?>

Bir atış ver. Eğer daha fazla kod yürütür emin olmak başlığındaki konumunu ayarlamak sonra exit () atmak için her zaman iyi.

Bunu da yaparken siz oturumu dizisinde set hata mesajı var ve sorgu dize yoluyla aksine oldu onu geri göndermek isteyebilirsiniz:

...
} else {
    $message = "Login Failed: Incorrect username or password";
    $_SESSION['login_error'] = $message;
    header('Location: login.php');
    exit();
}

Sonra sadece hataları görüntülemek için giriş sayfasındaki $ _SESSION ['login_message'] erişebilirsiniz.

Id Bu almaz size forma geliyor ne görmek için $ _POST dizi bazı var_dump() deneyin çalışıyor.