복붙노트

[SQL] 간단한 PHP SQL 로그인 문제 해결

SQL

간단한 PHP SQL 로그인 문제 해결

나는 데이터베이스에서 등록 된 사용자 이름 / 암호를 검색하여 매우 기본적인 PHP 로그인을 만들려고하고 있습니다. 이것은 지금까지 실제로 사용되지 않고, 나는 제로 입력 검증이 알고 있습니다. 내가 할 노력하고있어 모든 로그인의 데이터베이스에서 데이터를 선택합니다.

여기에 index.html을에 로그인 폼은 다음과 같습니다

    <table width="250" border="0" align="center" cellpadding="0" cellspacing="1"    bgcolor="#CCCCCC">
    <tr>
    <form name="form1" method="post" action="checklogin.php">
    <td>
    <table width="100%" border="0" cellpadding="3" cellspacing="1" bgcolor="#FFFFFF">
    <tr>
    <td colspan="3"><strong>Member Login </strong></td>
    </tr>
    <tr>
    <td width="78">Username</td>
    <td width="6">:</td>
    <td width="294"><input name="Username" type="text" id="Username"></td>
    </tr>
    <tr>
    <td>Password</td>
    <td>:</td>
    <td><input name="Password" type="text" id="Password"></td>
    </tr>
    <tr>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td><input type="submit" name="Submit" value="Login"></td>
    </tr>
    </table>
    </td>
    </form>
    </tr>
    </table>

그리고 여기에 PHP의 checklogin.php입니다 :

   <?php

    $sql_connection = mysqli_connect ("localhost:8889","root","root","derek_website_tmp");

    if (mysqli_connect_errno())
{
 echo "failed to connect" . mysqli_connect_error();
}

    $Username=$_POST['Username'];
    $Password=$_POST['Password'];

    $sql = "SELECT * FROM $Members WHERE Username = '$Username' and Password = '$Password'"
    $result=mysqli_query($sql);

    $count = mysql_num_rows($result);

    if ($count==1) {
    $_SESSION['Username'] = $Username;
    $_SESSION['Password'] = $Password;
    header('location:login_success.php');
    }

    else {
    echo 'Wrong Username or Password';
    }

    if (!mysqli_query($sql_connection))
{
die('Error : ' . mysqli_error($sql_connection));
}

    mysqli_close ($sql_connection);

    ?>

나는이 때 나는 오류 검색 checklogin.php를 얻을 수 어떤 도움을 크게 감상 할 수있다.

해결법

  1. ==============================

    1.우리는 우리의 게시물이있는 경우에는 우리가 데이터베이스에 연결하는 경우, 우리는 우리가 우리의 쿼리가 통과하고 실행에 OK 경우, 우리는 우리가에 제공하는 매개 변수를 확인 확인 확인 확인 그래서 첫째, 개발하는 동안 오류를 처리하는 것은 매우 중요하다 쿼리 및 우리는 마침내 쿼리를 실행합니다.

    우리는 우리의 게시물이있는 경우에는 우리가 데이터베이스에 연결하는 경우, 우리는 우리가 우리의 쿼리가 통과하고 실행에 OK 경우, 우리는 우리가에 제공하는 매개 변수를 확인 확인 확인 확인 그래서 첫째, 개발하는 동안 오류를 처리하는 것은 매우 중요하다 쿼리 및 우리는 마침내 쿼리를 실행합니다.

    당신은 내가했던 것처럼, 쿼리에서 필드를받을 변수의 이름을 bind_result 사용할 수있는 후.

    공지 사항이 어떻게 내 쿼리 내가 사용하고? 당신이 당신의 변수를 살균하지 않을 때문에 우리가 현재 코드에서 SQL 주입을 방지하는 것입니다 bind_param를 사용하여 정의하는 준비된 문입니다, SQL 인젝션은 여전히 ​​가능하다.

    나는 당신이하고있는 생각의 또 다른 실수는 아주 아주 잘못된 것입니다, 당신은 항상 사용자와 자신을 보호하기 위해 암호를 암호화해야 일반 텍스트로 암호를 저장합니다. 내 MySQL의 쿼리의 암호, 내가 처음 사용 만 사용자를 포함하지 않는 이유의 그 사용자는 그때이 경우에 내가 할 bcrypt을 사용하고, 그가 데이터베이스에서 검색 한 암호와 일치하는 게시 된 암호를 사용하여 발견 된 경우 매우 안전한 암호화 라이브러리 작업.

    bcrypt을 사용하는 방법을 여기를 참조하십시오.

    나만의 암호가 난 다음 세션에 데이터를 배치하고 사용자를 리디렉션하고 유효하다고 볼 수 후.

    나는 내 대답의 맨 아래에 지적 모든 오류 외에도, 여기에 내가 당신의 코드를 작성하는 것이 방법이다.

    <?php
    session_start();
    include_once('bcrypt.php');
    // Your database info
    $db_host = '';
    $db_user = '';
    $db_pass = '';
    $db_name = '';
    
    if (!isset($_POST['Username']))
    {
        echo 'Fill in the username...';
        exit;
    }
    
    if (!isset($_POST['Password']))
    {
        echo 'Fill in your password...';
        exit;
    }
    
    $con = new mysqli($db_host, $db_user, $db_pass, $db_name);
    if ($con->connect_error)
    {
        die('Connect Error (' . $con->connect_errno . ') ' . $con->connect_error);
    }
    
    $sql = "SELECT Username, Password FROM `Members` WHERE Username = ?";
    if (!$result = $con->prepare($sql))
    {
        die('Query failed: (' . $con->errno . ') ' . $con->error);
    }
    
    if (!$result->bind_param('s', $_POST['Username']))
    {
        die('Binding parameters failed: (' . $result->errno . ') ' . $result->error);
    }
    
    if (!$result->execute())
    {
        die('Execute failed: (' . $result->errno . ') ' . $result->error);
    }
    
    $result->store_result();
    if ($result->num_rows == 0)
    {
        die('No username found...');
    }
    
    $result->bind_result($db_username, $db_password);
    $result->fetch();
    $result->close();
    $con->close();
    
    $bcrypt = new Bcrypt(15);
    if ($bcrypt->verify($password, $db_password))
    {
        $_SESSION['Username'] = $db_username;
        header('location:login_success.php');
        exit;
    }
    else
    {
        echo 'Wrong Username or Password';
    }
    

    참고 : 위의 코드는 단지 예입니다 당신이 알려 그것으로 오류가 나는 경우, 테스트되지 않았습니다.

    난 당신이 게시 한 코드에서 발견 한 오류 중 일부 :

    당신은 폐쇄를 놓치고; 여기:

    $sql = "SELECT * FROM $Members WHERE Username = '$Username' and Password = '$Password'"
    

    또한 귀하의 요청에 당신은 $ 회원을 가지고 있지만 당신은 아마 같이 대신 회원들 말을 의미 않았다, 코드 어디에서나 정의 된 $ 멤버 변수가 없습니다 :

    $sql = "SELECT * FROM `Members` WHERE Username = '$Username' and Password = '$Password'";
    

    해서는 안이

    $count = mysql_num_rows($result);
    

    있다

    $count = mysqli_num_rows($result);‌
    

    $result=mysqli_query($sql); 
    

    있다

    $result=mysqli_query($sql_connection, $sql);
    

    당신은 mysqli_query의 아래 부분에 어떤 쿼리가 없다

    if (!mysqli_query($sql_connection)) 
    
  2. from https://stackoverflow.com/questions/18971570/simple-php-sql-login-troubleshooting by cc-by-sa and MIT license