[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Для опытных РНР программистов
NewLifeMan
В данный момент я активно работаю над проектом "Alex-School" -- программное обеспечение для школ..
Проект некоммерческий, поэтому вознаграждений обещать не буду..

Я хотел бы попросить опытных ребят протестировать код на наличие бегов и лазеек для взлома.. Сам я учитель нач.классов. Кроме того начинающий программист и, в меру своих познаний в этом деле, старался предусмотреть различные варианты взлома, но всего не учесть..
Поэтому у меня просьба к вам..

Все найденные лазейки опишите здесь.. будем думать над их разрешением.. Я специально вклучил вывод всех ошибок на экран, к тому же все запросы к БД в случае неудачи выдадут сообщение с ошибкой...

Заранее благодарен всем, кто согласится на тестирование проекта



Спустя 41 минута, 41 секунда (16.06.2009 - 21:38) glock18 написал(а):
А войти туда собственно как? или только страничку входа можно посмотреть? smile.gif

Спустя 6 минут, 51 секунда (16.06.2009 - 21:44) kirik написал(а):
А ссылку-то на проект можно? Из подписи project.Alex-School.com - там только поле для логина smile.gif NewLifeMan.com - этот вообще не открылся..

Спустя 15 часов, 19 минут, 40 секунд (17.06.2009 - 13:04) NewLifeMan написал(а):
Ссылка - http://project.alex-school.com/

index.html - страница с формой..
login.html - принимает пароль и логин, проверяет и в случае, если данные совпадают, вы перенаправляетесь на старт.хтмл.. в противном - назад для авторизации..

Задача:
- Различными путями попасть на start.html

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

Через пару дней открою source code, но мне интересно может кто-то сможет без него выявить и помочь исправить бреши в безопасности..


А http://www.newlifeman.com/ работает.. странно..

Спустя 9 минут, 37 секунд (17.06.2009 - 13:14) FatCat написал(а):
Цитата (NewLifeMan @ 17.06.2009 - 14:04)
А http://www.newlifeman.com/ работает.. странно..

В каком браузере?
В Опере открывает белую страницу. Если залезть в сорцы, видно, что страница не пустая, но на дисплее пусто.

Спустя 20 минут, 55 секунд (17.06.2009 - 13:35) NewLifeMan написал(а):
Цитата (FatCat @ 17.06.2009 - 10:14)
В каком браузере?
В Опере открывает белую страницу. Если залезть в сорцы, видно, что страница не пустая, но на дисплее пусто.

Все работает.. просто долго открывается... С сервера много скачивают.. (музыка - вверху ссылка..)



адрес проекта для тестирования - http://project.alex-school.com/

Вообще проект настроен для IE7.. в Safari, Опере и Лисе вообще таблицы стилей не работают (они обрабатываются сервером.. может поэтому).

Спустя 31 минута, 30 секунд (17.06.2009 - 14:06) glock18 написал(а):
Что ж. В случае с sql-injection, а на мой взгляд это единственный тип атаки (DOS атаки не в счет), который можно там проверить сейчас, я не силен. Единственное на что меня хватает, это вставить в строку ', \, /, %, _. rolleyes.gif С ними, кажись, работает smile.gif

Спустя 10 минут, 52 секунды (17.06.2009 - 14:17) NewLifeMan написал(а):
то есть работает..?

У тебя получилось зайти или выудить что-то стоящее из базы? или защита работает..

В коде я каждую входящую переменую проверяю..

Спустя 24 минуты, 18 секунд (17.06.2009 - 14:41) glock18 написал(а):
Я же говорю, что вводил мусор, но все нормально. Странное, конечно, в целом поведение - сначала какая-то страница открывается с ошибкой, потом переходит на логин. В общем то это касается юзабилити, а не безопасности.

Но я уже сказал, что не силен в sql-инъекциях. Тааак... протыкал чуток. Но думаю, что там их нет вовсе.

PS: думаю, формочка маленькая слишком, чтобы развернуться на ней smile.gif Может кто еще скажет, можно ли на эту страницу как-то XSS атаку провести. насколько я знаю нужна возможность редактировать контент этой страницы (типичный пример, любой веб 2.0 проект - блог, форум, соц. сеть и т.п.), но может каким-то зверски крутым хакерам такая возможность не нужна unsure.gif

Спустя 7 минут, 22 секунды (17.06.2009 - 14:49) NewLifeMan написал(а):
Окно, которое появляется - редирект с login.html на индексную...

Скажите, а вы можете порекомендовать кого занающего..?
До офф выхода хотелось бы убрать максимум потенциальных лазеек..

smile.gif

Спустя 4 минуты, 45 секунд (17.06.2009 - 14:53) glock18 написал(а):
Думаю, что большинство лазеек внутри. Форма входа не такая чтобы лазейка smile.gif

Знающего хакера не знаю. Каждый программист в некоторой степени хакер, а каждый хакер в некоторой степени программист. Думаю, здесь подавляющее большинство именно программисты, а степень их "хакерности" я не знаю. Возможно, кто-то из них отпишет когда посмотрит эту тему.

Лично я полагаю, что на данной странице искать уязвимость практически бесполезно. Надо что-то большее.

Спустя 3 минуты, 54 секунды (17.06.2009 - 14:57) glock18 написал(а):
Еще вариант - страница защищена от многократных быстрых вводов пароля?

Есть возможность, подобрать пароль ботом. в зависимости от его сложности за достаточно небольшое время. Если не хотите, чтобы бот зашел, то нужно ограничить это дело. Плюс - это возможность для DOS-атаки, если вы даете возможность вводить пароль хоть 1000 в секунду.

Спустя 1 час, 4 минуты, 42 секунды (17.06.2009 - 16:02) Sylex написал(а):
А тут у тебя прикольно: качай че хочешь smile.gif

http://www.newlifeman.com/files/audio/

нафик сайт.

А по поводу alex-school.

Заметьте ребята, в форме есть encType="multipart/form-data" smile.gif Видать можно грузить файлы, если узнаешь имя biggrin.gif

http://project.alex-school.com/logout.html
существует, видимо для выхода smile.gif

Не знаешь че такое нотайсы, и ловишь откуда пришел пользователь:
Notice: Undefined index: HTTP_REFERER in /home/alexsch/public_html/project/login.html on line 4

Это то, что дает login.html

Структура папочек небольшая

http://project.alex-school.com/admin/
http://project.alex-school.com/css/
http://project.alex-school.com/inc/
http://project.alex-school.com/design/
http://project.alex-school.com/js/

но все редиректится на главную.

Так то че ломать... нифига нету... Ты открывай сайт быстрей - поломаем...

А брутить неохота, зачем...

Спустя 1 минута, 14 секунд (17.06.2009 - 16:03) NewLifeMan написал(а):
Цитата (glock18 @ 17.06.2009 - 11:57)
Еще вариант - страница защищена от многократных быстрых вводов пароля?

Плюс - это возможность для DOS-атаки.

А можно об этом по подробней..


Кстати, почему только форма входа? На индексной странице кроме формы ничего и нет..
Но есть еще две страницы для тестирования - login.html и start.html

В login.html происходит авторизация..

Если она пройдет, то тогда вас перенаправят на start.html
В начале этой станицы (как и всех остальных) подключается спец.модуль (inc/lock.php) происходит проверка пользователя..
Если удастся попасть на нее на прямую, то и все остальные страницы вас пустят..

По моему больше и не требуеться для тестирования..
smile.gif

Спустя 10 минут, 57 секунд (17.06.2009 - 16:14) NewLifeMan написал(а):
зачем брутфорс..

логин - demo
пароль - demo


Спустя 4 минуты, 1 секунда (17.06.2009 - 16:18) glock18 написал(а):
Sylex хорошо разобрал. Очевидно, учитывая, что потратил скорее всего несколько минут.

NewLifeMan, его слушай. он шарит. мне проверять папочки

Цитата
http://project.alex-school.com/admin/
http://project.alex-school.com/css/
http://project.alex-school.com/inc/
http://project.alex-school.com/design/
http://project.alex-school.com/js/


нечем, а ручками, думаю, лень будет любому (разве что несколько самых распространенных папочек - css, inc, js, admin, etc). Хакеры их все простукивают - факт.

Спустя 30 секунд (17.06.2009 - 16:19) NewLifeMan написал(а):
Sylex
Скачивай на здоровье.. Только без Попыток взлома... unsure.gif rolleyes.gif biggrin.gif
Это мой домашний комп, на нем ДЕНВЕР установлен, а доступ к музыке для друзей открыл.. (там больше 5 песен..)

Я все же жду конкретных лазеек ..



==========
Исправил ошибку с "HTTP_REFERER"..

Спустя 3 минуты, 5 секунд (17.06.2009 - 16:22) glock18 написал(а):
афигееееть. я сейчас с mozilla 2 зашел... не могу ничего разобрать. IE в принципе не использую. никогда бы не подумал, что можно так жестко написать сайт под IE, чтобы нигде больше не работали стили smile.gif

Спустя 4 минуты, 10 секунд (17.06.2009 - 16:26) Sylex написал(а):
http://project.alex-school.com/login.html

Parse error: syntax error, unexpected '{' in /home/alexsch/public_html/project/login.html on line 5

парень что-то правит biggrin.gif

Спустя 2 минуты, 30 секунд (17.06.2009 - 16:28) NewLifeMan написал(а):
Цитата (glock18 @ 17.06.2009 - 13:22)
афигееееть. я сейчас с mozilla 2 зашел... не могу ничего разобрать. IE в принципе не использую. никогда бы не подумал, что можно так жестко написать сайт под IE, чтобы нигде больше не работали стили smile.gif

я не знаю в чем дело..

Но ни Опера, ни Лиса, ни Сафари не могут обработать таблицы стилей.. и Ява скрипты..

Может дело в том, что .css & .js проходят через сервер.. попробуйте скачать неп посредственно таблицу стилей или ява скрипт..

Спустя 3 минуты, 58 секунд (17.06.2009 - 16:32) NewLifeMan написал(а):
Цитата
Parse error: syntax error, unexpected '{' in /home/alexsch/public_html/project/login.html on line 5

парень что-то правит 


Уже исправил... ))



