Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Problemy z sesją PHP i postami na stronie logowania

Edytuj: Ok, więc popełniłeś literówkę w polach formularza. Nadal mieszasz interfejsy API MySQL, zobacz poniżej o funkcji miksowania przy użyciu mysql_real_escape_string() .

Spójrz na name="myusername" i Twoje zadanie POST, wraz z hasłem.

Nie pasują.

Zmień name="myusername" do name="username"

i name="mypassword" do name="password"

zgodnie z

$myusername=$_POST["username"];
$mypassword=$_POST["password"];

Korzystając z raportowania błędów , zasygnalizowałby niezdefiniowany indeks i nagłówki już wysłane ostrzeżenie; patrz poniżej.

Masz również spacje przed <?php co spowodowałoby wyjście przed nagłówkiem. Usuń je.

Dodatkowo mieszasz interfejsy API MySQL z mysql_error() . mysql_error() powinien brzmieć jako mysqli_error($con) a to poniżej:

$myusername = mysql_real_escape_string($myusername);
$mypassword = mysql_real_escape_string($mypassword);

który powinien brzmieć jako

$myusername = mysqli_real_escape_string($con,$myusername);
$mypassword = mysqli_real_escape_string($con,$mypassword);

lub

$myusername = mysqli_real_escape_string($con,$_POST['username']);
$mypassword = mysqli_real_escape_string($con,$_POST['password']);
  • mysqli_ i mysql_ funkcje nie mieszają się ze sobą.

Odnośnie bezpieczeństwa

Zauważyłem, że możesz przechowywać hasła w postaci zwykłego tekstu. Jeśli tak jest, jest to wysoce odradzane.

Zalecam użycie CRYPT_BLOWFISH lub PHP 5.5 password_hash() funkcjonować. Dla PHP <5.5 użyj password_hash() compatibility pack .

Dodatkowo, w odniesieniu do wstrzykiwania SQL, użyj mysqli z przygotowanymi zestawieniami lub PDO z przygotowanymi oświadczeniami , są znacznie bezpieczniejsze .

Przypisy

Najlepiej dodać exit; po każdym nagłówku.

header("location:login_success.php");
exit;

i dla wszystkich nagłówków.

Edytuj:

Usuń

$myusername=$_POST["username"];
$mypassword=$_POST["password"];
echo $myusername . "<br>";  
echo $mypassword . "<br>";

następnie zamień go na:

$myusername = stripslashes($_POST["username"]);
$mypassword = stripslashes($_POST["password"]);
$myusername = mysqli_real_escape_string($con,$_POST['username']);
$mypassword = mysqli_real_escape_string($con,$_POST['password']);

Edytuj #2 :

Z tym testowałem Twój kod i odniosłem sukces, dlatego nie wiem, co jest nie tak z Twoim obecnym kodem.

FORMULARZ HTML

<form action="main_login.php" method="post" style="text-align:right;">
    Username:   
    <input type="text" name="username" value="" size=20  style="display:inline-block;margin-left:10px"required>
    <br> 
    Password:  
    <input type="text" name="password" value="" size=20 style="margin-left:12px"required> 
    <br>  
    <input type="submit" value="Log In" style="margin-left:75px"=> 
</form>

MySQL

<?php

    $DB_HOST = 'xxx';
    $DB_USER = 'xxx';
    $DB_PASS = 'xxx';
    $DB_NAME = 'xxx';

    $conn = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME);
    if($conn->connect_errno > 0) {
      die('Connection failed [' . $conn->connect_error . ']');
    }

    $myusername = stripslashes($_POST["username"]);
    $mypassword = stripslashes($_POST["password"]);
    $myusername = mysqli_real_escape_string($conn,$_POST['username']);
    $mypassword = mysqli_real_escape_string($conn,$_POST['password']);


    echo $myusername; // echos
    echo "<br>";
    echo $mypassword; // echos


    $sql="SELECT * FROM register WHERE username='$myusername' and password='$mypassword'";
    $result=mysqli_query($conn,$sql);

    $count=mysqli_num_rows($result);

    if($count==1){
        echo "Yep";
    }
    else{
        echo "nope";
    }

Uwaga: Powinieneś także wyczyścić swoje sesje (zniszcz sesje ), na serwerze może być coś, co przechowuje stare nazwy użytkowników i hasła.

Upewnij się również, że w Twoich kolumnach nie ma spacji, czy typy są poprawne, a długości są wystarczająco długie, aby pomieścić dane. Zwykle VARCHAR(255) jest więcej niż wystarczające, ale jest sugerowane przy używaniu haszowanych haseł generowanych przez password_hash() , funkcja, której powinieneś używać podczas przechowywania haseł.

Zobacz też:

na stosie.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Django ORM, wstaw brak daty i godziny jako 0 do MySQL

  2. Jak znaleźć dane z ostatniego tygodnia w MySQL

  3. Jak wstawić do wiersza MYSQL z wielu tablic $_POST

  4. MySQL do zastąpienia za pomocą symbolu wieloznacznego

  5. Nie można połączyć się z mysql za pomocą 127.0.0.1