Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: get_magic_quotes_gpc
 
 автор: gurza   (27.12.2008 в 02:21)   письмо автору
 
 

обязательно так
 
<?php  
  
if (!get_magic_quotes_gpc())  
  {  
    
$author mysql_escape_string($author);  
    
$pswrd mysql_escape_string($pswrd);  
  }  
?>  

или так тоже будет работать корректно?


<?php  
     $author 
mysql_escape_string($author);  
    
$pswrd mysql_escape_string($pswrd);  
  
?>  

  Ответить  
 
 автор: Root   (27.12.2008 в 16:30)   письмо автору
 
   для: gurza   (27.12.2008 в 02:21)
 

<?php
if( get_magic_quotes_gpc() )
{
    
$author stripslashes$author );
}
$author mysql_escape_string$author );
?>

надеятся на магические кавычки нечего, особенно после вот этого -> PHP 5.2.7 has been removed from distribution :-)

  Ответить  
 
 автор: gurza   (27.12.2008 в 22:01)   письмо автору
 
   для: Root   (27.12.2008 в 16:30)
 

Вот так безопасно?

<?php
if (!defined("DB")) die("Illegal File Access");

   global 
$prefix$db;

  if (
$_POST[sub]) {
      

       
$login mysql_escape_string($_POST['UserLogin']); 
       
$passw mysql_escape_string($_POST['UserPassword']);
     
       
$passw htmlspecialchars(stripslashes($passw));
       
$login htmlspecialchars(stripslashes($login));
       
       
$passw md5($passw);
    
         
$query "SELECT * FROM ".$prefix."_users WHERE UserLogin = '{$login}' AND UserPassword = '{$passw}'";
          
         
$result $db->sql_query($query);
         
$numrows $db->sql_numrows($result);
         
$row $db->sql_fetchrow($result);
  
         if(
$numrows != 0){
      
        
$id_user  intval($row['Uid']);
        
$id_login  htmlspecialchars(stripslashes($row['UserLogin']));
        
$UserSkin htmlspecialchars(stripslashes($row['UserTheme']));
        
$id_login2  htmlspecialchars(stripslashes($row['UserName']));

        
$remote_addr getenv('REMOTE_ADDR'); 
        
$db->sql_query("UPDATE ".$prefix."_users SET UserIP = '{$remote_addr}' WHERE Uid={$id_user}");
    
        
$_SESSION['UID'] = $id_user
        
$_SESSION['User'] = $id_login;
        
$_SESSION['Skin'] = $UserSkin;
        
$_SESSION['NIK_NAME'] = $id_login2;

     
        if(
$_POST['Act']){$Act $_POST['Act'];}else{$Act "Home";}
      
        
header ("Location: ?Act=$Act");
        
         } else { 
         
          print 
"<table width=\"98%\" border=\"0\" cellspacing=\"1\" cellpadding=\"3\" bgcolor=\"red\"><tr><th><font color=\"red\"><b>ERROR</b></font></th></tr>
                 <tr><td class=\"bgcolor1\"><br/><div align=\"center\"><b>Password or login are incorrect.</b><br></div><br>
                 </td></tr></table>"
; return; 
         }
       
    }
?>    

  Ответить  
 
 автор: Root   (27.12.2008 в 22:08)   письмо автору
 
   для: gurza   (27.12.2008 в 22:01)
 

обработка переменной $passw
<?php
...
$passw mysql_escape_string($_POST['UserPassword']);
...
$passw htmlspecialchars(stripslashes($passw));
...
$passw md5($passw);

убила наповал..

  Ответить  
 
 автор: Root   (27.12.2008 в 22:36)   письмо автору
 
   для: gurza   (27.12.2008 в 22:01)
 

1. Если включены magic_quotes, обрабатываем переменные функцией stripslashes().
2. Перед тем как заносить их в базу обрабатываем их mysql_escape_string().
3. htmlspecialchars() используем непосредственно перед выводом данных пользователю.

UPD.
if ($_POST[sub]) ??
$id_user = intval($row['Uid']); ?? Приводим инт к инту?
header ("Location: ?Act=$Act"); ?? Location куда?
Password or login are is incorrect.

  Ответить  
 
 автор: gurza   (27.12.2008 в 23:06)   письмо автору
 
   для: Root   (27.12.2008 в 22:36)
 

Я правльно понял

<?php 
if (!defined("DB")) die("Illegal File Access"); 

   global 