Парни, так что?
Никто еще не ничего не придумал..?
Я уже начинаю собой гордиться как антихакером.. laugh.gif rolleyes.gif

Спустя 11 минут, 58 секунд (17.06.2009 - 16:44) kirik написал(а):
Цитата (NewLifeMan @ 17.06.2009 - 08:14)
зачем брутфорс..

логин - demo
пароль - demo

Даа.. круто.. Там еще меньше места для развлечений чем на форме логинной smile.gif

Спустя 42 секунды (17.06.2009 - 16:45) glock18 написал(а):
Цитата (NewLifeMan @ 17.06.2009 - 13:32)
Я уже начинаю собой гордиться как антихакером..

Думаю, пока рано smile.gif Разве что хакеры разбегутся от неприменившихся стилей.

Спустя 4 минуты, 41 секунда (17.06.2009 - 16:50) kirik написал(а):
Цитата (NewLifeMan @ 17.06.2009 - 08:28)
Но ни Опера, ни Лиса, ни Сафари не могут обработать таблицы стилей.. и Ява скрипты..

smile.gif Ты css отдаешь через скрипт, зачем? Я тебе могу сказать почему он не отрабатывается нормально.. Потому что при отдаче этого css кода страничка должна отдаваться с типом text/css а не text/html как у тебя.

