2011-01-12 40 views
0

こんにちは、私はmysqliを初めて使いました。質問があります。 mysqliとprepared statementを使用するようにログインチェックを更新しました。しかし、あなたは決して安全ではありません。だから、このコードで何か間違っていることを教えてもらえますか?check loginのヘルプ

<?php 
     ini_set('display_errors', 'On'); 
error_reporting(E_ALL | E_STRICT); 



       $mysqli=new mysqli("localhost", "***", "***","***") ; 
       if(!$mysqli){ 
       die("Database error"); 
       } 


       function checklogin($username, $password){ 
       global $mysqli; 


       $result = $mysqli->prepare("SELECT * FROM users WHERE username = ? and password=?"); 
       $result->bind_param("ss", $username, $password); 
       $result->execute(); 

      if($result != false){ 

       $dbArray=$result->fetch(); 


       if(!$dbArray){ 
        echo '<p class="statusmsg">The username or password you entered is incorrect, or you haven\'t yet activated your account. Please try again.</p><br/><input class="submitButton" type="button" value="Retry" onClick="location.href='."'login.php'\">"; 
        return; 
       } 
       $_SESSION['username']=$username; 

       if(isset($_POST['remember'])){ 
        setcookie("jmuser",$username,time()+60*60*24*356); 
        setcookie("jmpass",$password ,time()+60*60*24*356); 
       } 
       echo'<p class="statusmsg"> You have successfully logged in. You will now be redirected to the homepage.</p>'; 
      redirect(); 
      } 

      else{ 
       echo'<p class="statusmsg"> The username or password you entered is incorrect. Please try again.</p><br/>input class="submitButton" type="button" value="Retry" onClick="location.href='."'login.php'\">"; 
       return; 
      } 
     } 

       if(isset($_COOKIE['jmuser']) && isset($_COOKIE['jmpass'])){ 

       $status=checkCookie($_COOKIE['jmuser'], $_COOKIE['jmpass']); 
       if($status==true){ 
        echo '<p class="statusmsg"> Welcome back '.$_COOKIE['jmuser'].'. You will now be redirected to the homepage.</p>'; 
        sleep(5); 
        redirect(); 

       } 
      } 

     else{ 


     if(isset($_POST['sublogin'])){ 

     if((strlen($_POST['user']) >0) && (strlen($_POST['pass']) >0)) { 

      checklogin($_POST['user'], $_POST['pass']); 

     } 
     elseif((isset($_POST['user']) && empty($_POST['user'])) || (isset($_POST['pass']) && empty($_POST['pass']))){ 

      echo '<p class="statusmsg">You didn\'t fill in the required fields.</p><br/><input class="submitButton" type="button" value="Retry" onClick="location.href='."'login.php'\">"; 

     } 
     } 
     else{ 

      echo '<p class="statusmsg">You came here by mistake, didn\'t you?</p>'; 

     } 


     } 

また、ログイン時にindex.phpにリダイレクトされないようです。タグのすぐ上に書かれたコードです。

<?php 
if(isset($_GET['url'])){ 

function redirect() { 
    header('location:'.$_GET['url']); 
} 
} 
else { 
    function redirect() { 
     header('location: index.php'); 
     } 
     } 

?> 

私は無駄なテキストを削除しようとしました。私は問題を知っていると思う。ログインボタンがクリックされると、私はアドレスバーにこれを表示します:localhost/JMToday/loginchk.php?url =したがって、URLは空白なのでどこにもリダイレクトされません。私の理論が間違っていない限り:Pあなたは助けてくれますか?

答えて

0
setcookie("jmuser",$username,time()+60*60*24*356); 
setcookie("jmpass",$password ,time()+60*60*24*356); 

クッキーで明らかではありませんストアのユーザー名/パスワードを行います。代わりに、ユーザーレコードのキーとして使用できるユーザーに何らかの種類のハッシュ値を割り当てます。

+0

なぜですか?ハッシュ値をどのように割り当てることができますか? md5($ password)などを使っていますか? –

+0

そのデータをクッキーに入れることはセキュリティ上のリスクです。ネットワークスニファ(またはブラウザー内のいくつかのJavaScript)をもっている人は、ユーザーのログイン情報を盗むことができます。ハッシュの場合は、md5よりも優れたものが必要です。ユーザー名/パスワードの塩漬けsha1()が良いでしょう。それをユーザーレコードに格納し、それをその後の訪問のキーとして使用します。そうすれば、ユーザーのユーザー名/パスワードを取得することは不可能になりますが、このトークンを盗まれた場合でも攻撃はあなたのサイトに入ります。 –

+0

私はsha1()のようにクッキーを保存するだけでなく、実際のサインアップの詳細も保存しますか? –

-1

通常、私はSQLインジェクションのようないくつかの特定のことを試してみるとよいでしょう。あなたのものがテキストフィールドのどちらかでシンプルなものを使用することで壊れた場合、SQLインジェクションにかなり脆弱です(プリペンド状態を使用することはありません)。すでに印刷/エコーでテキストを出力するか、他のいくつかのヘッダがに干渉するつもりはthatsの送信した場合、単純な目的のために

それが掲載されていたよう

:-)偉大なスクリプトのように思える、あなたのリダイレクトが機能しませんリダイレクトヘッダ。

+0

いいえ、彼の場合は脆弱ではありません –

+0

大文字のテキスト –

+0

を読む必要があります。彼がそれを使用しているように。では、答えのポイントは何ですか? –

0

ブラウザに何かを出力した後、リダイレクトすることはできません。さて、出力バッファリングがないわけではありませんが、スクリプトが終了するか出力バッファリングが終了するまで何も表示されません。 Header()は、要求されたファイルの先頭に送信されたヘッダに書き込みます。他のヘッダを除いて何かが送信されていれば、それを行うことはできません。何かが送信された後にリダイレクトする場合は、HTMLメタリフレッシュまたはJavaScriptを使用する必要があります。

+0

私は無駄にテキストを削除しようとしました。私は問題を知っていると思う。ログインボタンをクリックすると、アドレスバーに表示されます。http://localhost/JMToday/loginchk.php?url = URLは空白なので、どこにもリダイレクトされません。私の理論が間違っていない限り:Pあなたは助けてくれますか? –

+0

さて、あなたはおそらく?url =だけでなく、フォームのアクションを "localhost/JMToday/loginchk.php?url = whatever"に変更しなければならないでしょう。 ($ _ GET ['url'])&& file_exists($ _ GET ['url'])!&& $ _GET ['url']!= "") ) ' – Phoenix