Язык
Контакты
GitHub
Поддержка
Регистрация
Войти
Логин: Пароль: Запомнить:
Пользователи
Последние сообщения
Ответить
1 2

Вопрос к программерам

Krevedko

  • Атом-мастер
  • Юзер
  • 227
  • Репутация:3 
  • Предупреждения: 0 
  • Регистрация:
    18 Ноя 2010
#1
Короче есть сервак, нужно сделать веб панель для того, чтобы юзеры могли управлять своей учеткой.

Соль в следующем: есть MySQL база с игроками (ник, пароль, айпи), в этой базе прописаны права игрокам. Там же можно прикрепить пароль к нику, выставить флаги доступа (дают разные права и привелегии на сервере). Так вот, например, если кому-то надо поставить пароль на ник, то обязательно нужно лезть в эту базу, там ковыряться руками, а если таких людей 20 в день? Запарно. Нельзя ли (вернее я знаю, что можно) - как замутить такую веб панельку? Извините, если что криво описал - спать хочу безумно, голова не варит. Если что сутра объясню получше.

Drunya

  • Man of God
  • Админ
  • 3527
  • Репутация:110 
  • Предупреждения: 0 
  • Регистрация:
    30 Ноя -0001
#2
ну я так понял тебе нужна рега (как бы рега, ведь ник уже есть, осталось пароль прописать) и авторизация. Посмотри как это сделано в Фапосе.
Файл /modules/users/index.php
Там он разбит на экшены(function блабла())
Так вот найди экшены login и login_form - это авторизация
А так же add и add_form - это рега

Добавлено 2010.11.23 11-43

А так принцып в двух словах:
РЕГИСТРАЦИЯ на PHP:
создаем форму
юзер ее заполняет и отправляет
мы ее проверяем и если что не так редиректим назад и выводим ошибки
если все ок, заносим данные в базу и выдаем мессагу типа все ОК

АВТОРИЗАЦИЯ на PHP:
создаем форму
юзер ее заполняет и отправляет
мы проверяем есть ли в базе такая пара пароль/логин
если есть создаем сессию для юзера как для авторизованного (как правило это просто инфа об этом юзере в сессии, например $_SESSION['user'] = array(блабла))
если такого нет выдаем мессагу типа вы ошиблись или пытаетесь нас брутфорсить)))

Я горжусь тем, что создал бесплатную CMS - AtomX. И люблю нашу команду)

Krevedko

  • Атом-мастер
  • Юзер
  • 227
  • Репутация:3 
  • Предупреждения: 0 
  • Регистрация:
    18 Ноя 2010
#3
Drunya, сейчас получше объясню. Мне нужна рега для входа в панель, чтобы туда можно было зайти. Далее, уже, когда вошел в саму понель, чтобы можно было заполнить поле ник | пароль, при заполнении, чтобы они отправлялись в мускулу, а IP отправившего заносился в лог + создавались куки на неделю, запрещающие повтор.

Добавлено 2010.11.23 15-59

Drunya, вот я нашел тут для меня-чайника. http://dezignweb.h17.ru/reg_php.php

Drunya

  • Man of God
  • Админ
  • 3527
  • Репутация:110 
  • Предупреждения: 0 
  • Регистрация:
    30 Ноя -0001
#4
ну так обычная рега я о ней и говорил. А куда именно она будет позволять добраться это уже другой вопрос, куда хочешь туда и закрываешь доступ, это не проблема. А куки это лишь файл на компе клиента, так что запретить что либо они смогут только этому браузеру с которого заходили и больше никому:)

Я горжусь тем, что создал бесплатную CMS - AtomX. И люблю нашу команду)

Krevedko

  • Атом-мастер
  • Юзер
  • 227
  • Репутация:3 
  • Предупреждения: 0 
  • Регистрация:
    18 Ноя 2010
#5
Drunya, вот смотри, что намутил

Регистрация

 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
 10 
 11 
 12 
 13 
 14 
 15 
 16 
 17 
 18 
 19 
 20 
 21 
 22 
 23 
 24 
 25 
 26 
 27 
 28 
 29 
 30 
 31 
 32 
 33 
 34 
 35 
 36 
 37 
 38 
 39 
 40 
 41 
 42 
 43 
<?php if(isset($_POST['submit'])) 

    
$err = array(); 

    
# проверям логин 
    
