Адчувальны PHP MySQL Увайсці

У мяне ёсць просты скрыпт аўтэнтыфікацыі, які працуе, але я выявіў, што для карыстальніка адміністратара з паролем адміністратара, у ADMIN карыстальніка з паролем адміністратара можа таксама ўвайсці ў сістэму. Як я зрабіць гэты выпадак сцэнар адчувальны да рэгістра. Таксама я ведаю пра enycriptions, што можа быць зроблена так, што пароль не захоўваецца ў выглядзе тэксту, проста неабходна, каб высветліць, як зрабіць гэта адчувальна да рэгістра.

        if($_SERVER['REQUEST_METHOD'] == "POST" &&  mysql_real_escape_string($_POST['username'])!="" && mysql_real_escape_string($_POST['password']) !="") {//receive form sent via POST method

        $username = mysql_real_escape_string($_POST['username']);//prevent sql injection by using  "mysql_real_escape_string()"
        $password = mysql_real_escape_string($_POST['password']);
        $data = mysql_query("SELECT * FROM users WHERE username='$username' AND password='$password'");

    if(mysql_num_rows($data) >0) {  //if the query returns a result then create session variables to show user is authenticated
      $_SESSION['logged'] = 1;
      $_SESSION['user'] = $username;
    }
  }
1
Існуе <�б> няма больш падтрымкі для MySQL _ * функцыі, яны афіцыйна састарэлым , <�б> больш не падтрымліваецца і будзе выдаленыя ў будучыні. Вы павінны абнавіць свой код з PDO або MySQLi , каб забяспечыць функцыянальнасць вашага праекта ў будучыні.
дададзена аўтар Arjan, крыніца

9 адказы

Вы павінны ўсталяваць зверку поля вашага пароля на значэнне, якое мае касой «CS» не «CI», як

<�Р> "latin1_swedish_cs" замест "latin1_swedish_ci"

CI ўказвае адчувальны да рэгістра і CS для выпадку адчувальнага

1
дададзена
гэта можа растлумачыць некаторыя факты занадта stackoverflow.com/questions/11716420/…
дададзена аўтар techie_28, крыніца
Дзякуй за гэта. вельмі карысна на самай справе
дададзена аўтар Charles, крыніца

Вы можаце выкарыстоўваць бінарнага тыпу прымушаць адчувальнасці да рэгістра:

"SELECT * FROM users WHERE BINARY username='$username' AND password='$password'"

Варта адзначыць, што mysql_ функцыі састарэлі. Вы павінны пераключыцца на MySQLi або PDO і выкарыстоўваць падрыхтаваныя заявы.

1
дададзена
На самай справе, гэты запыт толькі робіць імя карыстальніка поля адчувальныя да рэгістра у той час як поле пароля няма. Вы павінны былі б выкарыстоўваць SELECT * FROM карыстальнікаў WHERE BINARY імя карыстальніка = '$ імя карыстальніка' і BINARY пароль = '$ пароль'
дададзена аўтар Acidic, крыніца
Акрамя таго, вы не павінны захоўваць паролі ў выглядзе звычайнага тэксту. Пасля таго, як з дапамогай md5 ці якой-небудзь метад шыфравання, адчувальнасць да рэгістра не павінна быць праблемай, так як большасць метадаў шыфравання будзе ўсё ў ніжнім рэгістры
дададзена аўтар Acidic, крыніца
Дзякуючы. Ніколі не чуў пра Binary. будзе чытаць больш аб гэтым
дададзена аўтар Charles, крыніца

Па-першае, вы сапраўды павінны хэшавання пароляў. Змена капіталізацыі дасць вам іншы хэш, так што сартуе пытанне.

Калі вы хочаце параўнаць імёны карыстальнікаў у выпадку адчувальным спосабам, вы, верагодна, таксама хочуць, каб захоўваць іх такім чынам і быць у стане стварыць розных карыстальнікаў для лагінаў «Foo» і «Foo». Гэта магчыма, але вам трэба змяніць табліцу базы дадзеных. Больш канкрэтна, вам неабходна змяніць тып слупка для слупка імя карыстальніка, каб уключыць

1
дададзена