Спустя 6 минут, 1 секунда (17.06.2009 - 16:56) Sylex написал(а):
бугага, у тебя все через скрипт отдается? smile.gif

да, из-за заголовков

Спустя 4 минуты, 16 секунд (17.06.2009 - 17:00) kirik написал(а):
NewLifeMan
Кстати ты сайты хостишь у себя дома? (Sylex спасибо за ссылку) А то что-то музыка плохо качается.. tongue.gif

Спустя 7 минут, 34 секунды (17.06.2009 - 17:08) NewLifeMan написал(а):
Цитата (kirik @ 17.06.2009 - 14:00)
NewLifeMan
Кстати ты сайты хостишь у себя дома? (Sylex спасибо за ссылку) А то что-то музыка плохо качается.. tongue.gif

Я купил доменное имя, статичный IP..
Поставил ДЕНВЕР..

smile.gif

А музыка качается долго?.. не знаю.. может из-за торрента - я тоже два фильма качаю, хотя канал на 1,5mb/s

На счет таблиц..
Сейчас поиграюсь с заголовками...
Дело в том, что таблица project.css собирается через инклуд из нескольких таблиц.. (также и ява скрипт)

Спустя 6 минут, 59 секунд (17.06.2009 - 17:15) NewLifeMan написал(а):
Отлично.. Исправил заголовки и все заработало..

Жду следующих преложений..
smile.gif

Спустя 1 час, 41 минута, 37 секунд (17.06.2009 - 18:56) twin написал(а):
Веселая задачка. Но чесслово, я лично не стану задуряться. Если действительно нужна серьёзная защита, не прячь код и не устраивай ребусов. Покажи как устроено. Если есть дырки - тебе подскажут, а нет - значит действительно круто. В принципе, если сильно заморочиться, можно все что угодно поломать. Даже МВД-шные сайты ломают, что про банки говорить. Все дело в рентабельности взлома. А так развлекаться... Ни тебе ни отвечающим пользы нет. Так, на слабо развести только...

Спустя 50 минут, 9 секунд (17.06.2009 - 19:46) glock18 написал(а):
Цитата (twin @ 17.06.2009 - 15:56)
Все дело в рентабельности взлома

вот это очень точно. Ты оцени, зачем может кому-то понадобится твой сайт ломать. Это и защищай. В смысле то, что нужно злоумышленнику. Ну там результаты тестов, к примеру. Или еще чего.

Спустя 25 минут, 15 секунд (17.06.2009 - 20:12) NewLifeMan написал(а):
Как и обещал.. Выкладываю source code..

В оригинальных файлах почти тоже.. Во всяком случае этого хватит для анализа и поиска лазеек, если таковые есть..

Начнем по порядку..
INDEX.HTML

Свернутый текст
PHP
<?php
session_start
();
Error_Reporting(E_ALL);

if(isset(
$_SESSION['session_id']))
    {
     if(strlen($_SESSION['session_id']) == 32)
        {
         echo '
             <html>
                <head>
                 <meta http-equiv="refresh" content="0; url=\'http://project.alex-school.com/start.html\'" />
                </head>
                <body>
                 Wait...
                </body>
             </html>
            '
;
         exit();
        }
    }
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3.org/MarkUp/SCHEMA/xhtml11.xsd"
lang="uk"
xml:lang="uk">

<head>
    <title>home login</title>

    <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=windows-1251" />

    <meta name="Author" content="Smolinsky Alexey" />
    <meta name="Publisher-Email" content="Smolinsky_Alexey@hotmail.com" />
    <meta name="Copyright" content="NewLifeMan  2008-2009" />

    <link type="image/x-icon" rel="shortcut icon" href="favicon.ico" />

    <style>
     div#login
        {
         text-align:center;
        }
     
     div#login> img
        {
         
        }
    </style>
</head>
<body>



<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />

<div id="login">
    
     
    <form id="login_form" name="login_form" action="login.html" method="post" encType="multipart/form-data">
        <div id="form">
            Введіть логін - <br />
            <input type="text" name="login" value="" />    
            
            <br />
            та пароль - <br />
            <input type="password" name="pass" value="" />
            
            <br />
            <br />
            <img src="/design/images/usergroups/0.png" title="Введіть логін та пароль для подальшої роботи" />
            <input type="submit" title="Увійти" value="Увійти" />
        </div&



Я думаю, для опытных ребят комментарии не нужны..

Спустя 6 минут, 29 секунд (17.06.2009 - 20:18) twin написал(а):
И?

Спустя 2 минуты, 39 секунд (17.06.2009 - 20:21) NewLifeMan написал(а):
LOGIN.HTML

Свернутый текст
PHP
<?php
session_start
();
Error_Reporting(E_ALL);

