Безопасность кода ? Вот сам сурс Seobot

Discussion in 'PHP' started by Adio, 16 Jul 2009.

  1. Adio

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

    Joined:
    23 May 2005
    Messages:
    1,646
    Likes Received:
    148
    Reputations:
    18
    Хотел бы поинтересоваться ибо когда то видел как ламают сайты через поисковик еще давненько.. типа через отображение запроса проводили атака в самом сайте.

    Скачал я какойто скрипт под названием Seobot

    Который отображает сприсо страниц и какой бот посетил

    вот сам seobot



    <?
    if ( strstr($_SERVER['HTTP_USER_AGENT'], 'Yandex') ) { $bot='Yandex';}
    elseif ( strstr($_SERVER['HTTP_USER_AGENT'], 'Googlebot') ) {$bot='Google';}
    elseif ( strstr($_SERVER['HTTP_USER_AGENT'], 'Slurp') ) {$bot='Slurp';}
    elseif ( strstr($_SERVER['HTTP_USER_AGENT'], 'WebCrawler') ) {$bot='WebCrawler';}
    elseif ( strstr($_SERVER['HTTP_USER_AGENT'], 'ZyBorg') ) {$bot='ZyBorg';}
    elseif ( strstr($_SERVER['HTTP_USER_AGENT'], 'google') ) {$bot='Google';}
    elseif ( strstr($_SERVER['HTTP_USER_AGENT'], 'scooter') ) {$bot='AltaVista';}
    elseif ( strstr($_SERVER['HTTP_USER_AGENT'], 'stack') ) {$bot='Rambler';}
    elseif ( strstr($_SERVER['HTTP_USER_AGENT'], 'aport') ) {$bot='Aport';}
    elseif ( strstr($_SERVER['HTTP_USER_AGENT'], 'lycos') ) {$bot='Lycos';}
    elseif ( strstr($_SERVER['HTTP_USER_AGENT'], 'fast') ) {$bot='Fast Search';}
    elseif ( strstr($_SERVER['HTTP_USER_AGENT'], 'rambler') ) {$bot='Rambler';}
    if($bot !="") {
    $ip = $REMOTE_ADDR;
    $date = date("d.m.Y");
    $home = $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    $fh = fopen('sebot', "r");
    $fil = fread($fh, filesize('sebot'));
    fclose($fh);
    $con=$date.":::".$bot.":::".$ip.":::".$home."::: \r\n".$fil;
    $file=fopen("sebot","w");
    fputs($file, $con);
    fclose($file);
    }
    ?>


    Хотел просить безопасный ли этот код. т.е если пооделать запрост и он отобразит к примеру ковычки или инлюд какой или xss ?


    Может поставить фильтрацию ? но там же надо что бы слеши были... а я опять в этих Регулярках ничо не понимаю..

    Ну что бы все пропускало кроме кавычек или еще там чего ..

    Вообщем просто хочу совета.
     
  2. n0reply

    n0reply New Member

    Joined:
    31 Mar 2009
    Messages:
    14
    Likes Received:
    1
    Reputations:
    0
    В данном коде, если включен register_globals можно перезаписать переменную $bot, тем самым писать что угодно тебе в файл sebot, насколько это опасно решать тебе....

    Чтобы исправить перед первым if'ом напиши $bot = ""; А лучше переписать все через switch case default.
     
    1 person likes this.
  3. Dimi4

    Dimi4 Чайный пакетик

    Joined:
    19 Mar 2007
    Messages:
    750
    Likes Received:
    1,046
    Reputations:
    291
    Неужели?
    Можно записать любое содержимое в файл через специально сформированный УРЛ.
    PHP:
    $home $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    $_SERVER['REQUEST_URI'] - никак не фильтруется, подделать очень просто:

     
    2 people like this.
  4. FireFenix

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

    Joined:
    3 Jun 2009
    Messages:
    390
    Likes Received:
    115
    Reputations:
    23
    Записать в файл можно всё что угодно, но т.к. файл не html и не php, то записанный контент не выполнится (по дефолту) => не повредит ничему
     
    #4 FireFenix, 16 Jul 2009
    Last edited: 16 Jul 2009
    1 person likes this.
  5. erihtoney

    erihtoney Member

    Joined:
    3 Mar 2009
    Messages:
    91
    Likes Received:
    73
    Reputations:
    20
    Ну тогда давайте будем позволять пользователю записывать в файл (html), что попало, и попросим чтобы на ачате включили HTML, ибо это "не повредит ничему"
     
    2 people like this.
  6. Dimi4

    Dimi4 Чайный пакетик

    Joined:
    19 Mar 2007
    Messages:
    750
    Likes Received:
    1,046
    Reputations:
    291
    Что значит по дефолту? Откуда ты знаешь какие дефолтные настройки сервака?
    Не надо быть столь увереным. Если включен модуль mod_mime то пхп скрипт с любим расширением выполнится как пхп :)
     
  7. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    + к этому локальный инклуд... или вдруг есть скрипт который читает этот лог, как минимум раскрытие информации о сервере )
     
    _________________________
    1 person likes this.
  8. L I G A

    L I G A Banned

    Joined:
    27 Jul 2008
    Messages:
    482
    Likes Received:
    380
    Reputations:
    49
    эмм,продимонстрируй плз я лично не догадуюсь,вот если б код имел такой вид:
    PHP:
    $xek=$_GET['tratata']);
    echo 
    $xek;
    то

    PHP:
    ?tratata=phpinfo();
    вобщем с интересом взгляну,да и новое для себя узнаю.
    и по сабжу:
    вышеприведенный скрипт будет работать если
    регистр_глобал он
    потому как:
    $ip = $REMOTE_ADDR;
     
    #8 L I G A, 16 Jul 2009
    Last edited: 16 Jul 2009
    2 people like this.
  9. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    Code:
    http://evilsite.ru/evilscript.php?<?phpinfo()?>
    В файл запишется
    Code:
    evilsite.ruevilscript.php?<?phpinfo()?>
     
    #9 mailbrush, 16 Jul 2009
    Last edited: 16 Jul 2009
    2 people like this.
  10. Spyder

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

    Joined:
    9 Oct 2006
    Messages:
    1,388
    Likes Received:
    1,209
    Reputations:
    475
    L I G A, ппц, бред ты написал
    во-первых
    ну и что тебе это даст? выведет надпись "phpinfo()" ?))
    Вовторых Димич говорит про $_SERVER['REQUEST_URI']; , её изменить то проблем не возникнет
     
    1 person likes this.
  11. L I G A

    L I G A Banned

    Joined:
    27 Jul 2008
    Messages:
    482
    Likes Received:
    380
    Reputations:
    49
    Spyder да ты прав как то не заметил,
    там надо:
    <?php
    $xek=eval($_GET['tratata']);
    echo $xek;
    ?>

    ну да ладно
    а $_SERVER['REQUEST_URI']; выводит путь после ....php? [тут]
    ??? :confused:
     
  12. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    Создай у себя файлик test.php, впиши в него
    PHP:
    evilsite.ruevilscript.php?<?phpinfo()?>
    и открой.
     
  13. Dimi4

    Dimi4 Чайный пакетик

    Joined:
    19 Mar 2007
    Messages:
    750
    Likes Received:
    1,046
    Reputations:
    291
    L I G A, неужели трудно сделать
    PHP:
    echo $_SERVER['REQUEST_URI']; 
    P.S. http://localhost/test3.php?a=b
    /test3.php?a=b
     
    #13 Dimi4, 16 Jul 2009
    Last edited: 16 Jul 2009
    4 people like this.
  14. Adio

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

    Joined:
    23 May 2005
    Messages:
    1,646
    Likes Received:
    148
    Reputations:
    18
    Посоветуйте тогда какой нибуть скрипт для выводе реферов ? т.е я хочу что бы был вывод откуда пришол пользователь или где лазил Бот. Только безопасный если кто знает. Я просто не хочу на сервак ставить все попало что бы потом не окозаться без сайта и данных в 1 прекрасный день ..
     
  15. Adio

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

    Joined:
    23 May 2005
    Messages:
    1,646
    Likes Received:
    148
    Reputations:
    18
  16. Adio

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

    Joined:
    23 May 2005
    Messages:
    1,646
    Likes Received:
    148
    Reputations:
    18
    Вот нашол еще 1 LOG REFFER


    <?php


    // file where referrals are stored, change if you wish
    $file = "refers.txt";

    // if set to 1 IPs will be logged and associated with the URL they were referred by
    $log_ip = 0;

    //////////////////// NO NEED TO EDIT BELOW ////////////////////

    $referer = (!isset($_SERVER['HTTP_REFERER']) || $_SERVER['HTTP_REFERER'] == '') ? 'an unknown url/direct access (typing in URL)' : $_SERVER['HTTP_REFERER'];
    $ip = ($log_ip == 1) ? $_SERVER['REMOTE_ADDR'] : false;
    $time = date('d F Y');
    $user_text = ($log_ip == 1) ? "On {$time} {$ip}" : "On {$time} a user";
    $refer_text = "{$user_text} was referred by {$referer}";
    $fp = fopen($file, 'a');
    fwrite($fp, "{$refer_text}\n");
    fclose($fp);

    ?>

    Этот безопасный ? ..
     
  17. Doom123

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

    Joined:
    11 Nov 2006
    Messages:
    749
    Likes Received:
    244
    Reputations:
    22
    L I G A ммм тот пример что ты дал совсем не в тему =)

    он написал ниже

    тоесть еси в файл будет записан пхп код (а он будет) то ппри обращении к файлу он выполнится
     
  18. Dimi4

    Dimi4 Чайный пакетик

    Joined:
    19 Mar 2007
    Messages:
    750
    Likes Received:
    1,046
    Reputations:
    291
    Зачем новый? Cначала впиши $bot = "";
    И пропусти $_SERVER['REQUEST_URI']; через тот же htmlspecialchars()
     
  19. Adio

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

    Joined:
    23 May 2005
    Messages:
    1,646
    Likes Received:
    148
    Reputations:
    18
    Люди я знаю что вы все знаете. )

    Как быть ?

    Хочу безопасный код. Вы тут пишет что куда и как... и понимаю лиш половину того что вы пишите. и понимаю что он не безопасен. Так как быть ?

    Это как ?

    Спасибо.
     
  20. n0reply

    n0reply New Member

    Joined:
    31 Mar 2009
    Messages:
    14
    Likes Received:
    1
    Reputations:
    0
    Как-то так:
    PHP:
    <?
    $bot "";
    if ( 
    strstr($_SERVER['HTTP_USER_AGENT'], 'Yandex') ) { $bot='Yandex';}
    elseif ( 
    strstr($_SERVER['HTTP_USER_AGENT'], 'Googlebot') ) {$bot='Google';}
    elseif ( 
    strstr($_SERVER['HTTP_USER_AGENT'], 'Slurp') ) {$bot='Slurp';}
    elseif ( 
    strstr($_SERVER['HTTP_USER_AGENT'], 'WebCrawler') ) {$bot='WebCrawler';}
    elseif ( 
    strstr($_SERVER['HTTP_USER_AGENT'], 'ZyBorg') ) {$bot='ZyBorg';}
    elseif ( 
    strstr($_SERVER['HTTP_USER_AGENT'], 'google') ) {$bot='Google';}
    elseif ( 
    strstr($_SERVER['HTTP_USER_AGENT'], 'scooter') ) {$bot='AltaVista';}
    elseif ( 
    strstr($_SERVER['HTTP_USER_AGENT'], 'stack') ) {$bot='Rambler';}
    elseif ( 
    strstr($_SERVER['HTTP_USER_AGENT'], 'aport') ) {$bot='Aport';}
    elseif ( 
    strstr($_SERVER['HTTP_USER_AGENT'], 'lycos') ) {$bot='Lycos';}
    elseif ( 
    strstr($_SERVER['HTTP_USER_AGENT'], 'fast') ) {$bot='Fast Search';}
    elseif ( 
    strstr($_SERVER['HTTP_USER_AGENT'], 'rambler') ) {$bot='Rambler';}
    if(
    $bot !="") {
    $ip $REMOTE_ADDR;
    $date date("d.m.Y");
    $home $_SERVER['HTTP_HOST'] . htmlspecialchars($_SERVER['REQUEST_URI']);
    $fh fopen('sebot'"r");
    $fil fread($fhfilesize('sebot'));
    fclose($fh);
    $con=$date.":::".$bot.":::".$ip.":::".$home."::: \r\n".$fil;
    $file=fopen("sebot","w");
    fputs($file$con);
    fclose($file);
    }
    ?>