Калі не прычына не хэш пароля (я лічу MD5 яшчэ прынята, хоць SHA-256 з'яўляецца пераважнай). Хэш вырабляе ўзровень бяспекі пры перадачы трафіку, паколькі іх дэкадавання павінна быць грубымі прымусова. Ён таксама захоўвае вялікую A і маленькай літар А, як розныя хэш так клапоціцца аб праблеме выпадку адчувальнасці.

Калі няма, то вам трэба выкарыстоўваць адчувальная да рэгістра карэляцыі на вашым поле пароля.

1
дададзена
Гэта вырашае праблему пароляў, але не імя карыстальніка.
дададзена аўтар Barmar, крыніца
Я згодны, але гэта, здаецца, што ОП хоча.
дададзена аўтар Barmar, крыніца
Дзякуй за тлумачэнне. Думаў быў шлях вакол enycription. дзякуй
дададзена аўтар Charles, крыніца
@Pirion - хэшавання пароля з'яўляецца шляхам, але гэта не вельмі добрая ідэя выкарыстоўваць MD5 або функцыю SHA- * сям'я, таму што яны з'яўляюцца спосабамі занадта хутка. Замест таго, каб выкарыстоўваць павольную функцыю ключа дэрывацыі як Bcrypt або PBKDF2. Паглядзіце на новы PHP функцыі password_hash() .
дададзена аўтар martinstoeckli, крыніца
@Barmar - я не магу думаць пра выпадак, калі карыстальнік «ADMIN» павінна быць іншым карыстальнікам, чым карыстач «адміністратар». Адчувальнасць да рэгістра пароляў мае сэнс, але для імёнаў карыстальнікаў?
дададзена аўтар martinstoeckli, крыніца
+1 для хэшавання пароляў.
дададзена аўтар Arjan, крыніца

Параўнайце імя карыстальніка і пароль, якія вяртаюцца запыт з выкарыстаннем PHP, які адчувальны да рэгістра.

if(mysql_num_rows($data) >0) {  //if the query returns a result then create session variables to show user is authenticated
  $row = mysql_fetch_assoc($data);
  if ($row['username'] == $_POST['username'] && $row['password'] == $_POST['password']) {
    $_SESSION['logged'] = 1;
    $_SESSION['user'] = $username;
  }
}
0
дададзена

З password_hash РНР() функцыя, праблема адчувальнасці да рэгістра не павінен прыдумаць, як яна клапоціцца пра гэта.

0
дададзена

Проста зменіце калекцыю імя карыстальніка і пароля, пададзеныя ў latin1_general_cs у вас базе дадзеных.

0
дададзена

Гэтая праграма вызначае імя карыстальніка або адрас электроннай пошты, якія з'яўляюцца існуе не пацверджана. Гэты код адказу сервера ў фармаце JSON. Для таго, каб мець магчымасць параўноўваць выпадак адчувальнага з дапамогай WHERE BINARY ў заяве.

<?php
require "main.php";
$response = array();
$num = 0;

if($_SERVER['REQUEST_METHOD']=='POST'){
if(isset($_POST['username']) and
    isset($_POST['email']) and
        isset($_POST['password'])){

            $username= $_POST["username"];
            $password= $_POST["password"];
            $email= $_POST["email"];


            $mysql_qry = "select * from users where binary username like '$username' and binary email like '$email'";
            $result = mysqli_query($conn ,$mysql_qry);

            if(mysqli_num_rows($result) > 0 ){
                //User already exists, choose different username or email!
                $response['error'] = true;
                $response['message'] = "Username and Email is already exists!";
                $num = 1;
            }

            $mysql_qry = "select * from users where binary username like '$username'";
            $result = mysqli_query($conn ,$mysql_qry);

            if(mysqli_num_rows($result) > 0 && $num == 0){
                //User already exists, choose different username or email!
                $response['error'] = true;
                $response['message'] = "Username is already exists!";
                $num = 1;
            }

            $mysql_qry = "select * from users where binary email like '$email';";
            $result = mysqli_query($conn ,$mysql_qry);

            if(mysqli_num_rows($result) > 0 && $num == 0){
                //User already exists, choose different username or email!
                $response['error'] = true;
                $response['message'] = "Email is already exists!";
                $num = 1;
            }


            if($num == 0){
                $mysql_qry = "insert into users (username, password, email) values ('$username', '$password', '$email')";

                if($conn->query($mysql_qry) === TRUE ){
                    //Registration Successful!
                    $response['error'] = true;
                    $response['message'] = "Registration Successful!";
                }else{
                    //Registration Failed!
                    $response['error'] = true;
                    $response['message'] = "Registration Failed!";
                }
            }   
}else{
    //Require fields are missing!
    echo "missing";
}   
}else{
//Invalid Request!
echo "invalid";
}

echo json_encode($response);
?>
0
дададзена
<?php
// user input

$username="abc";
$password="123";

$sql=SELECT username,password FROM tablename WHERE username='".$username."' AND password ='".$password."' limit 1
$result=mysqli_query($coni,$sql);
if(!mysqli_num_rows($result) == 1)
{
    echo "not found";
}
else
{
    while ($row=mysqli_fetch_array($result)) 
    { 
        $getu=$row[0];
        $getp=$row[1];
    }
    if($username===$getu && $password===$getp)
    {
        echo "username".$getu." password".$getp;
        echo "Login success";
    }
    else
    {
        echo "no";
    }
}
?>
0
дададзена