if(!preg_match("/^[a-zA-Z0-9]+$/",$_POST['login'])) 
    { 
        
$err[] = "Логин может состоять только из букв английского алфавита и цифр"
    } 
     
    if(
strlen($_POST['login']) < or strlen($_POST['login']) > 30
    { 
        
$err[] = "Логин должен быть не меньше 3-х символов и не больше 30"
    } 
     
    
# проверяем, не сущестует ли пользователя с таким именем 
    
$query mysql_query("SELECT COUNT(user_id) FROM users WHERE user_login='".mysql_real_escape_string($_POST['login'])."'"); 
    if(
mysql_result($query0) > 0
    { 
        
$err[] = "Пользователь с таким логином уже существует в базе данных"
    } 
     
    
# Если нет ошибок, то добавляем в БД нового пользователя 
    
if(count($err) == 0
    { 
         
        
$login $_POST['login']; 
         
        
# Убераем лишние пробелы и делаем двойное шифрование 
        
$password md5(md5(trim($_POST['password']))); 
         
        
mysql_query("INSERT INTO users SET user_login='".$login."', user_password='".$password."'"); 
        
header("Location: login.php"); exit(); 
    } 
    else 
    { 
        print 
"<b>При регистрации произошли следующие ошибки:</b><br>"
        foreach(
$err AS $error
        { 
            print 
$error."<br>"
        } 
    } 
}
?>


Вход

 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
 10 
 11 
 12 
 13 
 14 
 15 
 16 
 17 
 18 
 19 
 20 
 21 
 22 
 23 
 24 
 25 
 26 
 27 
 28 
 29 
 30 
 31 
 32 
 33 
 34 
 35 
 36 
 37 
 38 
 39 
 40 
 41 
 42 
 43 
 44 
 45 
<?php # Функция для генерации случайной строки 
function generateCode($length=6) { 
    
$chars "abcdefghijklmnopqrstuvwxyzABCDEFGHI JKLMNOPRQSTUVWXYZ0123456789"
    
$code ""
    
$clen strlen($chars) - 1;   
    while (
strlen($code) < $length) { 
            
$code .= $chars[mt_rand(0,$clen)];   
    } 
    return 
$code


if(isset(
$_POST['submit'])) 

    
# Вытаскиваем из БД запись, у которой логин равняеться введенному 
    
$query mysql_query("SELECT user_id, user_password FROM users WHERE user_login='".mysql_real_escape_string($_POST['login'])."' LIMIT 1"); 
    
$data mysql_fetch_assoc($query); 
     
    
# Соавниваем пароли 
    
if($data['user_password'] === md5(md5($_POST['password']))) 
    { 
        
# Генерируем случайное число и шифруем его 
        
$hash md5(generateCode(10)); 
             
        if(!@
$_POST['not_attach_ip']) 
        { 
            
# Если пользователя выбрал привязку к IP 
            # Переводим IP в строку 
            
$insip ", user_ip=INET_ATON('".$_SERVER['REMOTE_ADDR']."')"
        } 
         
        
# Записываем в БД новый хеш авторизации и IP 
        
mysql_query("UPDATE users SET user_hash='".$hash."' ".$insip." WHERE user_id='".$data['user_id']."'"); 
         
        
# Ставим куки 
        
setcookie("id"$data['user_id'], time()+60*60*24*30); 
        
setcookie("hash"$hashtime()+60*60*24*30); 
         
        
# Переадресовываем браузер на страницу проверки нашего скрипта 
        
header("Location: check.php"); exit(); 
    } 
    else 
    { 
        print 
"Вы ввели неправильный логин/пароль"
    } 
}
?>


И собственно сам вход


 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
 10 
 11 
 12 
 13 
 14 
 15 
 16 
 17 
 18 
 19 
 20 
 21 
<?php if (isset($_COOKIE['id']) and isset($_COOKIE['hash'])) 
{    
    
$query mysql_query("SELECT *,INET_NTOA(user_ip) FROM users WHERE user_id = '".intval($_COOKIE['id'])."' LIMIT 1"); 
    
$userdata mysql_fetch_assoc($query); 

    if((
$userdata['user_hash'] !== $_COOKIE['hash']) or ($userdata['user_id'] !== $_COOKIE['id'])
 or ((
$userdata['user_ip'] !== $_SERVER['REMOTE_ADDR'])  and ($userdata['user_ip'] !== "0"))) 
    { 
        
setcookie("id"""time() - 3600*24*30*12"/"); 
        
setcookie("hash"""time() - 3600*24*30*12"/"); 
        print 
"Хм, что-то не получилось"
    } 
    else 
    { 
        print 
"Привет, ".$userdata['user_login'].". Всё работает!"
    } 

else 

    print 
"Включите куки"
}
?>



Как сделать следующее:
1) print "Привет, ".$userdata['user_login'].". Всё работает!"; - изменить на главную страницу личного кабинета
2) Сделать кнопку "выход", которая затерает куки




 1 
 2 
<?php setcookie("id"""time() - 3600*24*30*12"/"); 
        
setcookie("hash"""time() - 3600*24*30*12"/");?>

Krevedko

  • Атом-мастер
  • Юзер
  • 227
  • Репутация:3 
  • Предупреждения: 0 
  • Регистрация:
    18 Ноя 2010
#6
Понаписал тут бреду...Короче, регистрацию в самом личном кабинете я оформил, просмотр только для зарегенных тоже. Теперь остался последний самый сложный вопрос.

Дело в том, что нужно сделать такую регистрацию:
- Ник
- Пароль
- Сервер (у каждого сервера свой ID - об этом дальше)

Далее ник и пароль заносятся в эту бд.



username и password соответственно. +каждому присваивается свой ID, который нам понадобится дальше. Остальные параметры, даже не разбирайте, это настройка прав доступа к серверу.
Эта бд отвечает только за создание учетки, за прикрепление к серверу отвечает следующая бд.



Чтобы аккаунт прикрепился к серверу, нужно заполнить ID игрока и ID сервера, который мы указали при регистрации.


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



Drunya, в общем такие пироги. Готов купить такую шнягу, потому что своим мозгом и незнанием php я вряд ли смогу что-то сделать

Drunya

  • Man of God
  • Админ
  • 3527
  • Репутация:110 
  • Предупреждения: 0 
  • Регистрация:
    30 Ноя -0001
#7
На самом деле ты все нормально делаешь. Только все данные ескейпи перед вставкой в запрос (mysql_real_escape_string())
Затирание куки есть не что иное как запись тех же кук только с пустыми значениями и временем истечения -1 секунда например:)
Привязку к серверу делай так же как и регу, то есть в самой реге, просто когда пишешь в базу нового юзера, наряду с другими данными пиши и ИД сервера:)

