[PHP] ЗАДАНИЯ от Krist_ALL

Discussion in 'PHP' started by Krist_ALL, 20 Jun 2009.

  1. Krist_ALL

    Krist_ALL Banned

    Joined:
    14 Jan 2009
    Messages:
    436
    Likes Received:
    193
    Reputations:
    24
    И снова новые задания!
    Пока 3 штуки добавил, потом еще напишу. Продолжаем решать задания)
    Присылайте так-же свои задания, с удовольствием добавлю.
     
    2 people like this.
  2. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    Есть такая форма загрузки картинок на сайт (например в админке, куда вы только что получили доступ через sql-inj):

    PHP:
    <?php
    if ($HTTP_POST_VARS['submit']) {
     if (!
    is_uploaded_file($HTTP_POST_FILES['file']['tmp_name'])) {
        
    $error "You did not upload a file!";
        
    unlink($HTTP_POST_FILES['file']['tmp_name']);
        
    // assign error message, remove uploaded file, redisplay form.
      
    } else {
        
    //a file was uploaded
        
    $maxfilesize=10240;

        if (
    $HTTP_POST_FILES['file']['size'] > $maxfilesize) {
          
    $error "file is too large";
          
    unlink($HTTP_POST_FILES['file']['tmp_name']);
          
    // assign error message, remove uploaded file, redisplay form.
        
    } else {
          if (
    $HTTP_POST_FILES['file']['type'] != "image/gif" AND $HTTP_POST_FILES['file']['type'] != "image/jpeg") { 
            
    $error "This file type is not allowed";
            
    unlink($HTTP_POST_FILES['file']['tmp_name']);
            
    // assign error message, remove uploaded file, redisplay form.
          
    } else {
           
    //File has passed all validation, copy it to the final destination and remove the temporary file:
           
    copy($HTTP_POST_FILES['file']['tmp_name'],"./".$HTTP_POST_FILES['file']['name']);
           
    unlink($HTTP_POST_FILES['file']['tmp_name']);
           print 
    "File has been successfully uploaded!";
           exit;
         }
        } 
      }
    }
    ?>

    <html>
    <head></head>
    <bоdу>
    <form action="<?=$PHP_SELF?>" method="post" enctype="multipart/form-data">
    <?=$error?>
    <br><br>
    Choose a file to upload:<br>
    <input type="file" name="file"><br>
    <input type="submit" name="submit" value="submit">
    </form>
    </bоdу>
    </html>
    URL до скрипта загрузки: http://site.ru/admin/upload.php (просто как пример)

    Задача: Написать скрипт на PHP, загружающий шелл вместо картинки, обойти проверку (т.е. загрузить файл с расширением .php)

    Условия: magic_quotes_gpc=ON, register_globals=OFF

    Форма заливки взята с реально действующего движка.

    Цветным просьба не участвовать, т.к. легко:)
     
  3. L I G A

    L I G A Banned

    Joined:
    27 Jul 2008
    Messages:
    482
    Likes Received:
    380
    Reputations:
    49
    Задание 030
    PHP:
    <?php 
    $a 
    = array('cat','dog','fox'); 
    $b = array('Moscow','London'); 
    $c = array('RED'); 
    $d $b $a $c
    ?>
    в результате мы получим массив :
    Array ( [0] => Moscow [1] => London [2] => fox )
    результат таков потому что у массивов $a,$b,$c есть совпадения в индексах(остались только разные индексы).
    Code:
    $a  имели индексы 0, 1, 2. 
    $b - 0, 1.
    $c - 0.
    поскольку в сложении массив $b стоял первым то его елемнты есть в результирующем массиве $d ну и последний елемент массива $d [2] => fox
    остался потому что неодин из елементов 3-их массивов $a,$b,$c не имел индекс [2]
     
    1 person likes this.
  4. m0nsieur

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

    Joined:
    8 Apr 2008
    Messages:
    223
    Likes Received:
    69
    Reputations:
    10
    Задание 031

    PHP:
    <?php
      
    function cnt_arr($array, &$count 0) {
          foreach (
    $array as $value) {
              if (
    is_array($value)) {
                  
    $count++;
                  
    cnt_arr($value$count);
              } else {
                  return;
              }
          }
      }

      
    $arr = array('1' => array('2' => array('1' => '2')));

      
    $cnt '';
      
    cnt_arr($arr$cnt);
      echo(
    $cnt);

    ?>
    2 Pashkela А я бы просто через tamper data сменил Content-Type: text/plain на Content-Type: image/gif, но можно конечно и самому сформировать :)
    Кстати, из какой это cms?
     
    #104 m0nsieur, 26 Aug 2009
    Last edited: 26 Aug 2009
    1 person likes this.
  5. L I G A

    L I G A Banned

    Joined:
    27 Jul 2008
    Messages:
    482
    Likes Received:
    380
    Reputations:
    49
    Задание 032
    PHP:
    <?php
    function countspec($stroka){
    for(
    $i=0;$i<=strlen($stroka);$i++){
        if(
    $stroka{$i}!==htmlspecialchars($stroka{$i})){
            
    $count++;
        }
      }
     return 
    $count;
    }
    $stroka='<a>';
    echo 
    countspec($stroka);//2 потому как < & >
    ?>
     
  6. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    2 m0nsieur:

    Задача - написать фактически сплойт. Joker-jar только что в ЛС отписал рабочий вариант:)

    Что tamper data - ежу понятно, но тут раздел кодинг. Откуда по вашему сплойты на milw0rm.com берутся? Вот и польза будет

    Тот же сплойт на fckeditor на пыхе

    PS: Речь идет об автоматизации процесса
     
    #106 Pashkela, 26 Aug 2009
    Last edited: 26 Aug 2009
    1 person likes this.
  7. S00pY

    S00pY Active Member

    Joined:
    24 Apr 2007
    Messages:
    91
    Likes Received:
    109
    Reputations:
    21
    Не ахти имхо...
    без флага ENT_QUOTES htmlspecialchars() будет пропускать ОДИНАРНУЮ кавычку,да и вообще она мало спец символов преобразует.... с регуляркой будет правильней наверно...
     
    #107 S00pY, 26 Aug 2009
    Last edited: 26 Aug 2009
  8. L I G A

    L I G A Banned

    Joined:
    27 Jul 2008
    Messages:
    482
    Likes Received:
    380
    Reputations:
    49
    слух,если ты такой умник то напиши с регуляркой и без гемора.
     
  9. S00pY

    S00pY Active Member

    Joined:
    24 Apr 2007
    Messages:
    91
    Likes Received:
    109
    Reputations:
    21
    PHP:
    <?php
    function countspec($stroka){
    $count=0
    for(
    $i=0;$i<=strlen($stroka)-1;$i++){ 
        if(!
    preg_match("/[a-zA-Z0-9]/",$stroka[$i]))
        {
    $count++;}}
    Echo (
    'Спец символов:'.$count);  
    }
    ?>
    Как то так.... ;)
    Не злись... я просто выразил своё мнение)
     
    #109 S00pY, 26 Aug 2009
    Last edited: 26 Aug 2009
    1 person likes this.
  10. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    И у того и у другого ошибка - достаточно просто написать

    $i<strlen($stroka)

    счет длины начинается с единички:)
     
    1 person likes this.
  11. S00pY

    S00pY Active Member

    Joined:
    24 Apr 2007
    Messages:
    91
    Likes Received:
    109
    Reputations:
    21
    Спасибо,исправил.
    PHP:
    <?php
    function countspec($stroka){
    $count=0
    for(
    $i=0;$i<strlen($stroka);$i++){ 
        if(!
    preg_match("/[a-zA-Z0-9]/",$stroka[$i]))
        {
    $count++;}}
    Echo (
    'Спец символов:'.$count);  
    }
    ?>
     
  12. L I G A

    L I G A Banned

    Joined:
    27 Jul 2008
    Messages:
    482
    Likes Received:
    380
    Reputations:
    49
    круто! ,у тебя выйдет в слове ОМГ
    3 спецсимвола.
    откуда ты взял что $stroka массив?ты её перед этим explod'ил?

    htmlspecialchars — Преобразует специальные символы в HTML сущности
    и по моему в данном примере её будет рациональней использовать
     
    #112 L I G A, 26 Aug 2009
    Last edited: 26 Aug 2009
    1 person likes this.
  13. S00pY

    S00pY Active Member

    Joined:
    24 Apr 2007
    Messages:
    91
    Likes Received:
    109
    Reputations:
    21
    Эм можно в рег и русские буквы добавить....
    А №%:?*' htmlspecialchars пропустит

    Насчёт массива возможно я не прав,я не кодер.
    По привычке представляю себе строку как массив char...
     
    #113 S00pY, 26 Aug 2009
    Last edited: 26 Aug 2009
    1 person likes this.
  14. Krist_ALL

    Krist_ALL Banned

    Joined:
    14 Jan 2009
    Messages:
    436
    Likes Received:
    193
    Reputations:
    24
    LIGA,
    PHP:
    <?php 
    function countspec($stroka){ 
    $count=0;  
    for(
    $i=0;$i<=strlen($stroka)-1;$i++){  
        if(!
    preg_match("/[a-zA-Z0-9]/",$stroka[$i])) 
        {
    $count++;}} 
    Echo (
    'Спец символов:'.$count);   
    }

    ?>

    Надо вместо $stroka[$i] , ,$stroka{$i}
     
    1 person likes this.
  15. d_x

    d_x Banned

    Joined:
    25 Mar 2008
    Messages:
    558
    Likes Received:
    650
    Reputations:
    210
    Можно и так и так. Пока что. В PHP6 можно только [$i].

    Другое дело, что функция записывается проще:

    PHP:
    <?php
    function countspec($stroka)

      echo 
    'Спецсимволов: '.preg_match_all('/[^a-zA-Z0-9]/',$stroka,$m);
    }
    ?>
    В регулярку добавьте символы, которые нужно.
     
    #115 d_x, 26 Aug 2009
    Last edited: 26 Aug 2009
    4 people like this.
  16. L I G A

    L I G A Banned

    Joined:
    27 Jul 2008
    Messages:
    482
    Likes Received:
    380
    Reputations:
    49
    это код S00pY, в моем все впорядке.
     
    #116 L I G A, 26 Aug 2009
    Last edited: 26 Aug 2009
    2 people like this.
  17. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    Вот мой вариант этой задачки:

    PHP:
    <?php 
    function countspec($stroka) { 
       
    $count=0;  
       for(
    $i=0;$i<strlen($stroka);$i++) {  
           if(!
    preg_match("#[\sa-zа-я0-9]#i",$stroka{$i})) $count++;
       } 
       Echo (
    'Спец символов:'.$count);
    }

    countspec("Вася Пушкин Loloman !@#$%^&*()-+№");
    ?>
    Пробел не спец символ по идее, его просто надо игнорировать, ну и большие буквы если просто модификатор i ставим и всё

    Но это опять же не учитывая возможных кириллических кодировок и прочих уникодов

    PS: Но самый красивый вариан конечно у d_x двумя постами выше, но с моей регуляркой + его ^ в начале, т.е. так:

    PHP:
    <?php 
    function countspec($stroka
    {  
      echo 
    'Спецсимволов: '.preg_match_all('/[^\sa-zа-я0-9]/i',$stroka,$m); 


    countspec("Вася Пушкин Loloman !@#$%^&*()-+№");
    ?>
     
    #117 Pashkela, 26 Aug 2009
    Last edited: 26 Aug 2009
    1 person likes this.
  18. d_x

    d_x Banned

    Joined:
    25 Mar 2008
    Messages:
    558
    Likes Received:
    650
    Reputations:
    210
    Ради интереса сделал бенчмарк:
    PHP:
    <?php  
    set_time_limit
    (0);

    //моя функция
    function countspec($stroka)

      return 
    preg_match_all('/[^a-zA-Zа-яА-ЯёЁ0-9 ]/',$stroka,$m);
    }

    //функция Pashkela
    function countspec2($stroka) {  
       
    $count=0;   
       for(
    $i=0;$i<strlen($stroka);$i++) {   
           if(!
    preg_match("#[\sa-zа-я0-9]#i",$stroka{$i})) $count++; 
       }  

       return 
    $count;



    //для бенчмарка
    function microtime_float()
    {
        list(
    $usec$sec) = explode(" "microtime());
        return ((float)
    $usec + (float)$sec);
    }


    $m=microtime_float();

    for(
    $i=0;$i<500000;$i++)
    {
      
    countspec('вася пупкин !@#45 траляля');
    }


    $tm=microtime_float()-$m;

    print 
    'd_x: '.$tm.' sec<br>';



    $m=microtime_float();

    for(
    $i=0;$i<500000;$i++)
    {
      
    countspec2('вася пупкин !@#45 траляля');
    }


    $tm=microtime_float()-$m;

    print 
    'Pashkela: '.$tm.' sec<br>';
    ?> 
    Результат:
    Code:
    d_x: 4.36448502541 sec
    Pashkela: 33.2198770046 sec
    
    Моя функция в 7.5 раз быстрее)
     
    1 person likes this.
  19. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    Задание 024
    PHP:
    <?php

         
    function getmicrotime() #функция, засекающая время
         
    {
             
    $time explode(" "microtime());
             return (
    $time[0] + $time[1]);
         }

         
    $time['first']['start'] = getmicrotime(); #время начала первого цикла 

         
    for ($i 0$i 10$i++)
         {
             echo 
    '1php ';
         }

         
    $time['first']['end'] = getmicrotime(); #время окончания первого цикла

         
    $i 0;

         
    $time['second']['start'] = getmicrotime(); #время начала второго цикла

         
    while ($i 10)
         {
             echo 
    'w1';
             
    $i += 1;
         }

         
    $time['second']['end'] = getmicrotime(); #время окончания второго цикла

         
    $time['first']['difference'] = $time['first']['end'] - $time['first']['start']; #время работы первого цикла
         
    $time['second']['difference'] = $time['second']['end'] - $time['second']['start']; #время работы второго цикла
         
    $time['difference'] = $time['first']['difference'] - $time['second']['difference']; #разница во времени между циклами

         
    echo '<br>Первый скрипт: ' $time['first']['difference'] .
             
    '<br>Второй скрипт: ' $time['second']['difference'] .
             
    '<br>Разница: ' $time['difference']; #выводим информацию

    ?>
    Code:
    Первый скрипт: 5.5074691772461E-5
    Второй скрипт: 1.978874206543E-5
    Разница: 3.5285949707031E-5
     
    1 person likes this.
  20. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    Задание 030
    В результате слияния
    PHP:
    <?php 
    $a 
    = array('cat','dog','fox'); 
    $b = array('Moscow','London'); 
    $c = array('RED'); 
    $d $b $a $c
    ?>
    мы получим следующий результат
    PHP:
    Array
    (
        [
    0] => Moscow
        
    [1] => London
        
    [2] => fox
    )
    Неожиданный результат, не правда ли? Скорее всего вы ожидали получить массив
    PHP:
    Array
    (
        [
    0] => Moscow
        
    [1] => London
        
    [2] => cat
        
    [3] => dog
        
    [4] => fox
        
    [5] => RED
    )
    Однако в PHP на этот счет свои правила. При слиятии массивов, в которых содержатся элементы с одинаковыми индексами (ключами), в результирующем массиве останется элемент первого массива. А в приведенном примере элементы массива b имели индексы - 0, 1; массива a - 0, 1, 2; массива c - 1. В итоге мы получили массив с тремя индексами:
    PHP:
    Array
    (
        [
    0] => Moscow
        
    [1] => London
        
    [2] => fox
    )
     
    2 people like this.