Опубликовано: 4 июня 201213 г Столкнулся с проблемой обединения баз пользователей, т.е чтобы самопис брал данные из таблицы members, но что то не получается.... Если таким методом не как, тогда через внешнюю авторизацию как делатьобясните пожалуйста
Опубликовано: 4 июня 201213 г Что не получается? Каким методом никак? Изъясняйтесь по человечески пожалуйста.
Опубликовано: 4 июня 201213 г Автор Не получаются операции с данными по их запросу и провекеКусок кода проверкиsession_start(); include ("../inc/db.php"); $bd = mysql_connect ("localhost","юзер","пасс"); mysql_select_db ("база",$bd); mysql_query("SET haracter_set_client='cp_1251'"); mysql_query("SET haracter_set_results='cp_1251'"); mysql_query("SET collation_connection='cp_1251_general_ci'"); mysql_query('set names cp1251'); if (isset($_POST['name'])) { $name = $_POST['name']; if ($name == '') { unset($name);} } if (isset($_POST['password'])) { $password=$_POST['password']; if ($password =='') { unset($password);} } if (empty($name) or empty($password)) { exit ("Вы ввели не всю информацию, вернитесь назад и заполните все поля!"); } $name = stripslashes($name); $name = htmlspecialchars($name); $password = stripslashes($password); $password = htmlspecialchars($password); $name = trim($name); $password = trim($password); $ip=getenv("HTTP_X_FORWARDED_FOR"); if (empty($ip) || $ip=='unknown') { $ip=getenv("REMOTE_ADDR"); } mysql_query ("DELETE FROM oshibka WHERE UNIX_TIMESTAMP() - UNIX_TIMESTAMP(date) > 900"); $result = mysql_query("SELECT col FROM oshibka WHERE ip='$ip'",$db); $myrow = mysql_fetch_array($result); if ($myrow['col'] > 2) { exit ("Вы набрали логин или пароль неверно 3 раза. Подождите 15 минут до следующей попытки."); } $array = mysql_query("SELECT * FROM ipb_members WHERE name='$name' AND members_pass_hash='$password'",$bd); $save_array = mysql_fetch_array($array); $save_array['members_pass_salt'] = $salt; $password = md5( md5($salt) . md5( $password ) ); $result = mysql_query("SELECT * FROM ipb_members WHERE name='$name' AND members_pass_hash='$password'",$bd); $myrow = mysql_fetch_array($result); if (empty($myrow['id'])) { exit ("Извините, введённый вами логин или пароль неверный."); } else { $_SESSION['password']= md5( md5($salt) . md5( $password ) ); $_SESSION['name']=$myrow['name']; $_SESSION['id']=$myrow['id']; if (isset($_POST['save'])){ setcookie("name", $_POST["name"], time()+9999999); setcookie("password", $_POST["password"], time()+9999999); setcookie("id", $myrow['id'], time()+9999999); } if (isset($_POST['autovhod'])){ setcookie("auto", "yes", time()+9999999); setcookie("name", $_POST["name"], time()+9999999); setcookie("password", $_POST["password"], time()+9999999); setcookie("id", $myrow['id'], time()+9999999);} } echo "<html><head><meta http-equiv='Refresh' content='0; URL=/'></head></html>"; Изменено 4 июня 201213 г пользователем GetPass
Опубликовано: 4 июня 201213 г $save_array['members_pass_salt'] = $salt; $password = md5( md5($salt) . md5( $password ) );А $salt откуда берется? Может быть наоборот $salt = $save_array['members_pass_salt']? $array = mysql_query("SELECT * FROM ipb_members WHERE name='$name' AND members_pass_hash='$password'",$bd); $save_array = mysql_fetch_array($array); Та же история и с members_pass_hash='$password', хэш пароля $password у вас вычитается ниже. mysql_query("SET haracter_set_client='cp_1251'"); mysql_query("SET haracter_set_results='cp_1251'"); mysql_query("SET collation_connection='cp_1251_general_ci'"); mysql_query('set names cp1251');Форум работает с кодировкой utf8, может быть для латинских ников cp1251 еще пройдет, но для кириллицы наверняка нет. В целом код очень корявый, ничего удивительно что не работает.Для сравнения имен в таблице members используйте не name а member_l_name (данные находятся в нижнем регистре) $array = mysql_query("SELECT * FROM ipb_members WHERE name='$name' AND members_pass_hash='$password'",$bd); $save_array = mysql_fetch_array($array); $save_array['members_pass_salt'] = $salt; $password = md5( md5($salt) . md5( $password ) ); $result = mysql_query("SELECT * FROM ipb_members WHERE name='$name' AND members_pass_hash='$password'",$bd); $myrow = mysql_fetch_array($result); if (empty($myrow['id'])) А это перепишите, здесь нет необходимости делать аж два запроса. $res = mysql_query( 'SELECT * FROM ipb_members WHERE members_l_username="' .strtolower($name). '"' ); $member = mysql_fetch_assoc( $res ); if( ! member['member_id'] ) { die('Пользователь с таким именем не существует'); } $pass_hash = md5( md5($member['members_pass_salt']) . md5( $password ) ); if( $member['members_pass_hash'] != $pass_hash ) { die('Имя пользователя или пароль неверные'); } Ну и не забываете что вы работайте в cp1251, дебажите код, особенно после sql запросов с сравнением.
Опубликовано: 4 июня 201213 г Гениальная идея поместить пароль в cookie при зачем-то инициированной сессии венчает шедевр, достойный страниц govnokod.ru.
Опубликовано: 5 июня 201213 г Не в формате абсолютной истины, а развлечения для. Mysqli и prepared statements. <?php class ipb_auth { private $mysqli, $prefix = '', $id = 0; public function __construct($db_server = 'localhost', $db_user = 'root', $db_pass = '', $db_name = 'forum', $table_prefix = '') { $this->prefix = $table_prefix; $this->mysqli = new mysqli($db_server, $db_user, $db_pass, $db_name); if ($this->mysqli->connect_errno) { throw new Exception("Failed to connect to MySQL: (" . $this->mysqli->errno . ") " . $this->mysqli->error); } $this->mysqli->query("SET NAMES utf8"); } private function generateCompiledPasshash( $salt, $md5_once_password ) { return md5( md5( $salt ) . $md5_once_password ); } private function authenticateMember( $member, $md5_once_password ) { if ( ! $member['member_id'] ) { return false; } if ( $member['members_pass_hash'] == $this->generateCompiledPasshash( $member['members_pass_salt'], $md5_once_password ) ) { $this->id = $member['member_id']; return true; } else { return false; } } public function auth($login, $pass) { $this->id = 0; if (!($stmt = $this->mysqli->prepare("SELECT member_id, members_pass_hash, members_pass_salt FROM {$this->prefix}members WHERE members_l_username = ?"))) { throw new Exception("Prepare failed: (" . $this->mysqli->errno . ") " . $this->mysqli->error); } $stmt->bind_param('s', mb_strtolower($login)); if ($stmt->execute()) { $stmt->bind_result($member_id, $members_pass_hash, $members_pass_salt); if ($stmt->fetch()) { return $this->authenticateMember( array( 'member_id' => $member_id, 'members_pass_hash' => $members_pass_hash, 'members_pass_salt' => $members_pass_salt, ), md5($pass) ); } } return false; } public function member_string($forum_url = 'http://example.com/forum', $guest_title = 'Гость', $furl = true) { if ($this->id == 0) return $guest_title; if (!($stmt = $this->mysqli->prepare("SELECT member_id, members_display_name, members_seo_name FROM {$this->prefix}members WHERE member_id = ?"))) { throw new Exception("Prepare failed: (" . $this->mysqli->errno . ") " . $this->mysqli->error); } $stmt->bind_param('i', $this->id); if ($stmt->execute()) { $stmt->bind_result($id, $name, $furl); if ($stmt->fetch()) { if($furl) { return "<a href='{$forum_url}/user/{$id}-{$furl}/'>{$name}</a>"; } else { return "<a href='{$forum_url}/index.php?showuser={$id}'>{$name}</a>"; } } } return $guest_title; } } $ipb = new ipb_auth('localhost','root','toor','forum','ibf_'); if ($ipb->auth('ritsuka', 'password')) { echo $ipb->member_string('http://govnokod.ru/forum'); }
Столкнулся с проблемой обединения баз пользователей, т.е чтобы самопис брал данные из таблицы members, но что то не получается....
Если таким методом не как, тогда через внешнюю авторизацию как делатьобясните пожалуйста