Рейтинг@Mail.ru
 





Не радуйтесь. Нет тут видеоуроков. Нет и не будет.

Вернее есть один, для примера. Для того, что бы Вы поняли, что видеоуроки - это жуткое зло, хуже придумать просто невозможно.
Потому что:
1. Они лишают обучающегося возможности думать, анализировать и влиять на процесс.
2. Самое главное. Все допущенные в курсе ошибки остаются в нем навсегда.

Вот тут есть более развернутый обзор пагубного влияния таких курсов на незакаленные умы начинающих пограммистов.

Если Вас еще не коснулась эта зараза, сей раздел можно пропустить, так как он может оказаться сложным для понимания. А самое главное - совершенно неинформативным.
Полезным он будет для тех, кто решил, что овладел премудростями PHP, посмотрев пару мультиков а'ля "Профессиональный сайт за один день".


Я скачал первый попавшийся, для того, чтобы показать в действии насколько много ляпов можно допустить в пятиминутном видеокурсе.

Приступим к вскрытию.

Первое, что бросилось в глаза - дата выпуска скрипта.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php


    
/* + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 
    +         Название: | PHPru_Auth                             + 
    + ---------------------------------------------------------- +  
    +           Версия: | 1.0                                    + 
    +        Стоимость: | бесплатный скрипт                      + 
    +       Требования: | PHP4, sendmail                         + 
    +        Платформа: | любая                                  + 
    +             Язык: | русский                                + 
    +            Автор: | Alex (http://www.phpru.net)            + 
    +   Copyright 2003: | PHPru.net™ - All Rights Reserved.      + 
    + ---------------------------------------------------------- +  
    +           Создан: | 11 марта 2003                          + 
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + */  

#######################################################################


То есть на полном серьёзе нам втюхивают скрипт 7-ми летней давности. За 7 лет настолько много всего изменилось, что после этой строчки можно дальше не читать вообще ничего. А не то что использовать это на боевом сайте.
Продолжаем.

1
2
3
4
5
6

session_name
("ADMIN_SESS"); 
session_start(); 
session_register("access","no_access");
Не так сейчас регистрируются сессионные переменные. Это отголоски самых первых - обкаточных версий языка php4. Вот так это нужно делать:
1
2
3
4
5
6
7

    session_start
(); 

    
$_SESSION['access']    = NULL
    
$_SESSION['no_access'] = NULL;

Дальше.
1
2
3
4

include ('config.inc');

Тут вообще отдельная история. В скрипт подключается текстовый! файл конфигурации. Да, попытка защитить информацию есть, через .htaccess Но что будет, если по чьей-нибудь оплошности его не окажется в каталоге?
Стоит набрать в адресной строке это http://test1.ru/secret/config.inc и вся конфига на ладони.
А что в ней:
<?
$SERVER = 'test1.ru'; // замените на имя Вашего сервера (ВАЖНО! без http:// )
$LOGIN = "admin"; // не забудьте поменять
$PASSWORD = "admin"; // не забудьте поменять
$ERROR = "<CENTER><BR><FONT COLOR=RED><B>Неверный логин или пароль.<BR>ДОСТУП  ЗАКРЫТ!...";
$MAIL = "admin@ruseller.com"; // замените на свое мыло
?>

А в ней открытые, незашифрованные аутентификационные данные. Берите люди добрые.
Вопрос. Почему, коль скоро этот код исполняемый, не сделать расширение файла .php? Тогда никаких проблем с защитой информации, содержимое файла получить почти невозможно.

Дальше пошли.
1
2
3
4

$ip 
getenv("REMOTE_ADDR"); //ip посетителя


