2011-01-20 18 views
0

私は投稿変数を使用していますが、URLからget変数を使用してユーザーをログインしようとしています。ここでURLからget変数を使用してMYSQLクエリを実行する

はプロセスです:

ユーザーが独自のURLを取得、すなわちkayden.domain.com

と、彼らは自分のアカウントを作成するとき、彼らは自分のユーザー名を持っており、彼らが来たとき

を渡しますkayden.domain.comこれらの資格情報を使用します。

確認するには、投稿変数(ユーザー名とパスワード)を確認し、確認するために$ _GET ['user_group']を使用しようとしています。

私はちょうどポスト変数を使用するときにスクリプトが動作しますが、GETに関しては動作しません。以下のコードです:

PHP:

$SUBDOMAIN = mysql_real_escape_string($_GET['user_group']); 


     // Process the POST variables 
     $username = $_SESSION["user_name"]; 
     //$password = $_POST["password"]; 


     // Set up the session variables 
     $_SESSION["user_name"] = $username; 


     $secret = $info['password']; 

      //Checks if there is a login cookie 

      if(isset($_COOKIE['ID_my_site'])) 


     //if there is, it logs you in and directes you to the members page 

     { 
     $username = $_COOKIE['ID_my_site']; 

     $pass = $_COOKIE['Key_my_site']; 

     $check = mysql_query("SELECT user_name, password FROM accounts WHERE user_name = '$username' and user_group='$user_group'")or die(mysql_error()); 

    while($info = mysql_fetch_array($check)) 



     { 

     if (@ $info['password'] != $pass) 
     { 

      } 

     else 

     { 

      header("Location: members.php"); 



     } 

     } 

    } 


      //if the login form is submitted 

     if (isset($_POST['submit'])) { // if form has been submitted 



      // makes sure they filled it in 

      if(!$_POST['user_name'] | !$_POST['password']) { 

      die('You did not fill in a required field.'); 

     } 

      // checks it against the database 



     if (!get_magic_quotes_gpc()) { 

     $_POST['user_name'] = addslashes($_POST['user_name']); 
     $_GET['user_group'] = addslashes($_GET['user_group']); 

     } 

     $check = mysql_query("SELECT user_name,password FROM accounts WHERE user_name = '".$_POST['user_name']."' and user_group='".$_GET['user_group']."'")or die(mysql_error()); 



      //Gives error if user dosen't exist 

      $check2 = mysql_num_rows($check); 

     if ($check2 == 0) { 

      die('That user does not exist in our database. <a href=add.php>Click Here to Register</a>'); 

     } 

      while($info = mysql_fetch_array($check)) 

     { 

     $_POST['password'] = md5($_POST['password']); 
     $_POST['password'] = $_POST['password']; 



     //gives error if the password is wrong 



     if (@ $_POST['password'] != $info['password']) { 

     die('Incorrect password, please try again'); 


     } 

      else 

     { 


      // if login is ok then we add a cookie 

      $_POST['user_name'] = stripslashes($_POST['user_name']); 

      $hour = time() + 3600; 

      setcookie(ID_my_site, $_POST['user_name'], $hour); 

      setcookie(Key_my_site, $_POST['password'], $hour); 



      //then redirect them to the members area 

     header("Location: members.php"); 

      } 

      } 

      } 

     else 

     { 



      // if they are not logged in 

    ?> 

     <form action="<?php echo $_SERVER['PHP_SELF']?>" method="post"> 

      <table border="0"> 

     <tr><td colspan=2><h1>Login</h1></td></tr> 

     <tr><td>username:</td><td> 

      <input type="text" name="user_name" maxlength="40"> 

      </td></tr> 

      <tr><td>Password:</td><td> 

      <input type="password" name="password" maxlength="50"> 

      </td></tr> 

      <tr><td colspan="2" align="right"> 

       <input type="submit" name="submit" value="Login"> 

      </td></tr> 

      </table> 

      </form> 


    <?php 

     } 



     ?> 
+0

誰かがどのようにデバッグするために、この偉大な開発者を教えることがあります。 –

+0

カーフが – bensiu

答えて

4

2層の答え:あなたがGET(クエリ文字列)、POSTおよびCOOKIEの両方から詳細情報を取得するためにPHP $ _REQUEST変数を使用することができます

パート1

。例えば

:この上

$ugData = $_REQUEST['user_group']; 
$unData = $_REQUEST['user_name']; 

詳しい情報はここで見つけることができます:

http://php.net/manual/en/reserved.variables.request.php

パート2

この行は、あなたのコード内で:

$check = mysql_query("SELECT user_name,password FROM accounts WHERE user_name = '".$_POST['user_name']."' and user_group='".$_GET['user_group']."'")or die(mysql_error()); 

悪意のあるユーザーが追加のSQLを含むuser_groupまたはuser_nameの値を含むリクエストを作成し、スクリプトが問題なく実行するようにすることができます。あなたは、それは常にあなたが期待するものが含まれますことを信頼することはできませんよう

あなたは常には、任意の外部入力を検証する必要があります。このに関する

詳しい情報は見つけることができます:

http://php.net/manual/en/security.database.sql-injection.php ます。http:// stackoverflowの。コム/質問/ 60174 /最高ウェイ・ツー・ストップ-SQLインジェクション・イン・PHP

これに対処する方法の簡単な例は次のとおりです。

$ugData = mysql_real_escape_string($_REQUEST['user_group']); 
$unData = mysql_real_escape_string($_REQUEST['user_name']); 

これは$_REQUEST入力をエスケープしますので、悪質なリクエストを作成した人は誰も止めてください。ただし、指定されたuser_group/user_nameが有効な値であることは検証されません。

+1

+1セキュリティのアドバイスのために、私は自分自身を言うつもりだった。 SQLインジェクションの潜在的な危険性を無視し、ユーザー定義の変数を直接クエリに注入することを選択したプログラマーを何度も見てきたことは信じられません。 – LostInTheCode

2

あなたがフォームを送信するためにPOSTメソッドを使用しています。 $ _POSTと一緒に使用する必要があります。

GETとPOSTの両方で使用する場合 $_REQUEST['varName']を使用してください。

+0

だったときにBullは修正されませんvarNameはどこに変数の名前を入れますか? – AAA

+1

はい、それは単なる例でした。あなたの場合、それはuser_groupになります。 – Gaurav

+0

構文エラー、予期しないT_ENCAPSED_AND_WHITESPACE、T_STRINGまたはT_VARIABLEまたはT_NUM_STRINGを予期しています。 – AAA

0
 
if (isset ($_GET['user_group']) { 
    $SUBDOMAIN = mysql_real_escape_string($_GET['user_group']); 
} 
if (isset ($_POST['user_group']) { 
    $SUBDOMAIN = mysql_real_escape_string($_POST['user_group']); 
} 

のvar形式$ _COOKIEを拾うことができます$ _REQUESTを使用して

関連する問題