if(!isset(
$_SERVER['HTTP_REFERER']))
    {
     GO_TO_LOGIN();
    }
else
    {
     // По другому я еще не придумал, как проверять откуда пытается зайти пользователь...
     
     if
($_SERVER['HTTP_REFERER'] !== 'http://project.alex-school.com/index.html')
        {
         GO_TO_LOGIN();
        }
    }
#####################################################################################################



#####################################################################################################
$login = 'demo';
$pass = 'demo';

if(isset(
$_POST['login']) AND isset($_POST['pass']))
    {
     $login = $_POST['login'];
     $pass = $_POST['pass'];
    }

$login = trim(stripslashes($login));
$pass = trim(stripslashes($pass));

$login_hash = md5(substr($login,0,20));
$pass_hash = md5(substr($pass,0,20));
#####################################################################################################



#####################################################################################################
$db = MYSQL_CONNECT('localhost','login....','pass....');

MYSQL_SELECT_DB($users_db,$db);
$select_user = MYSQL_QUERY("SELECT * FROM users WHERE l_hash='$login_hash' AND p_hash='$pass_hash'",$db) or exit(mysql_error());
$user = MYSQL_FETCH_ARRAY($select_user);


if ($user == true AND $user['login_hash'] == $login_hash AND $user['pass_hash'] == $pass_hash)
    {
     MYSQL_SELECT_DB($temp_db,$db);
     $query = MYSQL_QUERY("SELECT * FROM users WHERE id='$user[id]'",$db) or exit(mysql_error());
     $check_login_user = MYSQL_FETCH_ARRAY($query);
     
     
     if
($check_login_user['id'] == $user['id'])
         {
         do
            
{
             $result = MYSQL_QUERY("DELETE FROM users WHERE session_id='$check_login_user[s_id]'") or exit(mysql_error());
            }
         while($check_login_user = MYSQL_FETCH_ARRAY($query));
        }
     
     $login_time 
= time();
     $session_id = substr(md5(mt_rand() * mt_rand()),0,32);
     
     $result 
= MYSQL_QUERY ("INSERT INTO users (s_id, login_time, id, lastname, name, surname, school) VALUES ('$session_id','$login_time','$user[id]','$user[lastname]','$user[name]','$user[surname]','$user[school]')") or exit(mysql_error());
     
     
     
     $login_date 
= date('d').'.'.date('m').'.'.date('Y');
     
     MYSQL_SELECT_DB
($logs_db,$db);
     $login_log = MYSQL_QUERY ("INSERT INTO login (user, date) VALUES ('$user[id]','$login_date')") or exit(mysql_error());
     
     $_SESSION
['session_id'] = $session_id;
     GO_TO_START();
    }
else
    {
     //echo 'wrong login or pass... ';
     GO_TO_LOGIN();
    }
?>




<?
function GO_TO_START
()
    {//===============================
     echo '
         <html>
            <head>
             <meta http-equiv="refresh" content="0; url=\'http://project.alex-school.com/start.html\'" />
            </head>
            <body>
             Wait...
            </body>
         </html>
        '
;
     exit();
    }//===============================


function GO_TO_LOGIN()
    {//===============================
     echo '
         <html>
            <head>
             <meta http-equiv="refresh" content="0; url=\'http://project.alex-school.com/index.html\'" />
            </head>
            <body>
             Wait...
            </body>
         </html>
        '
;
     exit();
    }

Спустя 59 секунд (17.06.2009 - 20:22) NewLifeMan написал(а):
LOGOUT.HTML

Свернутый текст
PHP
<?php
session_start
();
$session_id = $_SESSION['session_id'];

$db = MYSQL_CONNECT('localhost','login....','pass....');
MYSQL_SELECT_DB($temp_db,$db);


$query = MYSQL_QUERY("SELECT * FROM users WHERE session_id='$session_id'",$db) or exit(mysql_error());
$check_logout_user = MYSQL_FETCH_ARRAY($query);
$logout_user = $check_logout_user['user_id'];

if(
$check_logout_user == true)
    {
     do
        
{
         $delete_session_id = MYSQL_QUERY("DELETE FROM users WHERE session_id='$check_logout_user[session_id]'") or exit(mysql_error());
        }
     while($check_logout_user = MYSQL_FETCH_ARRAY($query));
    }



$logout_date = date('d').'.'.date('m').'.'.date('Y');

MYSQL_SELECT_DB($logs_db,$db);
$login_log = MYSQL_QUERY ("INSERT INTO logout (user, date) VALUES ('$logout_user','$logout_date')") or exit(mysql_error());



unset(
$_SESSION['session_id']);
SESSION_DESTROY();
?>
<html>
    <head>
     <meta http-equiv="refresh" content="0; url='http://project.alex-school.com/index.html'" />
    </head>

Спустя 1 минута, 39 секунд (17.06.2009 - 20:23) NewLifeMan написал(а):
PROJECT.CSS

Свернутый текст
PHP
<?php
Header
('Content-type: text/css');

session_start();
include '../inc/lock.php';

if(
$user_group <= 0)
    {
     exit();
    }


include 'inc/main.css';


include 'inc/cabinet.css';
include 'inc/documentation.css';
include 'inc/collection.css';
include 'inc/school_base.css';
include 'inc/parents.css';


include 'inc/my_lessons.css';
include 'inc/view.css';
include 'inc/constructor.css';

Спустя 1 минута, 1 секунда (17.06.2009 - 20:24) NewLifeMan написал(а):
START.HTML

