Нужно сделать страницу на php

Discussion in 'PHP' started by Ridikh, 22 Jul 2008.

  1. Ridikh

    Ridikh Member

    Joined:
    11 Nov 2007
    Messages:
    69
    Likes Received:
    7
    Reputations:
    0
    Нужно сделать страницу на php, чтобы все исходящие ссылки сделать локальными. На сайте есть 20 длинных ссылок и хочется заменить их.

    например ссылку http://google.ru
    заменить на http://yoursite.ru/out.php?1

    а out.php методом GET получил бы единицу и переадресовал бы на http://google.ru
     
  2. P3L3NG

    P3L3NG Banned

    Joined:
    4 Jun 2008
    Messages:
    175
    Likes Received:
    204
    Reputations:
    11
    содержание out.php
    PHP:
    <?php
    $link 
    $_GET['link'];
    if (
    $link 1)
    {
    header("Location: http://google.ru);
    }
    if (
    $link = 2)
    {
    header("
    Locationhttp://mail.ru);
    }

    ...

    if (
    $link 20)
    {
    header("Location: http://new-anarchy.narod.ru);
    }
    ?>
    твоя страница html должна передавать ссыль туда в переменной link методом GET.
    типа http://yoursite.ru/out.php?link=3
     
    1 person likes this.
  3. 5triker

    5triker Elder - Старейшина

    Joined:
    5 Apr 2007
    Messages:
    62
    Likes Received:
    41
    Reputations:
    1
    имхо так удобней
    PHP:
    <?php 
    $location
    =array (
    '1'=>"http://google.com",
    '2'=>"http://mail.ru",
    ....
    );
    header ("Location: ".$location[$_GET['link']]);
    ?>
    и кстати в if нада писать не = а == , закрывать " в хедере
     
    #3 5triker, 22 Jul 2008
    Last edited: 22 Jul 2008
    1 person likes this.
  4. Ridikh

    Ridikh Member

    Joined:
    11 Nov 2007
    Messages:
    69
    Likes Received:
    7
    Reputations:
    0
    спасибо вам, а можно сделать чтобы он статистику этих переходов считал?
     
  5. 5triker

    5triker Elder - Старейшина

    Joined:
    5 Apr 2007
    Messages:
    62
    Likes Received:
    41
    Reputations:
    1
    PHP:
    $fw=fopen ($_GET['link'],"w+");
    fputs ($fw,file_get_contents($_GET['link'])+1);
    добавь
     
    #5 5triker, 22 Jul 2008
    Last edited: 22 Jul 2008
  6. P3L3NG

    P3L3NG Banned

    Joined:
    4 Jun 2008
    Messages:
    175
    Likes Received:
    204
    Reputations:
    11
    можно)
    сделай например...
    PHP:
    <?php  
    $location
    =array ( 
    '1'=>"http://google.com"
    '2'=>"http://mail.ru"
    .... 
    ); 
    header ("Location: ".$location[$_GET['link']]); 
    $fp fopen("$link.txt","a+");
    fwrite($fp,"0");
    fclose($fp);
    ?> 
    каждый раз будет записываться один байт (оди символ) в файл. (если не хочешь с базами заморачиваться)...

    чтобы вывести статистику юзай функцию:
    PHP:
    $size filesize($file);
    echo 
    $size;
     
  7. 5triker

    5triker Elder - Старейшина

    Joined:
    5 Apr 2007
    Messages:
    62
    Likes Received:
    41
    Reputations:
    1
    зачем етот гемор с размером файла ?
     
  8. Ridikh

    Ridikh Member

    Joined:
    11 Nov 2007
    Messages:
    69
    Likes Received:
    7
    Reputations:
    0
    немного непонял код (
     
  9. 5triker

    5triker Elder - Старейшина

    Joined:
    5 Apr 2007
    Messages:
    62
    Likes Received:
    41
    Reputations:
    1
    читает файл с именем линка прибавляет один записывает в файле получается число заходов по етому линку
    PHP:
    <?php  
    $location
    =array ( 
    '1'=>"http://google.com"
    '2'=>"http://mail.ru"
    .... 
    );
    $perehodi=file_get_contents($_GET['link'])+1;
     
    $fw=fopen ($_GET['link'],"w+"); 
    fputs ($fw,$perehodi); 
    header ("Location: ".$location[$_GET['link']]); 
    ?>
     
  10. SQLHACK

    SQLHACK Остались только слоны

    Joined:
    27 Sep 2006
    Messages:
    437
    Likes Received:
    372
    Reputations:
    407
    А кто нить вообще заботится о безопастности данных советов, советчики блин.
    а если чел запрос сделает к произвольному файлу ?
    Я так думаю этот код просто тупо затрёт любой файл на который ему хватит прав.
    Продумайте код на 100%, если вы ему кого то советуете , тем более перед тем как запостить его на форуме под названием "Безопастность web-интерфейсов"
     
    _________________________
    #10 SQLHACK, 23 Jul 2008
    Last edited: 23 Jul 2008
    1 person likes this.
  11. 5triker

    5triker Elder - Старейшина

    Joined:
    5 Apr 2007
    Messages:
    62
    Likes Received:
    41
    Reputations:
    1
    тс спросил как обезопасить етот скрипт ? или тема называется "ТОЛЬКО безопасные скрипты" ? насколько я вижу , раздел PHP,PERL,Javascript . причем сдесь то безопасен ли этот скрипт ? тс попросил пример - ему дали , дальше это его дело пользоватся им или нет , ему никто ничего не навязывает

    а если нужен безопасный скрипт можно сделать так
    PHP:

    <?php   
    $location
    =array (  
    '1'=>"http://google.com",  
    '2'=>"http://mail.ru",  
    ....  
    );
    $link=intval($_GET['link']);
    if (
    array_search ($link,array_keys($location))===FALSE)
    {die(
    "неправильная ссылка");}
    else
    {
    $perehodi=file_get_contents($_GET['link'])+1
     
    $fw=fopen ($_GET['link'],"w+");  
    fputs ($fw,$perehodi);  
    header ("Location: ".$location[$_GET['link']]);  
    }
    ?>
     
    #11 5triker, 23 Jul 2008
    Last edited: 23 Jul 2008
  12. SQLHACK

    SQLHACK Остались только слоны

    Joined:
    27 Sep 2006
    Messages:
    437
    Likes Received:
    372
    Reputations:
    407
    И как это должно работать , сам то тестил?
    Хотя бы по логике ?
    То есть при линке index.php?link=1 в какой файл будет идти сохранение ?

    Вообщем как то так это должно выглядеть.

    PHP:
    <?php   
    $logfile 
    "/home/stat";
    $ext=".php"
    $location=array (   
    '1'=>"http://google.com",   
    '2'=>"http://mail.ru",  
    ); 
    $link=intval($_GET['link']); 
    if (
    array_search ($link,array_keys($location))===FALSE
    {
        die(
    "неправильная ссылка");

    else 
    {
        if (
    is_file($logfile.$link.$ext))
        {
            if (
    is_writeable($logfile.$link.$ext))
            {                           
                
    $perehodi=file_get_contents($logfile.$link.$ext); 
                if (
    strlen($perehodi)>0)
                {
                    
    $perehodi intval($perehodi)+1;
                }
                else
                {   
                    
    $perehodi =1;                    
                }
                
    $fw=fopen ($logfile.$link.$ext,"w+");   
                
    fputs ($fw,$perehodi); 
                
    fclose ($fw);         
                
    header ("Location: ".$location[$link]);
                die();   
            }
            else
            {
                die(
    "Проверьте права на запись для файла".$logfile.$link.$ext);
            }
        }
        else
        {
            if ((
    $fw=fopen ($logfile.$link.$ext,"w+"))==FALSE)
            {
                die(
    "Проверьте права на запись для файла".$logfile.$link.$ext);
            }    
            else 
            {   
                
    fclose ($fw); 
            }
        }


    ?>
     
    _________________________
    #12 SQLHACK, 23 Jul 2008
    Last edited: 23 Jul 2008
  13. Doom123

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

    Joined:
    11 Nov 2006
    Messages:
    749
    Likes Received:
    244
    Reputations:
    22
    SQLHACK Чувак не парься =)

    PHP:
     $fw=fopen ($logfile.$link.$ext,"a+");
     
    flock($fwLOCK_EX);
     
    $perehodi fread($fw,filesize($logfile.$link.$ext));
     if (
    strlen($perehodi)>0
     { 
        
    $perehodi intval($perehodi)+1
     } 
     else 
     {    
        
    $perehodi =1;                     
     }
     
    ftruncate($fw0);
    fputs ($fw,$perehodi);
    fclose($fw);
    Остольные проверки это на выбор (для красоты ;))
     
    #13 Doom123, 23 Jul 2008
    Last edited: 23 Jul 2008
  14. 5triker

    5triker Elder - Старейшина

    Joined:
    5 Apr 2007
    Messages:
    62
    Likes Received:
    41
    Reputations:
    1
    тестил
    по логике , делает GET['link'] числом ищет в массиве location такой ключ если находит прибавляет 1 в файл , не находит die ()
    сохранит в файл "1"


    и зачем усложнять етим
    PHP:
      if (strlen($perehodi)>0
                { 
                    
    $perehodi intval($perehodi)+1
                } 
                else 
                {    
                    
    $perehodi =1;
    если ето первый переход и файл пустой то пусто+1 то будет все равно 1
     
    #14 5triker, 23 Jul 2008
    Last edited: 23 Jul 2008
  15. SQLHACK

    SQLHACK Остались только слоны

    Joined:
    27 Sep 2006
    Messages:
    437
    Likes Received:
    372
    Reputations:
    407
    я тебе про это
    PHP:
     $fw=fopen ($_GET['link'],"w+");  
    а в начале он на intval проверяется, то есть если я введу 1qasd то будет создан файл 1qasd, и затирания файлов тогда не избежать, к примеру можно юзать, 1/../../../../../etc/passwd, его конечно врядли затрёшь, но это просто пример. таким образом можно затереть любой файл если прав хватит.
     
    _________________________
  16. 5triker

    5triker Elder - Старейшина

    Joined:
    5 Apr 2007
    Messages:
    62
    Likes Received:
    41
    Reputations:
    1
    там я прост забыл поменять $_GET['link'] на $link