$prefix$db

  if (
$_POST[sub]) { //нажата кнопка логин
       
if( get_magic_quotes_gpc() ) 
       { 
       
$passw stripslashes($_POST['UserPassword']); 
       
$login stripslashes($_POST['UserLogin']);  
       }

       
$login mysql_escape_string($login);  
       
$passw mysql_escape_string($passw); 
       
$passw md5($passw); 
     
         
$query "SELECT * FROM ".$prefix."_users WHERE UserLogin = '{$login}' AND UserPassword = '{$passw}'"
           
         
$result $db->sql_query($query); 
         
$numrows $db->sql_numrows($result); 
         
$row $db->sql_fetchrow($result); 
   
         if(
$numrows != 0){ 
       
        
$id_user  $row['Uid']; 
        
$id_login  htmlspecialchars($row['UserLogin']); 
        
$UserSkin htmlspecialchars($row['UserTheme']); 
        
$id_login2  htmlspecialchars($row['UserName']); 

        
$remote_addr getenv('REMOTE_ADDR');  
        
$db->sql_query("UPDATE ".$prefix."_users SET UserIP = '{$remote_addr}' WHERE Uid={$id_user}"); 
     
        
$_SESSION['UID'] = $id_user;  
        
$_SESSION['User'] = $id_login
        
$_SESSION['Skin'] = $UserSkin
        
$_SESSION['NIK_NAME'] = $id_login2

      
        if(
$_POST['Act']){$Act $_POST['Act'];}else{$Act "Home";} //переадресация на страницу откуда залогинились
       
        
header ("Location: ?Act=$Act"); 
         
         } else {  
          
          print 
"<table width=\"98%\" border=\"0\" cellspacing=\"1\" cellpadding=\"3\" bgcolor=\"red\"><tr><th><font color=\"red\"><b>ERROR</b></font></th></tr> 
                 <tr><td class=\"bgcolor1\"><br/><div align=\"center\"><b>Password or login is incorrect.</b><br></div><br> 
                 </td></tr></table>"
; return;  
         } 
        
    } 
?>     

  Ответить  
 
 автор: Root   (27.12.2008 в 23:22)   письмо автору
 
   для: gurza   (27.12.2008 в 23:06)
 

да, правильно.

P.S.
после md5 вряд ли в $passw какие-то инъекции останутся :-)

  Ответить  
 
 автор: gurza   (27.12.2008 в 23:30)   письмо автору
 
   для: Root   (27.12.2008 в 23:22)
 

спасибо

  Ответить  
 
 автор: Trianon   (27.12.2008 в 23:53)   письмо автору
 
   для: Root   (27.12.2008 в 23:22)
 

чего правильно?
А если магические кавычки отключены, кто будет присваивать значения переменным $passw и $login ?
А насчет md5 - так искажение данных не после вызова md5 произойдет, а до него.

  Ответить  
 
 автор: Root   (28.12.2008 в 00:06)   письмо автору
 
   для: Trianon   (27.12.2008 в 23:53)
 

>чего правильно?

понял правильно, ну или почти..

>А если магические кавычки отключены, кто будет присваивать значения переменным $passw и $login ? ...

тут я не доглядел.

  Ответить  
 
 автор: gurza   (28.12.2008 в 00:37)   письмо автору
 
   для: Trianon   (27.12.2008 в 23:53)
 

Я так понимаю надо так переписать

if( get_magic_quotes_gpc() )  
       {  
       $passw = stripslashes($_POST['UserPassword']);  
       $login = stripslashes($_POST['UserLogin']);   
       } else{

       $login = mysql_escape_string($_POST['UserLogin']); 
       $passw = mysql_escape_string($_POST['UserPassword']);   
   }
       $passw = md5($passw);  

  Ответить  
 
 автор: Trianon   (28.12.2008 в 00:54)   письмо автору
 
   для: gurza   (28.12.2008 в 00:37)
 

Бред.
mysql_escape_string вообще не имеет отношения к получению POST-данных.
точно также как get_magic_quotes_gpc и stripslashes не имеет отношения к mysql_query.
Это два разных, совершенно независимых шага.
И md5() по идее должен стоять ровнехонько между этими шагами.

  Ответить  
 
 автор: gurza   (28.12.2008 в 01:14)   письмо автору
 
   для: Trianon   (28.12.2008 в 00:54)
 

тогда пожалуйста напишите как должно быть

  Ответить  
 
 автор: Root   (28.12.2008 в 12:12)   письмо автору
 
   для: gurza   (28.12.2008 в 01:14)
 