Свернутый текст
PHP
<?php
session_start
();
include 'lock.php';



//                                -------      HEADER  +   MENU   +   BODY     ------
// **************************************************************************************
$page_id = 1;
include 'header.php';


/**************************************************************************************
//                                                           CONTENT                        //
***************************************************************************************/
?>















<p>Demo page ...</p>












<?
/**************************************************************************************
                                                                           FOOTER 
***************************************************************************************/

include 'footer.php';

Спустя 57 секунд (17.06.2009 - 20:25) NewLifeMan написал(а):
И, наконец, LOCK.PHP

Свернутый текст
PHP
<?php
Error_Reporting
(E_ALL);

function GO_HOME()
    {//===============================
     echo '
         <html>
            <head>
             <meta http-equiv="refresh" content="0; url=\'http://project.alex-school.com/\'" />
            </head>
            <body>
             Wait...
            </body>
         </html>
        '
;
     exit();
    }//===============================


function LOGOUT_ME()
    {//===============================
     echo '
         <html>
            <head>
             <meta http-equiv="refresh" content="0; url=\'http://project.alex-school.com/logout.html\'" />
            </head>
            <body>
             Wait...
            </body>
         </html>
        '
;
     exit();
    }

//
// http-equiv="refresh" как вариант.. Можно и через заголовки..
//

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





#####################################################################################################
if(!isset($_SESSION['session_id']))
    {
     GO_HOME();
    }



if(
$_SESSION['session_id'] !== '')
    {
     $db = MYSQL_CONNECT('localhost','login....','pass....');
     
     MYSQL_SELECT_DB
('alexsch_temp',$db);
     $select_user = MYSQL_QUERY("SELECT * FROM users WHERE session_id='$_SESSION[session_id]'",$db) or exit(mysql_error());
     $user = MYSQL_FETCH_ARRAY($select_user);
     
     if 
($user == true AND $user['session_id'] == $_SESSION['session_id'])
        {
         // Проверяем давно ли человек логинился, если больше суток назад - LOGOUT_ME();
         
         $cur_time 
= time();
         $login_time =     $user['login_time'];
         $diferense = $cur_time - $login_time;
         
         if
($diferense > 86400) //SESSION_LIMIT   //1 СУТКИ...
            {
             LOGOUT_ME();
            }
         //============================
         
         
         
         
//============================
         switch ($user['user_group'])
            {
             case 1: $db_user = '**admin_login**';        $db_pass = '**admin_pass**';            break;
             case 2: $db_user = '**teacher_login**';    $db_pass = '**teacher_pass**';             break;
             
             case 3
             case 4
: $db_user = '**parent_login**';        $db_pass = '**parent_pass**';             break;
             
             case 10
: $db_user = '**root_login**';        $db_pass = '**root_pass**';                break;
            }
         
         
         
//Отключаемся от базы и входим в соответсвии со своими правими...
         MYSQL_CLOSE();
         $db = MYSQL_CONNECT('localhost',$db_user,$db_pass);
        }
     else
        
{
         unset($_SESSION['session_id']);
         SESSION_DESTROY();
         GO_HOME();
         LOGOUT_ME();
        }
    }
else
    {
     GO_HOME();
    }



function CHECK_INCOMMING_VAR($incomming_var)
    {
     $var = '';
     
     if 
(isset($_POST[$incomming_var]))    {$var = trim($_POST[$incomming_var]);}
     if ($var == '')
        {
         if (isset($_GET[$incomming_var]))    {$var = trim($_GET[$incomming_var]);}
        }
     
     $var 
= stripslashes(htmlspecialchars($var));
     
     return $var
;
    }
#####################################################################################################

Спустя 2 минуты, 44 секунды (17.06.2009 - 20:28) NewLifeMan написал(а):
Ну а теперь, когда код перед вами, великие гуру, я жду мыслей по этому поводу..

smile.gif

Спустя 6 минут, 9 секунд (17.06.2009 - 20:34) twin написал(а):
Блин, зачем весь то код... Достаточно защиты.
Пока я не понял идеи. Писать id сессии в сессию... Интересно, а какова логика этого? Масло масляное... Вообще любопытно, ты думаешь наверно, что изобрел жутко непробиваемый способ? Так вот что интересно, чем больше этих изобретений, тем уязвимее код. Можно действительно придумать что то сверхестественное, но вряд ли это на php/ Не по тому что он плох, а по отому что не надо. Всё давно придумано.
Ну и дальше то что? Только плиз, пиши то, что касаемо защиты.

Спустя 22 минуты, 55 секунд (17.06.2009 - 20:57) NewLifeMan написал(а):
Объясню, в чем логика...

Когда человек пытается попасть на любую страничку, в первую очередь проверяеться, есть session_id. Если да, идем во временную базу и ищем там такое значение.. Во временной базе даные храняться не более суток (ночью происходит чистка). Если такое значение есть, то проверяется время авторизации и, если все норм, то человек попадает на запрашиваемую страницу..

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

Причина такого подхода..
Только скрипт логин.хтмл имеет доступ к базе с паролями.. После успешной авторизации пользователя происходит копирование основных данных из главной таблицы пользователей во временную.. И далее работа ведеться только с временной таблицей..
Как вы понимаете, теперь ни с одного из скриптов не получиться добраться до базы с паролями пользователей...

А теперь прошу отписаться..

Спустя 15 минут, 18 секунд (17.06.2009 - 21:12) kirik написал(а):
Никак нельзя было это все запаковать и выложить в архиве?