Я горжусь тем, что создал бесплатную CMS - AtomX. И люблю нашу команду)

Krevedko

  • Атом-мастер
  • Юзер
  • 227
  • Репутация:3 
  • Предупреждения: 0 
  • Регистрация:
    18 Ноя 2010
#8
Добавить в первую базу, я смогу, после долгих мучений, конечно, но вот, как добавить во вторую базу...Там нужен ID, под которым добавили человека в предыдущую, ID сервера в принципе легко присваивается к его названию в заполнении формы. Отсюда вопрос: как узнать ID юзера, которого мы только что добавили в таблицу, чтобы вставит его во вторую? :) как-то так...

Добавлено 2010.11.23 23-26

Все, целый день е**лся, но вот, что получилось

 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
 10 
<?php $cerere "INSERT INTO `amx_amxadmins` (`username`, `password`, `access`, `flags`, `nickname`, `email`) VALUES ('$user', '$pass',           '$acces', '$flags', '$user', '$email')";
      
mysql_query($cerere) or die(mysql_error());
      
      
$cerere "SELECT id FROM `amx_amxadmins` WHERE username='$user'";
      
$res=mysql_query($cerere) or die (mysql_error());
      
$row mysql_fetch_row($res);
      
$id_player $row[0];
      
      
$cerere="INSERT INTO `amx_admins_servers` (`admin_id`, `server_id`) VALUES ('$id_player','1')";
      
mysql_query($cerere) or die(mysql_error());?>


Хз насколько это правильно, главное что работает :)

Отредактировано автором 23 Ноя 2010

Drunya

  • Man of God
  • Админ
  • 3527
  • Репутация:110 
  • Предупреждения: 0 
  • Регистрация:
    30 Ноя -0001
#9
есть функция mysql_insert_id() она возвращает ID последней записаной записи. Юзай лучше ее:)

Я горжусь тем, что создал бесплатную CMS - AtomX. И люблю нашу команду)

Krevedko

  • Атом-мастер
  • Юзер
  • 227
  • Репутация:3 
  • Предупреждения: 0 
  • Регистрация:
    18 Ноя 2010
#10
Drunya, спасибо :) а вроде не так уж все и сложно в пыхе. Все красиво оформил, даже лог действий сделал :)

1 2
Сейчас online: 118. Зарегистрированных: 2. Гостей: 116.