<?php  
if (!defined("DB")) die("Illegal File Access");  

    global 
$prefix$db;  
    
    if ( isset( 
$_POST['sub'] ) ) //а не то, что у Вас там..
    
{
        
$login = isset( $_POST['UserLogin'] ) ? $_POST['UserLogin'] : '';
        
$passw = isset( $_POST['UserPassword'] ) ? $_POST['UserPassword'] : '';
        
//upd.
        //Можно также проверить заполнены ли все поля.
        
        
if( get_magic_quotes_gpc() )  
        {
            
$passw stripslashes$passw );  
            
$login stripslashes$login );
            
//а ещё можно пройтись по массивам
            //$_GET, $_POST, $_COOKIE ..
            //функцией и убрать все слеши.   
        
}
        
$passw md5($passw);

        
$query "SELECT * FROM " $prefix "_users 
                    WHERE UserLogin = '" 
mysql_escape_string$login ). "' 
                    AND UserPassword = '" 
mysql_escape_string$passw ) . "'";
        
//1. Обработка $passw функцией mysql_escape_string в данном случае избыточная,
        //но Вы должны запомнить, что все строки перед занесением в базу
        //обрабатываются mysql_escape_string!
        //2. В классе $db нет метода escape?

        
$result $db->sql_query($query);
        
//$numrows = $db->sql_numrows($result);
        //зачем переменную создавать?

        //$row = $db->sql_fetchrow($result);
        //а если $numrows == 0?

        
if( $db->sql_numrows($result) != )
        {  
            
$row $db->sql_fetchrow($result);
            
//$id_user    = $row['Uid'];  
            //$id_login    = htmlspecialchars( $row['UserLogin'] );  
            //$UserSkin    = htmlspecialchars( $row['UserTheme'] );  
            //$id_login2    = htmlspecialchars( $row['UserName'] );
            //
            //Написал же выше когда нужна htmlspecialchars..
    
            
$remote_addr getenv('REMOTE_ADDR');
            
//вопрос на засыпку:
            //А Вы уверены что тут($remote_addr) кроме ip адреса ничего не будет?
            //..что делать с $remote_addr думайте сами

            
$db->sql_query"UPDATE " $prefix "_users 
                            SET UserIP = '" 
$remote_addr "' 
                            WHERE Uid= " 
$row['Uid'] );  
            
            
$_SESSION['UID'] = $row['Uid'];   
            
$_SESSION['User'] = $row['UserLogin'];  
            
$_SESSION['Skin'] = $row['UserTheme'];  
            
$_SESSION['NIK_NAME'] = $row['UserName'];  

            
$Act = isset( $_POST['Act'] ) ? $_POST['Act'] : "Home";
            
            
header ("Location: ?Act=$Act");
            
//куда Location???
        
}
        else
        {
?>
<table width="98%" border="0" cellspacing="1" cellpadding="3" bgcolor="red">
    <tr><th><font color="red"><b>ERROR</b></font></th></tr>  
    <tr><td class="bgcolor1"><br/><div align="center">
    <b>Password or login is incorrect.</b><br></div><br>  
</td></tr></table>
<?php 
            
return;//куда?
        
}
    }
?>

  Ответить  
 
 автор: gurza   (28.12.2008 в 15:12)   письмо автору
 
   для: Root   (28.12.2008 в 12:12)
 

Спасибо теперь понятненько

  Ответить  
 
 автор: gurza   (28.12.2008 в 16:30)   письмо автору
 
   для: Root   (28.12.2008 в 12:12)
 

Автор: Root (28.12.2008 в 12:12)
что делать с $remote_addr думайте сами

решил прогнать ир через

 $remote_addr = getenv('REMOTE_ADDR'); 
 $ip = ip2long($remote_addr);

  Ответить  
 
 автор: Root   (28.12.2008 в 16:49)   письмо автору
 
   для: gurza   (28.12.2008 в 16:30)
 

ip2long странная штука..
В мануале написано:
"Returns the IPv4 address or FALSE if ip_address is invalid." и пример
<?php
$ip   
gethostbyname('www.example.com');
$long ip2long($ip);

if (
$long == -|| $long === FALSE) {
    echo 
'Invalid IP, please try again';
} else {
    echo 
$ip   "\n";           // 192.0.34.166
    
echo $long "\n";           // -1073732954
    
printf("%u\n"ip2long($ip)); // 3221234342
}
?>