Спустя 2 минуты, 17 секунд (17.06.2009 - 21:15) NewLifeMan написал(а):
Цитата

Никак нельзя было это все запаковать и выложить в архиве?


не.. так не интересно.. smile.gif


А если серьезно.. что скажите... какие недочеты..

Спустя 3 минуты, 44 секунды (17.06.2009 - 21:18) kirik написал(а):
Цитата (kirik @ 17.06.2009 - 13:12)
А теперь прошу отписаться..

twin высказался, я только добавлю, что при вызове session_start() сессионная кука и так создается. Получается что ты в параллель созданию нативной куки создаешь свою, что излишне.

Спустя 5 минут, 57 секунд (17.06.2009 - 21:24) kirik написал(а):
Вот дырка (и все подобные запросы):
SQL
SELECT * FROM users WHERE session_id='$_SESSION[session_id]'


PHP
$login_hash md5(substr($login,0,20));
$pass_hash md5(substr($pass,0,20));

Ну кто же так делает??


PHP
$session_id substr(md5(mt_rand() * mt_rand()),0,32);

Уникальность не гарантируется. (это вообще не нужно)

Спустя 1 минута, 35 секунд (17.06.2009 - 21:26) NewLifeMan написал(а):
Цитата
twin высказался, я только добавлю, что при вызове session_start() сессионная кука и так создается. Получается что ты в параллель созданию нативной куки создаешь свою, что излишне.



Да?.. может быть.. Исправлю..

Ну а со стороны безопасности кто-то нашел лазейку?..



Цитата
Вот дырка:

SQL 
SELECT * FROM users WHERE session_id='$_SESSION[session_id]' 




Кстати, я как-то этот моммент упустил... Странно.. smile.gif


Щас исправлю.. Благодарю..
наконец-то стоящее замечание..

Спустя 5 минут, 33 секунды (17.06.2009 - 21:31) NewLifeMan написал(а):
Цитата
PHP 
$login_hash = md5(substr($login,0,20));
$pass_hash = md5(substr($pass,0,20));


Ну кто же так делает??


А что не так??
huh.gif

Спустя 6 минут, 31 секунда (17.06.2009 - 21:38) kirik написал(а):
Цитата (NewLifeMan @ 17.06.2009 - 13:31)
А что не так??

1 - Я, Святослав Александрович пришел на твой сайт и захотел зарегистрироваться. Ввожу "логин": svyatoslav_aleksandrovich - получаю ответ "занято", ввожу svyatoslav_aleksandrovich1394 - опять "занято", ввожу svyatoslav_aleksandrovich_aldkjf - "занято".

2 - В случае с паролем - если у меня пароль 30 символов, то ты увеличиваешь (на треть) шансы того, что мой пароль подберут брутфорсом.

Спустя 1 минута, 19 секунд (17.06.2009 - 21:39) NewLifeMan написал(а):
Хотя
PHP
if(isset($_POST['login']) AND isset($_POST['pass']))
    {
     
$login $_POST['login'];
     
$pass $_POST['pass'];
    }

$login trim(stripslashes($login));
$pass trim(stripslashes($pass));

$login_hash md5(substr($login,0,20));
$pass_hash md5(substr($pass,0,20));



все это моно сократить до

if(isset($_POST['login']) AND isset($_POST['pass']))
{
if($_POST['login'] !== '' AND $_POST['pass'] !== '')
{
$login = md5($_POST['login']);
$pass = md5($_POST['pass']);
}
}

Спустя 21 секунда (17.06.2009 - 21:40) kirik написал(а):
Цитата (NewLifeMan @ 17.06.2009 - 13:26)
Щас исправлю.. Благодарю..

Да не нужно исправлять! Нужно использовать тот механизм сессий, который предлагает сам php! Скажи, какой смысл использовать свое, когда рядом лежит отточенный алгоритм сессий?

Спустя 31 секунда (17.06.2009 - 21:40) kirik написал(а):
Цитата (NewLifeMan @ 17.06.2009 - 13:39)
все это моно сократить до

зачем логин-то в md5?

Спустя 2 минуты, 20 секунд (17.06.2009 - 21:43) NewLifeMan написал(а):
нет..

Читайте внимательно

PHP
$select_user MYSQL_QUERY("SELECT * FROM users WHERE l_hash='$login_hash' AND p_hash='$pass_hash'",$db) or exit(mysql_error());
$user MYSQL_FETCH_ARRAY($select_user);


Это запрос на проверку, есть ли в базе такие данные или нет возможности зарегиться нет в принципе.. Логины и пароли изначально вбиваются в базу и изменению со стороны пользователя не подлежат...

Это могу сделать я при необходимости...

Спустя 3 минуты, 32 секунды (17.06.2009 - 21:46) NewLifeMan написал(а):
Цитата
зачем логин-то в md5?



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

И на брутфорс больше времени уйдет..

smile.gif

Спустя 2 минуты, 11 секунд (17.06.2009 - 21:48) kirik написал(а):
Цитата (NewLifeMan @ 17.06.2009 - 13:46)
И на брутфорс больше времени уйдет..

Почему? (да и брутфорсом обычно пароль подбирают) smile.gif

Цитата (NewLifeMan @ 17.06.2009 - 13:46)
то узнать где какой пользователь все равно не сможет..

И ты тоже не сможешь. Например чтобы написать ему "Привет, дорогой %username%!"..