Не всегда ip находится в REMOTE_ADDR. Иногда в HTTP_X_FORWARDED_FOR к примеру. Или в HTTP_X_FORWARDED или HTTP_FORWARDED_FOR... Это, вообще-то, нужно сначала уточнить на хостинге, потом уже использовать. Или хотя бы сделать так:
1
2
3
4
5

   
if(($ip @$_SERVER['HTTP_X_FORWARDED_FOR']) === null
      
$ip =  $_SERVER['REMOTE_ADDR'];
Ну и с другими также.
Кроме того, зачем гонять функцию getenv(), если можно сразу обратиться к нужному элементу массива $_SERVER?

Поехали дальше.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

    
if (!ereg("$SERVER",$host)) 
        { 
            if (isset(
$access)) 
                
$access++; 
            else 
                
$access 1
            if ((
$access == 1) or ($access == 10)) 
            { 
SendEmail($ip,$br,$ref,$access); } 
            echo 
"<BR><BR><CENTER><B><P><FONT COLOR=RED>Доступ закрыт!<BR>
                  Вход только через <A HREF='"
.$SERVER."'>".$SERVER.'</A></BODY></HTML>'
            exit; 
        }
Первое. Функция ereg() имеет статус deprecated, то есть не рекомендовано к применению. В последующих версиях она поддерживаться не будет. Это все из-за древней версии скрипта (никаких претензий автору, а вот тот, кто делал урок, должен бы это знать)
Второе. Зачем "$SERVER" в кавычках? Это снижает читабельность и тормозит процесс.
Третье. Переменные зарегистрированы в массиве $GLOBALS с помощью session_register(), что подразумевает включенную диррективу register_globals, а это дырка.
И вообще, для чего вообще там регулярка? Проверку на соответствие можно осуществить и просто, не рискуя, что может пройти что-то незапланированное.
Вот так это должно выглядеть:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php

    
if(strpos($SERVER$_SERVER["SERVER_NAME"]) !== false
    {  
        if (!empty(
$_SESSION['access']))  
            
$_SESSION['access']++;  
        else  
            
$_SESSION['access'] = 1;  

        if (
$_SESSION['access'] == or $_SESSION['access'] == 10)  
            
SendEmail($ip,$br,$ref,$access);  
             
            echo 
"<BR><BR><CENTER><B><P><FONT COLOR=RED>Доступ закрыт!<BR> 
                  Вход только через <A HREF='http://"
.$SERVER."'>".$SERVER.'</A></BODY></HTML>';  
            exit;  
    }


Продолжаем движение.
1
2
3
4
5
6
7
8
9
10
11
12
13
14

if (isset($out)) 
    { 
        
session_destroy(); 
        
session_unset(); 
        unset(
$out); 
?> 
<!-- после выхода редирект на главную страницу --> 
<script language="JavaScript">window.location="http://<?=$SERVER?>"</script> 
<? 
        
exit; 
    }

Позвольте полюбопытствовать, откуда у нас переменная $out? Нигде ни пол-слова небыло сказано, что нужно включить диррективу register_globals Делать этого правда нельзя ни в коем случае, так как это дыра.
Эту переменную, кстати, можно и не уничтожать, не мешает она ни кому. А вот с сессией поступают обычно наоборот.
И перенаправление посредством js - совсем моветон. А если он отключен?
Вот так корректно:
1
2
3
4
5
6
7
8
9
10
11
12

/* выход, уничтожение сессии */  
if (isset($_GET['out']))  
    {  
        
session_unset(); 
        
session_destroy(); 
// редирект на главную страницу 
        
header('location: http://'$SERVER);  
        exit; 
    } 


Продолжаем разговор.
Это зачем? Это уже было выше по коду.
1
2
3
4

session_register
("sess_login","sess_pass");


Еще дальше.
1
2
3
4
5
6
7
8
9

if (isset($admin)) 

    
$sess_login md5(trim($login));  
    
$sess_pass md5(trim($password)); 
    
ValidPass($sess_login,$sess_pass); 
}
Улыбнуло. Храним мы данные значит в открытом виде. И в текстовом файле. А вот в сессию (которая достаточно надежно скрыта) пишем хэш. И сами же с ним потом работаем. Прячем данные от собственного скрипта, а хакеру - на блюдечке. Бей своих, чтоб чужие боялись. )))

Ну про глобальные переменные уже не стоит говорить.

Ниже смотрим.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

    
if (isset($no_access)) 
            { 
                
$no_access++; 
                if (
$no_access == 4
                    
SendEmail($ip$br$ref$access); 
                if (
$no_access 4
                    
ShowAdmin(); 
            } 
    else 
            { 
                
$no_access 1
                
ShowAdmin(); 
            }


Тут, если честно, разбираться лень в логике. Что-то там считается (попытки взлома) и если не так - шлем письмо. Может быть и пошло бы, но опять глобальные переменные.

Ниже вроде особо ничего страшного, если не брать во внимание, что почта формируется с нарушениями. Ни о каком RFC даже и речи нет.

Так что вот. Практически в каждой строчке ляп.
А самое главное - ведь не исправить теперь этого. Потому что курс пошел по рукам. Даже если исправить ляпы в новой версии, тут (и у тех, кто успел скачать) этот срам будет жить вечно.

А посему мы не планируем выпуска видеокурсов. Наши курсы тоже не идеальны, там тоже есть ляпы. Но мы их постоянно (с Вашей помощью) находим и исправляем.

За что отдельное спасибо. Задавайте побольше вопросов - будет толк. И для Вас и для курсов.

А если интересно дальше - добро пожаловать на разбор самых популярных полетов видеокурсов Жени Попова.