За последние 24 часа нас посетили 16840 программистов и 1646 роботов. Сейчас ищут 1020 программистов ...

Безопастность содержимого php скрипта!

Тема в разделе "PHP для новичков", создана пользователем Naykon, 15 ноя 2015.

  1. Naykon

    Naykon Активный пользователь

    С нами с:
    15 ноя 2015
    Сообщения:
    65
    Симпатии:
    0
    Здравствуйте, скажите пожалуйста есть php скрипт

    Код (PHP):
    1. <?php 
    2. // Данные
    3. $ftphost    = '127.0.0.1';                // Адрес FTP сервера
    4. $ftpport    = '21';                        // Порт FTP серверар
    5. $ftpuser    = 'user';                    // Пользователь FTP
    6. $ftppasswd    = 'password';                // Его пароль
    7.  
    8. // Папка, которую нужно выводить
    9. $folder        = '/addons/sourcemod/logs';
    10.  
    11. // Первые буквы файлов, которые можно выводить
    12. $prepend    = array(
    13.     'errors_',
    14.     'L',
    15. );
    16.  
    17. // Запрещенные файлы (файлы, в которых имеются такие буквы)
    18. $denyed        = array(
    19.     'vip',
    20.     'txt'
    21. );
    22.  
    23. // Отключим ошибки =)
    24.  
    25. /**
    26.  * Системный класс приложения
    27.  * @package Скрипт вывода файлов с FTP
    28.  * @author Урих Александр <urichalex@mail.ru>
    29.  * @link http://craft-soft.ru Команда разработчиков CraftSoft
    30.  */
    31.  
    32. class System {
    33.     
    34.     private $ftphost;
    35.     private $ftpport;
    36.     private $ftpuser;
    37.     private $ftppasswd;
    38.     private $logfolder;
    39.     private $res;
    40.  
    41.     /**
    42.      * Параметры для подключения к FTP
    43.      * @param string $ftphost Адрес FTP
    44.      * @param string $ftpuser Логин пользователя FTP
    45.      * @param string $ftppasswd Пароль
    46.      * @param string $ftpport Порт
    47.      * @param string $logfolder Папка, из которой брать файлы
    48.      */
    49.     public function __construct($ftphost, $ftpuser, $ftppasswd, $ftpport, $logfolder) {
    50.         $this->ftphost = $ftphost;
    51.         $this->ftpuser = $ftpuser;
    52.         $this->ftppasswd = $ftppasswd;
    53.         $this->ftpport = $ftpport;
    54.         $this->logfolder = $logfolder;
    55.         
    56.         $this->res = ftp_connect($this->ftphost, $this->ftpport);
    57.         $login = ftp_login($this->res, $this->ftpuser, $this->ftppasswd);
    58.         
    59.         if(!$this->res || !$login)
    60.         {
    61.             $this->res = FALSE;
    62.         }
    63.         ftp_chdir($this->res, $this->logfolder);
    64.     }
    65.     
    66.     public function __destruct()
    67.     {
    68.         ftp_close($this->res);
    69.     }
    70.     
    71.     /**
    72.      * Получение списка файлов
    73.      * @param string $allowed Разрешенные префиксы
    74.      * @return array Список файлов массивом
    75.      */
    76.     public function getFiles($prepend, $denyed)
    77.     {
    78.         // Получим список файлов с FTP
    79.         $files = $this->listFiles();
    80.         
    81.         // Если файлы есть, возвращаем их
    82.         if($files !== FALSE)
    83.         {
    84.             $return = array();
    85.             foreach($files as $file)
    86.             {
    87.                 $file = basename($file);
    88.                 if($this->check($file, $prepend, TRUE) || $this->check($file, $denyed)) continue;
    89.                 $return[] = $file;
    90.             }
    91.         }
    92.         return $return;
    93.     }
    94.     
    95.     /**
    96.      * Получение файла на скачивание
    97.      * @param string $file Им файла
    98.      */
    99.     public function getFile($file)
    100.     {
    101.         $content = file_get_contents(
    102.             'ftp://'.$this->ftpuser.':'.$this->ftppasswd.'@'.$this->ftphost.'/'.$this->logfolder.'/'.$file
    103.         );
    104.         
    105.         if(!$content)
    106.             return FALSE;
    107.  
    108.         $this->sendFile($file, $content, 'application/download');
    109.     }
    110.     
    111.     private function check($string, $pattern, $prepend = FALSE)
    112.     {
    113.         if(empty($pattern))
    114.             return FALSE;
    115.         if($prepend)
    116.         {
    117.             foreach($pattern as $p)
    118.             {
    119.                 $pr = substr($string, 0, strlen($p));
    120.                 if($pr === $p)
    121.                     return FALSE;
    122.             }
    123.             return TRUE;
    124.         }
    125.         
    126.         else
    127.         {
    128.             foreach($pattern as $p)
    129.             {
    130.                 if(strpos($string, $p) !== FALSE)
    131.                     return TRUE;
    132.             }
    133.         }
    134.         return FALSE;
    135.     }
    136.  
    137.     /**
    138.      * Получение списка файлов с FTP
    139.      * @return array Массив с фафлами
    140.      */
    141.     private function listFiles()
    142.     {
    143.         return ftp_nlist($this->res, '.');
    144.     }
    145.     
    146.     /**
    147.      * Отдает файл по содержимому
    148.      * @param type $fileName Имя файла
    149.      * @param type $content Содержимое файла
    150.      * @param type $mimeType MINE тип файла
    151.      */
    152.     private function sendFile($fileName,$content,$mimeType='text/plain')
    153.     {
    154.         $fileSize=(function_exists('mb_strlen') ? mb_strlen($content,'8bit') : strlen($content));
    155.         $contentStart=0;
    156.         $contentEnd=$fileSize-1;
    157.  
    158.         $length=$contentEnd-$contentStart+1;
    159.         header('HTTP/1.1 200 OK');
    160.         header('Pragma: public');
    161.         header('Expires: 0');
    162.         header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    163.         header("Content-Type: $mimeType");
    164.         header('Content-Length: '.$length);
    165.         header("Content-Disposition: attachment; filename=\"$fileName\"");
    166.         header('Content-Transfer-Encoding: binary');
    167.         $content=function_exists('mb_substr') ? mb_substr($content,$contentStart,$length) : substr($content,$contentStart,$length);
    168.  
    169.         echo $content;
    170.         exit();
    171.     }
    172. }
    173.  
    174.  
    175. $data = new System($ftphost, $ftpuser, $ftppasswd, $ftpport, $folder);
    176.  
    177. if(isset($_GET['file']))
    178.     $data->getFile($_GET['file']);
    179.  
    180. ?>
    181. <!DOCTYPE html>
    182. <html lang="ru">
    183.     <head>
    184.         <meta charset="utf-8" />
    185.         <title>Скачать файлы</title>
    186.         <style type="text/css">
    187.             table {
    188.                 width: 100%
    189.             }
    190.             td {
    191.                 padding: 7px;
    192.                 border: 1px solid #c1c1c1
    193.             }
    194.             .container {
    195.                 width: 500px;
    196.                 margin: 20px auto 0 auto;
    197.             }
    198.         </style>
    199.     </head>
    200.     <body>
    201.         <div class="container">
    202.             <h3>Скачать файлы</h3>
    203.             <table>
    204.                 <?php foreach($data->getFiles($prepend, $denyed) as $file):?>
    205.                 <tr>
    206.                     <td>
    207.                         [url="?file=<?php echo $file?>"]<?php echo $file?>[/url]
    208.                     </td>
    209.                 </tr>
    210.                 <?php endforeach;?>
    211.             </table>    
    212.         </div>
    213.     </body>
    214. </html>
    Когда запускаешь его (закинув его на сайт www) работает html код.

    Скажите пожалуйста, пользователи могут как-то посмотреть сам php код а не то что он выводит в html ? если да - то как?

    PHP, JavaScript, SQL и другой код пишите внутри тегов
    Код ( (Unknown Language)):
    1. [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
     
  2. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    тупо скачать твой сайт и посмотреть.
     
  3. Naykon

    Naykon Активный пользователь

    С нами с:
    15 ноя 2015
    Сообщения:
    65
    Симпатии:
    0
    это как? т.е если в моем mysite.ru/skript.php - будет мой пароль от FTP то он любой сможет его посмотреть?
     
  4. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    да. Скачать сайт можно легко через PHP а можно программу скачать к примеру "Offline Explorer. "

    Добавлено спустя 2 минуты 6 секунд:
    храни эти файлы в директории которая находится выше от корня сайта.
     
  5. Naykon

    Naykon Активный пользователь

    С нами с:
    15 ноя 2015
    Сообщения:
    65
    Симпатии:
    0
    помогите пожалуйста грамотно разделить html и php часть кода так чтоб не могли украсть мою php часть там где будут важные для меня пароли... Спасибо.

    Добавлено спустя 2 минуты 6 секунд:
    сам код в 1 посту.

    Добавлено спустя 1 минуту 43 секунды:
    Проще говоря как можно защитить утечку данных в скрипте от глаз пользователя (злоумышленника) так чтоб скрипт в то же время нормально работал.?
     
  6. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
     
  7. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    mahmuzar, что за глупость вы говорите? Naykon, украсть php-код вашего сайта можно только взломав ваш FTP или взломав ваш сайт через уязвимость. Простой пользователь (не проф. хакер) этого сделать никак не сможет, они увидят только результат работы
     
  8. Naykon

    Naykon Активный пользователь

    С нами с:
    15 ноя 2015
    Сообщения:
    65
    Симпатии:
    0
    Вы можете на примере моего скрипта из 1 поста сделать так? я еще новичек к сожалению .. сам не осилю.

    я там конимаю папку var\www пользователь уже не видит... видит только папку var\www\html ? Помогите кодом!
     
  9. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Naykon, не слушайте глупости. Любое обращение к php-файлу по протоколу http заставит сервер его запустить. Офлайн-браузеры тоже будут по протоколу http пытаться скачать сайт
     
  10. Naykon

    Naykon Активный пользователь

    С нами с:
    15 ноя 2015
    Сообщения:
    65
    Симпатии:
    0
    Тогда давайте поступим так. Кто считает что легко можно узнать содержимое php файла то прошу привести пример на моем сайте http://194.79.60.34/ftpdownload.php - узнайте с этого файла мой логин и пароль который я там указал в коде PHP. Если сможете это сделать то дайте защиту от этого... Спасибо. =)
     
  11. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    mkramer, а если он скачает сайт?

    Добавлено спустя 23 секунды:
    конечно же через браузер он не сможет увидеть код PHP
     
  12. Naykon

    Naykon Активный пользователь

    С нами с:
    15 ноя 2015
    Сообщения:
    65
    Симпатии:
    0
    По вашему я могу спокойно пользоваться PHP скриптом в 1 посту и не бояться утечки?
     
  13. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Naykon, да, похоже можешь как есть все оставить, пользователь ничего не увидит.
    Что-то я тупанул и не то выложил.

    Добавлено спустя 1 минуту 28 секунд:
    попытка скачать сайт тоже самое что попытка пользователя просмотреть страницу( как говорилось выше) поэтому скрипт выполнится и будет только код разметки. Короче, никакого кода PHP.

    Добавлено спустя 1 минуту 8 секунд:
    Naykon, извини что ввел в заблуждение, но главное тут не дадут этого сделать:)
     
  14. Naykon

    Naykon Активный пользователь

    С нами с:
    15 ноя 2015
    Сообщения:
    65
    Симпатии:
    0
    mahmuzar спасибо тебе за отзывчивость =) Очень приятный коллектив.
     
  15. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Не работает. Говорит что такого файла нет. Как минимум есть опасность: не проверяется принадлежность запрашиваемого пути этой папке. Или я не вижу где проверяется.