Спустя 3 минуты, 57 секунд (17.06.2009 - 21:52) NewLifeMan написал(а):
smile.gif

Это программное обеспечение для школы..
Везде, где программа обращается к пользователю -> имя и фамилия, а не никнейм...

smile.gif

Спустя 2 минуты, 28 секунд (17.06.2009 - 21:55) kirik написал(а):
Цитата (NewLifeMan @ 17.06.2009 - 13:52)
Везде, где программа обращается к пользователю -> имя и фамилия, а не никнейм...

Как знаешь smile.gif

Спустя 7 минут, 3 секунды (17.06.2009 - 22:02) NewLifeMan написал(а):
А как на счет остального кода?.. С сессиями я сейчас чего-нибудь придумаю..

с этим тоже..
Цитата

SQL
SELECT * FROM users WHERE session_id='$_SESSION[session_id]'



Спустя 27 минут, 50 секунд (17.06.2009 - 22:30) kirik написал(а):
Цитата (NewLifeMan @ 17.06.2009 - 14:02)
А как на счет остального кода?..

Если ты спрашиваешь про дырки, то скажу по секрету, есть 3 самых распространенных вида "дырок" в сайтах/движках: SQL инъекция, XSS инъекция и загрузка зловредного скрипта (не фильтрация типов загружаемых файлов). Отсюда и смотри, какие из 3х могут быть применены к твоему коду. На данный момент возможна только SQL инъекция, следовательно, проверяй запросы и данные, входящие в них.

Спустя 1 час, 57 минут, 32 секунды (18.06.2009 - 00:27) NewLifeMan написал(а):
А что вы скажете на этот счет
PHP
if($_SERVER['HTTP_REFERER'] !== 'http://project.alex-school.com/index.html')
        {
         
GO_TO_LOGIN();
        }


Какие есть альтернативы или дополнения, чтобы проверить, что данные отправлены именно с этой страницы?..

Спустя 12 минут, 45 секунд (18.06.2009 - 00:40) twin написал(а):
Нужно просто определиться, что есть что и что для чего..
1. Логин. Эта штука придумана для аунтификации, то есть для определения принадлежности каких то данных конкретному человеку. Все попытки зашифровать, спрятать и так далее логин не только бессмыслены по определению, но и усложняют жизнь (и доступ) добропорядочного юзера к сайту в принципе. Что по меньшей мере пахнет параноей, а по большей - некомпетентностью.
2. Пароль. Эта штука принадлежит юзеру и больше никому. Это его собственность и великая тайна, которую не должен знать ни кто, владелец сайта в первую очередь. Потому что зная эту информацию он невольно берет на себя ответственность за сохранность этой тайны. И если по его оплошности она станет достоянием гласности или попадет в руки злоумышленнику, то владелца сайта будут мучать ночные кошмары (угрызения совести).
По этому не нужно изобретать велосипедов, а нужно просто делать так, что бы максимально облегчить доступ добропорядочных юзеров к аккаунту и максимально оградить их от утечки информации.
Для этого пароль нужно необратимо шифровать при получении (md5 как минимум) и не трогать логин как таковой в принципе. Вот и всё.
То что касается несанкционированного доступа к страницам, вполне достаточно на входе проверить наличие сессионной переменной, которую нужно установить при аунтификации. Все извращения плана записи в сессию её же идентификатора - лишнее и совершенно бессмысленное действие.
Обычно подобного рода защиты изобретают люди, мало понимающие толк в происходящих процессах, и потому пытающиеся всякими извращениями запутать взломщика сами себя.

Спустя 35 минут, 20 секунд (18.06.2009 - 01:15) NewLifeMan написал(а):
Не забывайте, что это не сайт, а программное обеспечение для школы...

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


На счет хеша логина.. да это перебор.. ))
С сессиями тоже обещаю исправиться.. smile.gif

Но PHP
if($_SERVER['HTTP_REFERER'] !== 'http://project.alex-school.com/index.html')
{
GO_TO_LOGIN();
}

Какие есть альтернативы или дополнения, чтобы проверить, что данные отправлены именно с этой страницы?..

Теоритически это обезопасит от брутфорса

==============

И второе, как вы смотрите на такую модель..

Пройдя авторизацию, создаются переменные в сессии(Фамилия,Имя,.. браузер с которого заходили.., еще чего-нибудь нужного)
Также некоторые данные вносятся во временную базу(id сессии, браузер, дата входа)

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

А к базе с пользователями больше не придется обращяться.. Таким образом исключиться СКЛ- Инъекция..



Исправте, если ход мыслей неверный...

Спустя 6 минут, 33 секунды (18.06.2009 - 01:22) kirik написал(а):
Цитата (twin @ 17.06.2009 - 16:40)
Обычно подобного рода защиты изобретают люди, мало понимающие толк в происходящих процессах, и потому пытающиеся всякими извращениями запутать взломщика сами себя.

Золотые слова! Но т.к. ТС программист начинающий, можно простить и показать smile.gif Я тоже по-началу придумывал всякие хитрые ненужные штуковины (сейчас тоже иногда грешу).

Цитата (NewLifeMan @ 17.06.2009 - 16:27)
А что вы скажете на этот счет

Первое, что обычно делается при взломе админки - подмена реферера, поэтому это тебе мало поможет. Но от брутфорса спасет нормальная капча.

Цитата (NewLifeMan @ 17.06.2009 - 16:27)
Какие есть альтернативы или дополнения, чтобы проверить, что данные отправлены именно с этой страницы?