но не всё так просто..
<?php
for ($i=0$i<=255$i++)
{
    
$ip '127.0.0.1' chr($i). "sql injection";
    
$long ip2long$ip );
    echo (
$long == -|| $long === FALSE) ?
        
'Invalid IP, please try again, IP - ' $ip '<br />' :
        
'Valid IP - ' $ip  '<br />';
}

  Ответить  
 
 автор: gurza   (28.12.2008 в 18:36)   письмо автору
 
   для: Root   (28.12.2008 в 16:49)
 

Так что не стоит использовать функцию ip2long?

  Ответить  
 
 автор: Root   (29.12.2008 в 13:55)   письмо автору
 
   для: gurza   (28.12.2008 в 18:36)
 

если хотите её использовать, то проверяйте также длину строки.

  Ответить  
 
 автор: AcidTrash   (27.12.2008 в 23:30)   письмо автору
 
   для: gurza   (27.12.2008 в 23:06)
 

$passw = mysql_escape_string($passw);
Зачем? Если вы дальше используете функцию хеширования?

  Ответить  
 
 автор: gurza   (27.12.2008 в 23:33)   письмо автору
 
   для: AcidTrash   (27.12.2008 в 23:30)
 

Понял уже просто смотрел как пример слаед цмс :)

  Ответить  
 
 автор: cheops   (28.12.2008 в 15:42)   письмо автору
 
   для: Root   (27.12.2008 в 16:30)
 

>надеятся на магические кавычки нечего, особенно после вот этого -> PHP 5.2.7 has been removed from distribution :-)
Дело не в надежде, а в том, что мы вынуждены в коде учитывать сервера, как с включеными магическими кавычками, так и с отключенными, и даже после отмены ситуация не изменится - сервера с включенными и отключенными магическими кавычками будут оставаться, а у нас в коде появится ещё один геморрой в виде
<?php
  
if(!function_exists('get_magic_quotes_gpc'))
  {
    function 
get_magic_quotes_gpc()
    {
      return 
false;
    }
  }
?>
который будет учитывать сервера, где функции get_magic_quotes_gpc() нет.

  Ответить  
 
 автор: Root   (28.12.2008 в 16:11)   письмо автору
 
   для: cheops   (28.12.2008 в 15:42)
 

>у нас в коде появится ещё один геморрой в виде ...

геморрой уже есть. Вот мой :-) :
<?php
if( get_magic_quotes_gpc() ) 
{
    
$input = array( &$_GET, &$_POST, &$_COOKIE );
    while( list( 
$k,$v ) = each$input ) )
    {
        foreach( 
$v as $key => $val 
        {
            if( !
is_array$val ) ) 
            {
                
$input[$k][$key] = stripslashes$val );
                continue;
            }
            
$input[] =& $input[$k][$key];
        }
    }
    unset( 
$input );    
}
?>

а станет
<?php
if( phpversion() < '6.0.0' && get_magic_quotes_gpc() )
...

  Ответить  
 
 автор: Trianon   (28.12.2008 в 16:12)   письмо автору
 
   для: cheops   (28.12.2008 в 15:42)
 

Функция get_magic_quotes_gpc() останется. Просто она в любом случае будет возвращать false.

  Ответить  
 
 автор: cheops   (29.12.2008 в 14:11)   письмо автору
 
   для: Trianon   (28.12.2008 в 16:12)
 

Надеюсь, а то часть дистрибутивов PHP 6 (правда для разработчиков) уже выходила без неё.

  Ответить  
 
 автор: Рома   (28.12.2008 в 02:47)   письмо автору
 
   для: gurza   (27.12.2008 в 02:21)
 

в шестой версии php магические кавычки отменят.

  Ответить  
 
 автор: cheops   (28.12.2008 в 15:38)   письмо автору
 
   для: gurza   (27.12.2008 в 02:21)
 

>обязательно так
>
 
><?php  
>  if (!get_magic_quotes_gpc())  
>  {  
>    
$author mysql_escape_string($author);  
>    
$pswrd mysql_escape_string($pswrd);  
>  }  
>
?>  
>

>или так тоже будет работать корректно?
>

>
><?php  
>     $author mysql_escape_string($author);  
>    
$pswrd mysql_escape_string($pswrd);  
>  
>
?>  
>

Нет, не корректно, если магические кавычки включены - можете два раза заслешить спец-символы. Придется использовать get_magic_quotes_gpc(), и даже когда её полностью выведут из PHP придется её ещё долго самостоятельно писать, чтобы обеспечить совместимость с более ранними версиями PHP.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования