2011-01-20 1 views
0

Я использую переменную post, и я пытаюсь использовать переменную get из url для входа пользователя.Использование переменной get из URL для запроса MYSQL

Вот процесс:

Пользователи получают свой собственный URL, то есть kayden.domain.com

и когда они создают свой собственный счет, они имеют свое имя и передать

Когда они приходят к kayden.domain.com используют эти учетные данные.

Чтобы проверить, проверяются ли переменные post (имя пользователя и пароль) и пытаются использовать $ _GET ['user_group'] для проверки.

Сценарий работает, когда я просто использую переменные post, но когда дело доходит до 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

Бык не помнит, когда The Calf был – bensiu

ответ

4

Два яруса Ответ:

Часть 1

Вы можете использовать PHP переменную $ _REQUEST, чтобы получить подробную информацию от обоих GET (строка запроса), POST и COOKIE.

Например:

$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, которое содержит дополнительный SQL, и ваш скрипт выполнит его без каких-либо вопросов.

Вы должны всегда проверить все внешние входы, как вы не можете доверять, что она всегда будет содержать то, что вы ожидаете.

Более подробная информация об этом можно найти:

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

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']); 
} 

с помощью $ _REQUEST может подобрать форму вар $ _COOKIE