Никаких.

Спустя 6 минут, 51 секунда (18.06.2009 - 01:29) twin написал(а):
Цитата
Не забывайте, что это не сайт, а программное обеспечение для школы...

Да хоть горшком... Принцип один все равно.
PHP
if($_SERVER['HTTP_REFERER'] !== 'http://project.alex-school.com/index.html')
{
GO_TO_LOGIN();
}

Вполне. Единственный минус, то что при переносе на другое место придется переписывать путь, а можно это сделать проще, установив его в конфиге. Ну и
PHP
GO_TO_LOGIN();

не совсем понятно что... если это
PHP
header('location: туда-сюда');
exit();

то норм. А можно было и не мудрить, а назвать вещи своими именами...

Спустя 15 секунд (18.06.2009 - 01:29) kirik написал(а):
Цитата (NewLifeMan @ 17.06.2009 - 17:15)
Не забывайте, что это не сайт, а программное обеспечение для школы...

Да хоть просто для локалхоста себя пишешь. Если разрабатываешь приложение, то нужно следовать некоторым правилам, иначе при разработке ПО не для себя рискуешь забыться и начать писать "как для себя".

Цитата (NewLifeMan @ 17.06.2009 - 17:15)
Совпадает ли браузер запрашивающего страницу (может быть еще какие-то данные) с браузером пользователя, создавшего сессию в базе..

Это не нужно.

Цитата (NewLifeMan @ 17.06.2009 - 17:15)
И второе, как вы смотрите на такую модель..

Плохо. Лучше защититься от SQL инъекций и сделать один запрос в БД, чем хранить кучу информации в сессии (тем более на сколько я заметил, сессия у тебя организована через ту же БД).
В этом случае если ты обновишь информацию в сессии, то в БД она уже станет не актуальной, а чтобы обновить и в БД нужно будет делать еще запрос.. Кароч не выдумывай, все уже придумано tongue.gif

Спустя 20 минут, 24 секунды (18.06.2009 - 01:49) NewLifeMan написал(а):
то есть..?
При каждом запросе страницы подключаться к базе и вытаскивать из сессии ее ID, логин и хеш пароля для сверки с базой..
Что-то не пойму.. до какого уровня упростить все мою схему..

Спустя 6 минут, 8 секунд (18.06.2009 - 01:55) kirik написал(а):
Цитата (NewLifeMan @ 17.06.2009 - 17:49)
то есть при каждом запросе страницы подключаться к базе и вытаскивать из сессии ее ID, логин и хеш пароля для сверки с базой.. что-то не пойму.. До какого уровня упростить все мою схему..

Не нужно ничего для сверки вытаскивать.. Почитай тут.

Спустя 7 часов, 23 минуты, 41 секунда (18.06.2009 - 09:19) glock18 написал(а):
почему просто не защищать запросы при помощи хотя бы mysql_real_escape_string, а не сводить их количество к минимуму... чтобы риск взлома снизить. Защита от sql-инъекций достаточно просто делается то.

Спустя 10 часов, 3 минуты, 4 секунды (18.06.2009 - 19:22) kirik написал(а):
glock18
ну нужно-же как-то извратиться! smile.gif

Спустя 1 час, 22 минуты, 36 секунд (18.06.2009 - 20:45) glock18 написал(а):
kirik, эт точно. я и сам люблю это. для разнообразия smile.gif

Спустя 1 день, 21 час, 41 секунда (20.06.2009 - 17:45) NewLifeMan написал(а):
Немного отвлекусь от темы.. Я сейчас редактирую проект на лок. сервере...

Я вчера написал скрипт для вывода всей своей муз.библиотеки...
audio1
audio2


Для любителей музыки, думаю будет интересно - там порядка 5,5 тыс песен...

Будет время занесу все в базу и сделаю постраничную навигацию, а пока все выводиться одним списком..

Зацените.. smile.gif

Спустя 6 месяцев, 10 дней, 18 часов, 7 минут, 21 секунда (31.12.2009 - 12:53) Guest написал(а):
NewLifeMan
Когда я захожу на ваш сайт,у меня высвечивается на мониторе
хаос символов например как квадратики huh.gif
Как тогда зайти туда?И вопрос вас случайно не взломали?

Спустя 2 минуты, 26 секунд (31.12.2009 - 12:55) crach написал(а):
Как зарегестрироваться?Сколько не пробовал,никак не получается!

Спустя 1 день, 2 часа, 48 минут, 52 секунды (2.01.2010 - 15:44) innaviktrova написал(а):
Цитата (glock18 @ 18.06.2009 - 17:45)
kirik, эт точно. я и сам люблю это. для разнообразия smile.gif

любите извращения?

Спустя 24 минуты, 23 секунды (2.01.2010 - 16:08) NewLifeMan написал(а):
Цитата
Когда я захожу на ваш сайт,у меня высвечивается на мониторе
хаос символов например как квадратики huh.gif
Как тогда зайти туда? И вопрос вас случайно не взломали?


Если вы про Alex-school.com, то ошибок я не видел никаких..

А www.newlifeman.com - мой домашний сервер... Я иногда перезагружаю комп, а перед праздниками у нас часто свет выключали... Может в этом дело..


=================
Цитата
Как зарегестрироваться? Сколько не пробовал, никак не получается!


Регистрации нет..
Если хотите посмотреть - временный логин и пароль - "demo"
Но скоро дступ будет закрыт, когдазакончится тестирование..
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.