Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Написание CMS, Требуется помощь 
:(
    Опции темы
CyClon
Дата 7.3.2006, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 3.12.2005

Репутация: 3
Всего: 4



Вот, решил написать себе CMS. Хочу сделать ее максимально безопасной и более-менее быстрой. В этом топике я хотел бы задавать вопросы и слышать на них ответы. В основном попрошу вас проанализировать мой код на скорость и безопасность. Ну, что же? Первая функция:

Код
function is_user($group)
{
    if (!empty($_COOKIE['user']))
    {
        $info = explode(":", $_COOKIE['user']);
        $user['id'] = intval($info[0]);
        $user['id'] = addslashes($user['id']);
        $user['name'] = base64_decode($info[1]);
        $user['name'] = addslashes($user['name']);
        $user['name'] = htmlspecialchars($user['name']);
        $user['pwd'] = $info[2];
        unset($info);
        if (!empty($group))
        {
            $query = $db->sql_fetchrow($db->sql_query("SELECT `id`, `name`, `password` FROM `site_members` WHERE `id`='$user['id']' AND `name`='$user['name'] AND `password`='$user['pwd']' AND `group`='$group'"));
        } else {
            $query = $db->sql_fetchrow($db->sql_query("SELECT `id`, `name`, `password` FROM `site_members` WHERE `id`='$user['id']' AND `name`='$user['name'] AND `password`='$user['pwd']'"));
        }
        if (count($query) > 0)
        {
            return 1;
        } else {
            return 0;
        }
    } else {
        return 0;
    }
}

Ну, что? У кого какие мысли по поводу этого кода?

Это сообщение отредактировал(а) CyClon - 7.3.2006, 15:06


--------------------
user posted image
PM   Вверх
S.A.P.
Дата 7.3.2006, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2664
Регистрация: 11.6.2004

Репутация: 3
Всего: 71



CyClon, ИМХО
1. Отключи register_globals.
2. ОО интерфейс для баз данных лучше так
Код

$res = $db->query($sql, ...);
$result = $res->fetch();
или сразу так
Код

$result = $db->query($sql, ...)->fetch();

т.е. функция query возвращает объект.
3. Все вносимые строки должны проходить через mysql_escape_string, для этого лучше воспользоваться идеей placeholders. Подробности у Котерова.
4. Группу пользователя лучше сразу хранить в сессии и инициальзировать ее при логине или первом заходе.
PM MAIL   Вверх
CyClon
Дата 7.3.2006, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 3.12.2005

Репутация: 3
Всего: 4



S.A.P., А что, он включен? Он то включен, но я пишу под выключенный.

На счет ОО - работать с ним не умею, хотел просто как нить... Так... Короче чтобы был ОО smile Можешь привести пример ОО? У меня есть функции для работы с БД, писал в основном для счета колва запросов и времени. Но хочу как-то занести все в класс, а работать не умею с ними.

На счет mysql_escape_string... Слышал про эту функцию, но что она делает еще, кроме addslashesи htmlspecialchars?

На счет группы немного не понял. У меня есть БД, где хранится инфа о юзерах, там же id, login, passowrd, group. Я даже немогу представить как это все вообще выглядит, буду видоизменять по мере написания smile
Добавлено @ 15:18
Код
<?php

if (!defined('KERNEL'))
{
    header("Location: ../index.php");
}

$php = explode(".", phpversion());
$php = intval($phpver[0].$phpver[1]);

if ($php < 41)
{
    $_GET = $HTTP_GET_VARS;
    $_POST = $HTTP_POST_VARS;
    $_COOKIE = $HTTP_COOKIE_VARS;
    $_REQUEST = array_merge($_GET, $_POST, $_COOKIE);
    $_FILES = $HTTP_POST_FILES;
    $_SERVER = $HTTP_SERVER_VARS;
}

unset($php);

?>


Вот, написал для универсальности скрипта. Кто что еще может добавить на счет этого?


--------------------
user posted image
PM   Вверх
CyClon
Дата 7.3.2006, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 3.12.2005

Репутация: 3
Всего: 4



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

Код
<?php

function file_size($size)
{
    if ($size >= 1024)
    {
        return round(($size / 1024), 2)." КБ";
    }
    else if ($size >= 1048576)
    {
        return round(($size / 1048576), 2)." МБ";
    }
    else if ($size >= 1073741824)
    {
        return round(($size / 1073741824), 2)." ГБ";
    }
    else
    {
        return $size." байт";
    }
}

function check_login($string)
{
    $mask = preg_match("/[a-zA-Zа-яА-Я0-9_- ]/", $string);
    return ($mask) ? 1 : 0;
}

function check_url($string)
{
    $mask = preg_match("/^(ftp|https|http)+://[a-zA-Z0-9.-]+\.[a-zA-Z]{2,5}$/", $string);
    return ($mask) ? 1 : 0;
}

function check_mail($string)
{
    $mask = preg_match("/^[a-zA-Z0-9_-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,5}$/", $string);
    return ($mask && (substr($string, 0, 4) != "www.")) ? 1 : 0;
}

?>


Это сообщение отредактировал(а) CyClon - 7.3.2006, 21:04


--------------------
user posted image
PM   Вверх
CyClon
Дата 7.3.2006, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 3.12.2005

Репутация: 3
Всего: 4



Блин, не могу определиться с авторизацией. Сначала думал определять юзер или нет каждый раз функцией, что дана сверху, как в одной немало ихвестной CMS, но теоретически - зачем 100 раз перепроверять, делать запросы к БД? Решил сдедлать файл vars.php, который всегда будет исполняться:

Код
<?php

// User info
if (!empty($_COOKIE['user']))
{
    $info = explode(":", $_COOKIE['user']);
    $user['name'] = base64_decode($info[0]);
    $user['name'] = addslashes($user['name']);
    $user['name'] = htmlspecialchars($user['name']);
    $user['password'] = $info[1];
    unset($info);
    $query = $db->sql_fetchrow($db->sql_query("SELECT `id`, `name`, `password`, `email`, `group` FROM `site_members` WHERE `name`='$user['name'] AND `password`='$user['password']'"));
    unset($user);
    if (count($query) > 0)
    {
        $user['name'] = $query['name'];
        $user['email'] = $query['email'];
        $user['group'] = $query['group'];
        $user['valid'] = 1;
    }
    unset($query);
}

?>


Кто как думает, как организовать все это дело?


--------------------
user posted image
PM   Вверх
RomanK
Дата 8.3.2006, 00:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 25.6.2005
Где: Россия, Выборг

Репутация: 1
Всего: 2



Цитата(CyClon @ 7.3.2006, 21:38 Найти цитируемый пост)
зачем 100 раз перепроверять, делать запросы к БД

Проверяешь один раз: если у юзера кука есть, то вытаскиваешь все из БД, и сохраняешь в переменные сессии. А потом просто, если эти переменные существуют, значит юзер авторизован.
Код

<?php
if(!isset($_SESSION['user'])) // Если юзер еще не авторизован.
{
    if(isset($_COOKIE['user'])) // Если у него есть кука.
    {
        // Тут достаешь все из базы и заносишь в $_SESSION.
    }
}

if(isset($_SESSION['user'])) echo 'Юзер авторизован!';
else echo 'Юзер не авторизован.';
?>

Помоему так. smile Получается, что ты обращаешься к базе только один раз за всю сессию для того, чтобы достать инфу о юзере. smile

Это сообщение отредактировал(а) RomanK - 8.3.2006, 00:53
PM MAIL WWW ICQ   Вверх
CyClon
Дата 8.3.2006, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 3.12.2005

Репутация: 3
Всего: 4



RomanK, Хороший вариант. Получается один раз за всю сессия запрос. А я хотел делать на каждой странице блин smile Вообще я с сессиями еще не работал, посему не очень с нимим дружу. Где их еще можно использовать, кроме как хрнаить данные?
ЗЫ: Еще хотле бы сделать, чтобы юзер мог работать на сайте без COOKIE. Как? Я думаю, что сначала нада устанавливать пробную куку, и если она потом читается, то вес ок ставить куки, а если нет, то приписывать в $_SESSION['user'] все. Или как еще можно?


--------------------
user posted image
PM   Вверх
RomanK
Дата 8.3.2006, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 25.6.2005
Где: Россия, Выборг

Репутация: 1
Всего: 2



Цитата(CyClon @ 8.3.2006, 09:37 Найти цитируемый пост)
Еще хотле бы сделать, чтобы юзер мог работать на сайте без COOKIE. Как?

Без кук можно сделать, но тогда не будет автологина. smile Ты как бы по существованию куки авторизуешь пользователя сразу. А если этой куки нету, то значит юзер не авторизован, и он должен пройти авторизацию. smile
Если ты будешь делать без кук, то получается пользователь должен каждый раз проходить авторизацию, что не есть хорошо. smile То есть он пришел, заполнил форму, отправил серверу, ты проверяешь и создаешь переменные в сессии. То есть уже без куки. smile Понимаешь?
Добавлено @ 12:15
Цитата(CyClon @ 8.3.2006, 09:37 Найти цитируемый пост)
Где их еще можно использовать, кроме как хрнаить данные?

Переменные сессии, это те же самые переменные, только они не теряются при reloade.
PM MAIL WWW ICQ   Вверх
CyClon
Дата 8.3.2006, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 3.12.2005

Репутация: 3
Всего: 4



RomanK, Про куки знаю, просто нужно сделать чтобы и без COOKIE работало, а то если в сессии не храить данные, то вообще не сможет юзер авторизоватьсяsmile


--------------------
user posted image
PM   Вверх
Эрмитаж
Дата 8.3.2006, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 8.3.2006

Репутация: нет
Всего: нет



Есть 3 вида авторицации: заголовок (headers), куки и сессии. Сессии включают в себя авторизацию как с помощью кук, так и без них, т.е кука уже хранится в PHPSESSID. Будет лучше, если ты воспользуешься самым последним способом из выше перечисленных.
Добавлено @ 16:49
Если у посетителя браузер принимает cookie, то ему высылается cookie (с определенным именем - по умолчанию "PHPSESSID"), содержащий так называемый "идентификатор сессии" ( содержимое сookie с идентификатором сессии ), а если нет, то web-сервер автоматически помещает данный идентификатор в переменную PHPSESSID в каждую ссылку ( ссылка с идентификатором сессии ) на выдаваемых посетителю страницах сайта ( естественно, "внутреннюю" - то есть ведущую на другие страницы того же самого сайта, с тем же самым доменным именем). Таким образом, идентификатор передается на сервер при каждом заходе посетителя на какую-либо из страниц сайта, будучи либо взятым из соответствующего cookie, установленного посетителю при открытии сессии, либо из адресной строки ссылки, куда этот идентификатор автоматически помещается web-сервером.


PM MAIL   Вверх
CyClon
Дата 9.3.2006, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 3.12.2005

Репутация: 3
Всего: 4



А пример кода можно? Мне как раз таки нужно сделать... Но бывает иногда идентификатор передатется в стрке, когда даже включены куки. Как его сразу прописывать?


--------------------
user posted image
PM   Вверх
AztEK
Дата 10.3.2006, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 723
Регистрация: 4.1.2005

Репутация: 6
Всего: 18



А что код?
Это PHP автоматически решает, как передать сессию (в куках или query_string).


--------------------
Linux is like wigwam -- no windows, no gates, apache inside.
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1125 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.