Аппараттық және бағдарламалық қамтамасыз етуді орнату

Қуатсыз auth php. HTTP MySQL және PHP көмегімен бет қауіпсіздігін орнату

Біз сайтта қарапайым пайдаланушы аутентификациясын қалай жасау керектігін үйренеміз. Сайтта тек авторизацияланған пайдаланушыларға арналған беттер болуы мүмкін және егер біз оларға аутентификация блогын қоссақ, олар толығымен жұмыс істейді. Оны жасау үшін сізге негіз қажет MySQL деректері. Пайдаланушылар туралы ақпаратты қосқыңыз келсе, оның 5 баған (ең аз) немесе одан көп болуы мүмкін. Мәліметтер базасын «Userauth» деп атаймыз.

Онда келесі өрістерді жасайық: пайдаланушылар санын санау үшін идентификатор, пайдаланушының бірегей сәйкестендіру нөмірі үшін UID, пайдаланушы аты үшін пайдаланушы аты, оның мекенжайы үшін электрондық пошта Электрондық поштажәне құпия сөзге арналған Құпия сөз. Авторизациялау үшін пайдаланушыны және бұрыннан бар дерекқорды пайдалана аласыз, тек жаңа дерекқор жағдайындағыдай, онда келесі кестені жасаңыз.

MySQL коды

КЕСТЕ `пайдаланушылар` (`ID` int (11) NULL ЕМЕС AUTO_INCREMENT, `UID` int (11) NULL ЕМЕС, `Пайдаланушы аты` мәтіні NULL ЕМЕС, 'Электрондық пошта' мәтіні NULL ЕМЕС, 'Пароль' мәтіні НҰЛ ЕМЕС, БАСТЫҚ КҮЙЕ (`ID`)) ENGINE=MyISAM Әдепкі ТАҒАМ =utf8 AUTO_INCREMENT=1 ;

Енді «sql.php» файлын жасайық. Ол дерекқорға қосылуға жауапты. Бұл код алдымен серверге қосылған кезде сервер мен пайдаланушы үшін айнымалы мәндерді жасайды. Екіншіден, ол дерекқорды таңдайды, бұл жағдайда «USERAUTH». Бұл файл дерекқорға қол жеткізу үшін «log.php» және «reg.php» ішінде болуы керек.

PHP коды

//Сіздің MySQL пайдаланушы атыңыз$pass = "redere"; //құпия сөз $conn = mysql_connect ($server, $user, $pass); //серверге қосылу$db = mysql_select_db("userauth", $conn); //дерекқорды таңдауегер (!$дб) ( // егер дерекқорды таңдау мүмкін болмаса echo "Кешіріңіз, қате:(/>"; //Қате туралы хабарды көрсетуШығу(); //Басқа PHP сценарийлерін іске қосуға мүмкіндік береді } ?>

Келесі - кіру беті, оны «login.php» деп атаймыз. Біріншіден, ол енгізілген деректерді қателерге тексереді. Бетте пайдаланушы аты, құпия сөз, жіберу түймесі және тіркеу сілтемесі үшін өрістер бар. Пайдаланушы «Кіру» түймесін басқан кезде пішін «log.php» файлындағы кодпен өңделеді, содан кейін логин орын алады.

PHP коды

0) { //сеанс қателері болса$err = "

"; //Foreach кестесін бастаңыз ($_SESSION["ERRMSG"] $msg ретінде) ( //әр қатені тану$err.= " "; //оны айнымалыға жазыңыз) $err .= "
". $msg."
"; //үстелді жабу unset($_SESSION["ERRMSG"]); //сеансты жою } ?> Жүйеге кіру формасы
Қолданушының аты
Құпия сөз
тіркеу

Содан кейін жүйеге кіру үшін сценарий жазамыз. «log.php» деп атайық. Оның сценарийді бұзуы мүмкін SQL инъекциялық кірістерін тазалау мүмкіндігі бар. Екіншіден, ол пішін деректерін алады және оның жарамдылығын тексереді. Енгізілген деректер дұрыс болса, сценарий пайдаланушыны рұқсат етілген пайдаланушылар бетіне жібереді, егер жоқ болса, қателерді түзетеді және пайдаланушыны кіру бетіне жібереді.

PHP коды

//жазу үшін сеансты бастауфункциясы Fix($str) ( //өрістерді тазалау $str = trim($str); if (get_magic_quotes_gpc()) ( $str = жолақ сызықтары ($str); ) //қателерді сақтау үшін массив$errflag = жалған ; //қате жалаушасы $username = Түзету($_POST["пайдаланушы аты"]); //Қолданушының аты$password = Түзету($_POST["password"]);//password ) //құпия сөзді тексеріңіз if ($password == "") ( $errmsg = "Пароль жоқ"; //қате $errflag = шын; //қатеде жалауша көтеру ) //егер қате жалауы көтерілсе, тіркеу пішініне қайта бағыттайды // қателерді тіркейді session_write_close(); //сеансты жабу //қайта бағыттауШығу(); ) //дерекқорға сұраныс$qry = "ТАҢДАУ * FROM `users` WHERE `Username` = "$username" AND `Parol` = "" . md5 ($password) . """; $нәтиже = mysql_query($qry); // сұраудың сәтті болғанын тексеріңіз (ол бойынша деректер болса) if (mysql_num_rows ($result) == 1) ( while ($row = mysql_fetch_assoc ($нәтиже)) ( $_SESSION["UID"] = $жол["UID"]); //Дерекқордан UID алыңыз және оны сеансқа қойыңыз$_SESSION["USERNAME"] = $username; //пайдаланушы аты сеансқа сәйкес келетінін орнатады session_write_close(); //сеансты жабутақырып («орын: мүше.php»); //қайта бағыттау) ) else ( $_SESSION["ERRMSG"] = "Жарамсыз пайдаланушы аты немесе құпия сөз"; //қатесі session_write_close(); //сеансты жабутақырып («орын: login.php»); //қайта бағыттауШығу(); ) ?>

Тіркеу бетін жасайық, оны «register.php» деп атаймыз. Ол кіру бетіне ұқсас, тек оның тағы бірнеше өрістері бар және тіркеу сілтемесінің орнына, егер пайдаланушыда тіркелгі бар болса, login.php сілтемесі бар.

PHP коды

0) { //сеанс қателері болса$err = "

"; // foreach кестесінің басы ($_SESSION["ERRMSG"] $msg ретінде) ( // әрбір қатені орнатады$err.= " "; //оларды айнымалыға жазады) $err .= "
". $msg."
"; // кестенің соңы орнатылмаған ($_SESSION["ERRMSG"]); //сеансты бұзады } ?> Тіркеу формасы
Қолданушының аты
Электрондық пошта
Құпия сөз
Құпия сөзді қайталау
Менің аккаунтым бар

Енді «reg.php» файлында тіркеу сценарийін жасайық. Ол дерекқорға қосылу үшін "sql.php" қамтиды. Енгізу өрісін тазалау үшін кіру сценарийіндегідей функция пайдаланылады. Айнымалылар үшін орнатылған мүмкін қателер. Келесі - бұрын ешқашан берілмеген бірегей идентификаторды жасау функциясы. Содан кейін деректер тіркеу пішінінен алынады және расталады. Ол электрондық пошта мекенжайының көрсетілгенін тексереді қалаған формат, және сіз қайта енгізген құпия сөз дұрыс па. Содан кейін сценарий дерекқорда аттас пайдаланушы бар-жоғын тексереді, егер солай болса, қате туралы хабарлайды. Соңында, код пайдаланушыны дерекқорға қосады.

PHP коды

//жазу үшін сеансты бастауфункциясы Fix($str) ( //өрістерді тазалау $str = @trim($str); if (get_magic_quotes_gpc()) ( $str = жолақ сызықтары ($str); ) mysql_real_escape_string қайтару($str); ) $errmsg = массив(); //қателерді сақтау үшін массив$errflag = жалған ; //қате туы $UID = "12323543534523453451465685454";//бірегей идентификатор $username = Түзету($_POST["пайдаланушы аты"]); //Қолданушының аты$email = $_POST["электрондық пошта"]; //Электрондық пошта $password = Fix($_POST["password"]);//password $password = Fix($_POST["password"]);//парольді қайталау // пайдаланушы атын тексеріңіз if ($username == "") ( $errmsg = "Пайдаланушы аты жоқ"; //қате $errflag = шын ; //қате туралы жалаушаны көтеру) //Электрондық поштаны тексеріңіз if(!eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@+(\.+)*(\.(2,3) ))$", $email)) ( //пішімге сәйкес болуы керек: [электрондық пошта қорғалған]$errmsg = "Жарамсыз электрондық пошта"; //қате $errflag = шын; //қате туралы жалаушаны көтеру } //құпия сөзді тексеріңіз if ($password == "") ( $errmsg = "Пароль жоқ"; //қате $errflag = true ; //қате туралы жалаушаны көтеру } //құпия сөзді қайталауды тексеріңіз if ($password == "") ( $errmsg = "Қайталанатын құпия сөз жоқ";//қате $errflag = true ; //қате туралы жалаушаны көтеру } // құпия сөздің жарамдылығын тексеріңіз if (strcmp($password, $password) != 0) ( $errmsg = "Парольдер сәйкес келмейді";//қате $errflag = true ; //қате туралы жалаушаны көтеру } //пайдаланушы атының бос екенін тексеріңіз if ($username != "") ( $qry = "SELECT * FROM `users` WHERE `Username` = "$username""; // MySQL сұрау $нәтиже = mysql_query ($qry); if ($result) ( егер (mysql_num_rows ($нәтиже) > 0) ( //егер атау бұрыннан қолданыста болса$errmsg = "Пайдаланушы аты бұрыннан қолданыста"; //қате туралы хабар$errflag = шын; //қате туралы жалаушаны көтеру) mysql_free_result($нәтиже); )) //егер деректер тексерілмесе, тіркеу пішініне қайта бағыттайды if ($errflag) ( $_SESSION["ERRMSG"] = $errmsg; //қате туралы хабар session_write_close(); //сеансты жабутақырып («орын: register.php»); //қайта бағыттауШығу(); ) //мәліметтер қорына мәліметтерді қосу$qry = "INSERT INTO `userauth`.`users`(`UID`, `Username`, `Электрондық пошта`, `Пароль`) VALUES("$UID","$username","$email","" . md5 ($пароль) . "")"; $нәтиже = mysql_query($qry); //қосу сұрауының сәтті болғанын тексеріңіз if ($result) ( echo "Тіркелгеніңіз үшін рахмет, " .$username . ". Жүйеге кіріңіз. Мұнда"; exit (); ) else ( die ("Қате, кейінірек тексеріңіз"); ) ?>

Сондай-ақ пайдаланушыны жүйеден шығару үшін сценарий жасау керек. Ол берілген бірегей идентификаторы және аты бар пайдаланушы үшін сеансты тоқтатады, содан кейін пайдаланушыны кіру бетіне қайта бағыттайды.

PHP коды

Соңында, «auth.php» сценарийі беттерді тек рұқсаты бар пайдаланушылар үшін қолжетімді ету үшін пайдаланылуы мүмкін. Ол кіру деректерін тексереді және егер ол дұрыс болса, пайдаланушыға беттерді қарауға мүмкіндік береді, ал егер жоқ болса, жүйеге кіруді сұрайды. Сонымен қатар, егер біреу сеанстардың бірін жасау арқылы сайтты бұзуға әрекеттенсе, жалпы жағдайдағыдай ол тоқтатылады.

PHP коды

Жоғарыдағы кодтағы шарттардың бірі - ішіндегі сұрақтың тақырыбы.

Авторизацияланған пайдаланушыларға арналған бетте келесі кодты енгізу керек, ол, мысалы, «member.php» деп аталады және сіз оны қалағаныңызша атай аласыз.

PHP коды

Бұл бетке кіруге рұқсатыңыз бар. Шығу ( )

Пайдаланушы аутентификациясы дайын!

Қайырлы күн достар! РНР-де пайдаланушыларды тіркеуді қарастырайық. Алдымен, пайдаланушыны тіркеу шарттарын анықтайық:

  • Құпия сөз алгоритм арқылы шифрланады MD5
  • Құпия сөз "тұз" болады
  • Жүйеге кіру бос емес тексеру
  • Пайдаланушыны хат арқылы белсендіру.
  • Мәліметтерді жазу және сақтау ДҚБЖ MySQL

Жазу үшін бұл сценарийпайдаланушы тіркеуінің не екенін түсінуіміз керек. Пайдаланушыны тіркеу – бұл нақты пайдаланушы деректерін алу, деректерді өңдеу және сақтау.

Түсіндірсеңіз қарапайым сөзбен айтқандаонда тіркеу - бұл біздің жағдайда пайдаланушыға авторизациялай алатын белгілі бір деректерді жазу және сақтау - бұл Логин және Құпиясөз.

Авторизация – белгілі бір тұлғаға немесе адамдар тобына белгілі бір әрекеттерді жасауға құқық беру, сондай-ақ осы әрекеттерді жасауға әрекет жасаған кезде осы құқықтарды тексеру процесі. Қарапайым тілмен айтқанда, авторизацияның көмегімен біз сайтымыздағы белгілі бір мазмұнға кіруді шектей аламыз.

Авторизациямен логинді енгізу үшін сценарий каталогының құрылымын қарастырайық. Біз сценарийлерді логикалық бөліктерге бөлуіміз керек. Біз тіркеу және авторизациялау модульдерін бөлек каталогқа орналастырдық. Сондай-ақ дерекқор қосылымын бөлек каталогтарға орналастырамыз. MySQL, файлымен реттелетін функциялар, стиль файлы cssжәне біздің шаблон HTML. Бұл құрылымсценарийлер бойынша жылдам шарлауға мүмкіндік береді. Сізде көптеген модульдер және т.б. бар үлкен сайт бар деп елестетіп көріңіз. ал егер тәртіп болмаса, мұндай бейберекеттен бірдеңе табу өте қиын болады.

Өйткені біз барлық деректерді сақтаймыз ДҚБЖ MySQL, содан кейін тіркеу деректерін сақтайтын шағын кестені жасайық.

Алдымен мәліметтер базасында кесте құру керек. Үстелді шақырайық без_регқайда безкесте префиксі болып табылады, және облкесте атауы.

Кесте құрылымы: без_рег

-- -- `bez_reg` кесте құрылымы -- БАР БОЛМАСА КЕСТЕ ЖАСАҢЫЗ `bez_reg` (`id` int(11) NULL ЕМЕС AUTO_INCREMENT, `login` varchar(200) NULL ЕМЕС, `pass` varchar(32) NULL ЕМЕС , `salt` varchar(32) NULL ЕМЕС, `active_hex` varchar(32) NULL ЕМЕС, `status` int(1) NULL ЕМЕС, БАСТАУЫШ КҮЙСЕ (`id`)) ENGINE=MyISAM Әдепкі CHARSET=utf8 AUTO_INCREMENT=1;

Енді әрі қарай жұмыс істеу үшін негізгі сценарийлерді жасайық.

INDEX.PHP ФАЙЛЫ

CONFIG.PHP ФАЙЛЫ

"); ?>

404.HTML файлы

Қате 404

Қате 404

Бетте 404 қате болды

Қайту

BD.PHP файлы

INDEX.HTML ФАЙЛЫ

PHP MySQL пайдаланушысын белсендіру электрондық поштасымен тіркеу

FUNCT.PHP ФАЙЛ

"."\n"; if(is_array($data)) ( foreach($deta $val ретінде) $err .= "

  • ".$val."
  • "."\n"; ) else $err .= "
  • ".$деректер."
  • "."\n"; $err .= ""."\n"; return $err; ) /**Қарапайым MySQL сұрау ораушысы * @param жолы $sql */ функциясы mysqlQuery($sql) ( $res = mysql_query($sql); /* Нәтижені тексеру Бұл көрсетіледі. MySQL-ге жіберілген нақты сұрау, сонымен қатар қате.*/ if(!$res) ( $хабарлама = "Қате сұрау: " . mysql_error() . "\n"; $хабарлама .= "Толық сұрау: " . $ sql; die($message); ) return $res; ) /**Қарапайым тұз генераторы * @param жолы $sql */ функциясы salt() ( $salt = substr(md5(uniqid()), - 8); return $тұз;)

    Тіркеуді жазуды бастайық. Алдымен, пайдаланушы өңдеуге өз деректерін енгізе алатындай етіп тіркеу формасының үлгісін жасауымыз керек. Әрі қарай, пайдаланушы енгізген деректердің дұрыстығын тексеретін пішін өңдеушісінің өзін жазуымыз керек. Деректер сәтті тексерілгеннен кейін біз оны дерекқорымызға жазамыз және оның тіркелгісін белсендіру үшін пайдаланушыға электрондық хат жібереміз.

    REG.PHP ФАЙЛ

    Сіз сәтті тіркелдіңіз! Тіркелгіңізді белсендіріңіз!!"; //Тіркелгіні белсендіру if(isset($_GET["key"]))) ( //Кілтті тексеріңіз $sql = "SELECT * FROM `". BEZ_DBPREFIX ."reg` WHERE `active_hex` = "". escape_str ( $_GET["key"]) ."""; $res = mysqlQuery($sql); if(mysql_num_rows($res) == 0) $err = "Іске қосу кілті жарамсыз!"; //Қателерді тексеру және пайдаланушыға көрсету if(count($err) > 0) echo showErrorMessage($err); else ( //Пайдаланушының мекенжайын алу $row = mysql_fetch_assoc($res); $email = $row["логин"]; //Тіркелгі пайдаланушысын белсендіру $sql = "UPDATE `".BEZ_DBPREFIX ."reg` SET `status` = 1 WHERE `login` = "".$email ."""; $res = mysqlQuery($sql); / /Активтендіру электрондық поштасын жіберу $title = "(!LANG:http://web-сайтындағы тіркелгіңіз сәтті іске қосылды."; $message = "Поздравляю Вас, Ваш аккаунт на http://сайт успешно активирован"; sendMessageMail($email, BEZ_MAIL_AUTOR, $title, $message); /*Перенаправляем пользователя на нужную нам страницу*/ header("Location:". BEZ_HOST ."less/reg/?mode=reg&active=ok"); exit; } } /*Если нажата кнопка на регистрацию, начинаем проверку*/ if(isset($_POST["submit"])) { //Утюжим пришедшие данные if(empty($_POST["email"])) $err = "Поле Email не может быть пустым!"; else { if(!preg_match("/^!} [электрондық пошта қорғалған](+\.)+(2,6)$/i", $_POST["email"])) $err = "Электрондық пошта қате енгізілді"."\n"; ) if(empty($_POST[ "өту" ])) $err = "Құпия сөз өрісі бос болуы мүмкін емес"; if(empty($_POST["pass2"])) $err = "Құпия сөзді растау өрісі бос болуы мүмкін емес"; //Қателерді тексеріңіз және пайдаланушыға көрсетіңіз, егер (count($err) > 0) echo showErrorMessage($err); else ( /*Енгізілген деректерді тексеруді жалғастыру Сәйкес құпия сөздерді тексеру*/ if($_POST["pass"] != $_POST["pass2" ] ) $err = "Құпия сөздер сәйкес келмейді"; //Қателерді тексеріңіз және пайдаланушыға көрсетіңіз if(count($err) > 0) echo showErrorMessage($err); else ( /*Бізде мұндай пайдаланушы бар-жоғын тексеріңіз дерекқор* / $sql = "".BEZ_DBPREFIX ."reg` WHERE `login` = "".escape_str($_POST["email"]) ."""; $res = mysqlQuery($). sql); if(mysql_num_rows($res) > 0) $err = "Кіру кешіріңіз: ". $_POST["электрондық пошта"] ."бос емес!"; //Қателерді тексеріп, пайдаланушыға көрсетіңіз if(count($err) > 0) echo showErrorMessage($err); else ( //Тұздың ХЕШ-ін алыңыз $salt = salt(); // Құпия сөзді тұздаңыз $pass = md5(md5($_POST["pass"]).$salt); /*Егер бәрі жақсы болса, деректерді дерекқорға жазыңыз*/ $sql = "INSERT INTO `". BEZ_DBPREFIX ."reg ` VALUES("", "" .escape_str($_POST["email"]) ."", "". $pass ."", "". $salt ."", "". md5($salt) . "", 0)"; $ res = mysqlQuery($sql); //Іске қосу электрондық поштасын жіберу $url = BEZ_HOST ."less/reg/?mode=reg&key=". md5($salt); $title = "(! LANG: http:/ /сайтында тіркелу"; $message = "Для активации Вашего акаунта пройдите по ссылке ". $url .""; sendMessageMail($_POST["email"], BEZ_MAIL_AUTOR, $title, $message); //Сбрасываем параметры header("Location:". BEZ_HOST ."less/reg/?mode=reg&status=ok"); exit; } } } } ?>!}

    REG_FORM.HTML ФАЙЛ

    PHP MySQL пайдаланушысын белсендіру электрондық поштасымен тіркеу

    Электрондық пошта *:
    Құпия сөз *:
    Құпия сөзді растау *:

    Белгішесі бар өрістер *қажет

    Пайдаланушыны тіркеу дайын болғандықтан, авторизацияны жазу уақыты келді. Біз пайдаланушы авторизациясы үшін пішін жасаймыз, содан кейін авторизация пішінінің өңдеушісін жазамыз және соңында сценарий жасаймыз. show.phpбұл жүйеде авторизацияланғанымызды немесе жоқтығын көрсетеді.

    AUTH.PHP ФАЙЛЫ

    0) echo showErrorMessage($err); else ( /*Пайдаланушының аутентификациясы үшін дерекқорды алу сұрауын жасаңыз*/ $sql = "SELECT * FROM `". BEZ_DBPREFIX ."reg` WHERE `login` = "". escape_str($_POST["email"]) ." " AND `status` = 1"; $res = mysqlQuery($sql); //Егер логин сәйкес келсе, құпия сөзді тексеріңіз if(mysql_num_rows($res) > 0) ( //Кестеден деректерді алу $row = mysql_fetch_assoc( $res) ); if(md5(md5($_POST["pass"]).$row["solt"]) == $row["pass"]) ( $_SESSION["user"] = true; // Параметрлерді қалпына келтіру header("Орын:". BEZ_HOST ."less/reg/?mode=auth"); exit; ) else echo showErrorMessage("Қате құпия сөз!"); ) else echo showErrorMessage("Кіру ". $_POST["электрондық пошта"] ."табылмады!"); ))) ?>

    PHP соңғы нұсқасы бар адамдар үшін мен осы сценарийді қолдана отырып жариялаймын PDOөйткені ұзарту MySQLескірген және PHP жаңа нұсқасынан жойылған. Тіркеу және авторизация php mysql pdo жүктеп алыңыз

    Мұрағат 2015 жылдың 24 ақпанында жаңартылды.

    Назар аударыңыз:Егер сіз бұл сценарийді жергілікті серверде пайдалансаңыз ДЕНВЕР,XAMPP, содан кейін пошта жәшігіңізге хаттарды күтпеу керек. Хаттар түтікте жіберу. В Денверсіз оларды жолда таба аласыз Z:\tmp\!sendmail\Бұл файлдарды кез келген электрондық пошта клиентінде ашуға болады.

    Функцияны пайдалануға болады тақырып()хабарлама жіберу үшін «Аутентификация қажет»шолғышты пайдаланушы аты мен құпия сөзді енгізу терезесін көрсетуге мәжбүрлейді. Пайдаланушы логин мен құпия сөзді толтырғаннан кейін, PHP сценарийін қамтитын сілтеме PHP_AUTH_USER , PHP_AUTH_PW және AUTH_TYPE сәйкес логин, құпия сөз және аутентификация түріне орнатылған алдын ала анықталған айнымалы мәндермен қайтадан шақырылады. Бұл алдын ала анықталған айнымалылар $_SERVER және $HTTP_SERVER_VARS массивтерінде сақталады. Екі түрге де қолдау көрсетіледі: «Негізгі» және «Дайджест» (PHP 5.1.0 нұсқасы бойынша). Мәліметтерді функцияны қараңыз. тақырып().

    Клиентті бетті көру үшін жүйеге кіруге мәжбүрлейтін сценарий фрагментінің мысалы:

    Beispiel №1 HTTP аутентификациясының негізгі мысалы

    егер (!isset($_SERVER [ "PHP_AUTH_USER" ])) (
    тақырып( "WWW-аутентификация: негізгі аймақ = "Менің аймағым"");

    жаңғырық «Егер жіберілетін мәтін
    егер пайдаланушы Болдырмау түймесін басқан болса»
    ;
    Шығу;
    ) басқа (
    жаңғырық
    "

    Сәлем ( $_SERVER [ "PHP_AUTH_USER" ]).

    " ;
    жаңғырық "

    Сіз құпия сөз енгіздіңіз( $_SERVER [ "PHP_AUTH_PW" ]) .

    " ;
    }
    ?>

    Beispiel №2 Digest HTTP аутентификация мысалы

    Бұл қарапайым Digest HTTP аутентификация сценарийін іске асыру мысалы. Толық ақпаратты RFC 2617 бөлімінен қараңыз.

    $realm = "Шектеулі аумақ" ;

    // пайдаланушы => құпия сөз
    $users = array("admin" => "mypass" , "қонақ" => "қонақ");

    егер (бос($_SERVER [ "PHP_AUTH_DIGEST" ])) (
    header("HTTP/1.1 401 рұқсат етілмеген");
    тақырып( "WWW-аутентификация: дайджест аймағы="". $алымдар.
    "",qop="auth",nonce="" . uniqid(). "",мөлдір емес="" . md5 ($realm ). """);

    өлу( «Пайдаланушы «Болдырмау» түймесін басқан кезде жіберілетін мәтін».);
    }

    // PHP_AUTH_DIGEST айнымалысын талдау
    егер (!($деректер = http_digest_parse ($_SERVER [ "PHP_AUTH_DIGEST" ])) ||
    !isset($users [ $data [ "username" ]]))
    өлу( «Деректер қате!»);

    // дұрыс жауапты жасаңыз
    $A1 = md5 ($data [ "username" ] . ":" . $realm. ":" . $users [ $data [ "username" ]]);
    $A2 = md5($_SERVER [ "REQUEST_METHOD" ]. ":" . $деректер [ "uri" ]);
    $valid_response = md5 ($A1 . ":" . $data [ "nonce" ]. ":" . $data [ "nc" ]. ":" . $data [ "cnonce" ]. ":" . $data [ "qop" ]. ":" . $A2 );

    егер ($деректер [ "жауап" ] != $valid_response )
    өлу( «Деректер қате!»);

    // жарайды, логин мен пароль дұрыс
    echo "Сіз жүйеге келесі түрде кірдіңіз: " . $data["username"];

    // http auth тақырыбын талдау функциясы
    функциясы http_digest_parse($txt )
    {
    // жетіспейтін деректерден қорғау
    $needed_parts = array("nonce" => 1 , "nc" => 1 , "cnonce" => 1 , "qop" => 1 , "пайдаланушы аты" => 1 , "uri" => 1 , "жауап" => 1);
    $деректер = массив();
    $keys = implode ("|" , массив_кілттері ($needed_parts ));

    preg_match_all ("@(" . $keys . ")=(?:([\""])([^\2]+?)\2|([^\s,]+))@", $txt , $сәйкестіктер , PREG_SET_ORDER );

    Foreach ($м сәйкес келеді) (
    $деректер [ $m [ 1 ]] = $m [ 3 ] ? $m [ 3 ] : $m [ 4 ];
    unset($needed_parts [ $m [ 1 ]]);
    }

    $needed_parts қайтарылсын ба? false : $data ;
    }
    ?>

    Пікір: Үйлесімділік ескертпесі

    HTTP тақырыптарын көрсету кезінде әсіресе сақ болыңыз. Әртүрлі клиенттердің ең көп санымен максималды үйлесімділікке кепілдік беру үшін «Негізгі» сөзі «B» бас әріппен жазылуы керек, аймақ (салмақ) қос (бір емес!) тырнақшаға алынуы керек және дәл бір бос орынның алдында болуы керек. код 401 атауында HTTP/1.0 401. Аутентификация параметрлері жоғарыдағы Digest аутентификация мысалында көрсетілгендей үтірмен бөлінуі керек.

    Экранда PHP_AUTH_USER және PHP_AUTH_PW айнымалы мәндерін көрсетудің орнына, олардың дұрыстығын тексеру қажет болуы мүмкін. Ол үшін дерекқор сұрауын пайдаланыңыз немесе dbm файлында пайдаланушыны іздеңіз.

    Internet Explorer шолғышының мүмкіндіктерін байқауға болады. Ол жіберілетін тақырыптардың параметріне өте талап етеді. Тақырып трюк WWW-аутентификациякүйді жіберу алдында HTTP/1.0 401әзірге ол оған жұмыс істейді.

    Біреудің сыртқы аутентификацияны пайдаланатын бетке құпия сөзді ашатын сценарий жазуына жол бермеу үшін, егер бұл бет сыртқы аутентификацияны пайдаланса және қауіпсіз режим орнатылған болса, PHP_AUTH айнымалылары орнатылмайды. Қарамастан, REMOTE_USER айнымалысы сыртқы аутентификацияланған пайдаланушыны аутентификациялау үшін пайдаланылуы мүмкін. Сондықтан сіз әрқашан $_SERVER["REMOTE_USER"] айнымалы мәнін пайдалана аласыз.

    Пікір: Конфигурация ескертпесі

    РНР директивалық көрсеткішті пайдаланады AuthTypeсыртқы аутентификацияның пайдаланылғанын немесе пайдаланылмайтынын көрсету үшін.

    Жоғарыда айтылғандардың барлығы авторизацияны қажет ететін беттерге арналған құпия сөздерді бір серверде орналасқан рұқсатсыз беттерді басқаратын кез келген адам ұрлауына кедергі жасамайтынын ескеру қажет.

    Netscape Navigator және Internet Explorer екеуі де серверден 401 күйін алған кезде берілген аймақ үшін ағымдағы терезенің аутентификация кэшін тазартады.Бұл пайдаланушыны жүйеден шығуға мәжбүрлеу және пайдаланушы аты мен құпия сөз диалогтық терезесін қайта көрсету үшін пайдаланылуы мүмкін. Кейбір әзірлеушілер мұны кіру уақытын шектеу немесе жүйеден шығу түймешігін қамтамасыз ету үшін пайдаланады.

    Beispiel №3 HTTP аутентификация мысалы жаңа логин/пароль жұбын мәжбүрлейді

    функция аутентификация()(
    тақырып( "WWW-аутентификация: негізгі аймақ="Тестілеу аутентификация жүйесі"");
    header("HTTP/1.0 401 рұқсат етілмеген");
    жаңғырық "Ресурсқа кіру үшін жарамды пайдаланушы аты мен құпия сөзді енгізу керек \n";
    Шығу;
    }

    егер (!isset($_SERVER [ "PHP_AUTH_USER" ]) ||
    ($_POST [ "SeenBefore" ] == 1 && $_POST [ "OldAuth" ] == $_SERVER [ "PHP_AUTH_USER" ])) (
    аутентификация();
    ) басқа (
    жаңғырық "

    Қош келдіңіз: ». htmlspecialchars ($_SERVER [ "PHP_AUTH_USER" ]) . "
    " ;
    жаңғырық «Алдыңғы кіру:». htmlspecialchars($_REQUEST["OldAuth"]);
    жаңғырық "

    \n";
    жаңғырық "\n";
    жаңғырық ". htmlspecialchars ($_SERVER [ "PHP_AUTH_USER" ]) . "\" />\n" ;
    жаңғырық "\n";
    жаңғырық»

    \n" ;
    }
    ?>

    Бұл мінез-құлық стандарттармен реттелмейді HTTP Basic-аутентификация, сондықтан оған тәуелді болмау керек. Браузерді тестілеу Сілеусінсоны көрсетті Сілеусінсерверден 401 күйін алған кезде авторизация кэшін тазартпайды және ретімен «Артқа», содан кейін «Алға» түймесін басу арқылы, талап етілетін авторизация атрибуттары өзгермеген жағдайда, мұндай бетті ашуға болады. Дегенмен, пайдаланушы пернені баса алады "_" аутентификация кэшін тазалау үшін.

    PHP CGI нұсқасы бар IIS серверінде HTTP аутентификациясының дұрыс жұмыс істеуі үшін сіз "" деп аталатын IIS конфигурациясының параметрін өңдеуіңіз керек. Каталог қауіпсіздігі". Жазуын басыңыз " Өңдеу"және опцияны орнатыңыз" Анонимді кіру", барлық басқа өрістер құсбелгісіз қалдырылуы керек.

    Пікір: IIS туралы ескерту:
    HTTP аутентификациясы IIS жүйесінде дұрыс жұмыс істеуі үшін PHP конфигурациясындағы cgi.rfc2616_headers опциясы келесіге орнатылуы керек. 0 (әдепкі мән).

    Пікір:

    Қауіпсіз режим пайдаланылған жағдайда, ағымдағы сценарийдің UID коды қосылады патшалықтар- тақырып бөлігі WWW-аутентификация.

    Бұл мақала ескірген.

    Бұл мақала 2019 жылдың 1 маусымында ескірген ортақ хостинг қызметі үшін жазылған.

    Ағымдағы хостинг қызметіне біздің веб-сайтта тапсырыс беруге болады

    PHP көмегімен HTTP авторизациясы

    Бұл мақалада PHP көмегімен HTTP авторизациясын жасау жолы сипатталған, ол сайттың кез келген бөлімін, мысалы, әкімшілік бөлігін жабуға мүмкіндік береді.

    Түпнұсқалық растама үшін HTTP сервер клиент сұрауына қарсы шығу үшін және клиент аутентификация ақпаратын қамтамасыз ету үшін пайдалана алатын қарапайым шақыру-жауап механизмін қамтамасыз етеді. Ең көп тараған авторизация схемасы негізгі аутентификация схемасы болып табылады.

    «Негізгі» аутентификация схемасы пайдаланушы агенті (браузер) әрбір қорғалған аймақ (аймақ) үшін пайдаланушы идентификаторымен (пайдаланушы аты) және құпия сөзбен аутентификациялануы қажет екендігіне негізделген. Сервер берілген қауіпсіз аймақ үшін пайдаланушы идентификаторы мен құпия сөздің дұрыстығын тексере алса, сұрауды орындайды. Бұл схемада сәйкестендірудің қосымша параметрлері қарастырылмаған.

    Сәйкестендіру сұрауын алғаннан кейін сервер келесіге ұқсас шақырумен жауап береді:

    WWW-аутентификация: Basic realm="Шектеулі аймақ" HTTP/1.1 401 Рұқсат етілмеген

    Мұндағы "Шектеулі аумақ" - сұралған URI (Сұраныс-URI) қорғалған аймағын анықтайтын сервер тағайындаған жол. Қарапайым тілмен айтқанда, қорғалатын аумақтың атауы.

    Әрі қарай, кіру құқықтарын алу үшін пайдаланушы агенті (браузер) серверге base64-кодталған ұсыныстар тізбегінің (тіркеу деректері) ішінде бір қос нүкте белгісімен («:») бөлінген пайдаланушы идентификаторын (пайдаланушы аты) және құпия сөзді жібереді:

    Basic-credentials = "Basic" basic-cookie

    Мұнда

    • basic-cookie -- пайдаланушы рұқсаты бар base64 кодталған жол
    • user-pass -- "userid:password" сияқты жол
    • пайдаланушы идентификаторы -- құрамында ":" таңбалары жоқ мәтін
    • пароль -- мәтін

    Пайдаланушы аты мен құпия сөздің екеуі де регистрді ескереді. Яғни, мысалы, Пайдаланушы мен пайдаланушы екі түрлі пайдаланушы аты.

    HTTP аутентификациясы және PHP

    Сіз PHP-мен бірге Basic авторизация схемасын әлдеқашан пайдаланған болуыңыз мүмкін және әдістің мәні веб-серверден PHP_AUTH_USER және PHP_AUTH_PW айнымалыларын алу екенін білесіз, олар сәйкесінше пайдаланушы аты мен құпия сөзді анықтайды және оларды қандай да бір түрде PHP ішінде өңдейді. -скрипт. Бірақ бұл әдіс PHP Apache веб-сервер модулі ретінде жұмыс істегенде ғана тиімді екенін ескеріңіз. Біздің хостингімізде PHP CGI/FastCGI режимінде жұмыс істейді және жоғарыда сипатталған әдіс жұмыс істемейді, өйткені PHP_AUTH_USER және PHP_AUTH_PW айнымалылары сценарий ішінде берілмейді.

    Дегенмен, бұл шектеуді айналып өту және пайдаланушы PHP сценарийіне енгізетін пайдаланушы аты мен құпия сөз мәндерін беру тәсілі бар. Осы мақсаттар үшін mod_rewrite құралдары пайдаланылады - Apache веб-серверінің модулі. Біз қолданатын ережелер келесідей:

    RewriteCond %(HTTP:Авторизация) ^Негізгі.* RewriteRule (.*) index.php?authorization=%(HTTP: Авторизация)

    HTTP арқылы sitename.ru/www/index.php файлына сұрау жасағанда, бұл ереже бос емес Авторизация өрісінің мазмұнын авторизация параметріне GET сұрауы ретінде жібереді. $_GET["authorization"] айнымалысының мазмұнын қарау үшін PHP қолданатын болсақ, біз тек жоғарыда сипатталған негізгі тіркелгі деректерін көреміз -- пішін жолын:

    preg_match("/^Basic\s+(.*)$/i", $_GET["авторизация"], $user_pass); list($user,$pass)=explode(":",base64_decode($user_pass));

    Бұл бізге екі айнымалыны береді, сәйкесінше пайдаланушы аты мен құпия сөзді қамтитын $user және $pass. Енді, жоғарыда айтылғандай, оларды қандай да бір жолмен өңдеу керек - мысалы, дерекқордағы немесе пайдаланушы тіркелгілері бар файлдағы ұқсас айнымалылармен салыстыру.

    Қорытынды

    Осы мақалада қарастырылған әдіс тек біздің хостингімізде ғана емес, сонымен қатар PHP CGI/FastCGI режимінде жұмыс істейтін және Apache + mod_rewrite веб-сервері ретінде пайдаланылатын барлық жерде сәтті жұмыс істейді.

    Жұмыс мысалдарының бастапқы мәтіндерін осы мақаланың Қосымшасынан таба аласыз.

    Қосымша. Сценарийдің бастапқы мәтіндері

    .htaccess файлының бастапқы мәтіні

    RewriteBase / RewriteCond %(HTTP:Авторизация) ^Негізгі.* RewriteRule (.*) index.php?authorization=%(HTTP: Авторизация) жүйесіндегі RewriteEngine

    PHP сценарийінің көзі

    $аутентификацияланған=0; if(isset($_GET["авторизация"])) ( if(preg_match("/^Basic\s+(.*)$/i", $_GET["авторизация"], $user_pass)) ( тізім($user) ,$pass)=explode(":",base64_decode($user_pass)); // Енгізілген тіркелгі деректерінің дұрыс екенін тексеріңіз if($user=="user" && $pass=="password") ( $authentication=1 ; ) ) ) if($authentication) ( // Аутентификация сәтті өтті echo("user: ".$user."
    pass: ".$pass); ) else (тақырып("WWW-аутентификация: Негізгі аймақ="Шектеулі аймақ""); тақырып("HTTP/1.1 401 рұқсат етілмеген"); echo("Кіруге тыйым салынды."); )

    Сайттың қозғалтқышы ретінде өздері жазған нәрсені пайдаланатын веб-шеберлер ерте ме, кеш пе FTP арқылы файлдарды өңдеу немесе дерекқормен тікелей жұмыс істеу арқылы сайтты жаңартудан шаршайды. Содан кейін сайтты интерактивті түрде жағымды көрініспен басқаруға мүмкіндік беретін әкімшілік сценарийлерін жазуды бастайды және соңында жаңарту процесін жағымдырақ етеді.

    Әдетте бұл жағдайда туындайтын бірінші сұрақ авторизация мәселесі болып табылады. Сіз сайтта әкімшілік бөлімді тапқан әрбір адамға оның басына келгеннің бәрін жасауға мүмкіндік бермейсіз. Бүгін біз қарапайым авторизацияны жазу процесін қарастырамыз.

    Біріншіден, бірнеше нақтылау нүктелері. Біріншіден, біз PHP тілінде жазамыз, өйткені бұл қазіргі уақытта мазмұнды басқару жүйелерін жазудың ең кең таралған тілі. Екіншіден, мен логин паролін енгізуге жауапты өздігінен жазылған сценарийлерге қарсымын. Сондықтан біз дөңгелекті қайта ойлап таппаймыз, яғни. авторизацияның өзіндік принципі, бірақ біз стандартты мүмкіндіктерді қолданамыз.

    Сонымен, біз негізгі аутентификацияны қолданамыз - мысалы, Rambler және басқа да көптеген сайттарда қолданылатын құпия сөзді енгізу терезесі.

    Қауіпсіз аймаққа кіру мүмкіндігі браузер терезесінің бүкіл сеансы үшін сақталады, бірақ оны жапқаннан кейін пайдаланушы аты мен құпия сөзді енгізу арқылы ғана жүйеге қайта кіруге болады. Яғни, сіздің компьютеріңізді пайдалана отырып, сіздің атыңыздан заңсыз әрекеттер жасау мүмкін емес. Бұл әдіс туралы тағы не жақсы? Ол үшінші тарап серверлерінен айнымалы мәндерді қабылдамайды және парольді үш рет қате енгізгеннен кейін бетті жаңартуға тура келеді, бұл болжау арқылы жүйені бұзуды қиындатады.

    Ал мынаған ұқсайды:

    Пайдаланушы енгізген логин $PHP_AUTH_USER айнымалысында, құпия сөз $PHP_AUTH_PW ішінде сақталады. Айтпақшы, дерекқорда осы атаумен пайдаланушы жазбасының бар-жоғын тексеруге назар аударыңыз - бұл ескеру қажет өте маңызды мәселе. Егер мұндай тексеру болмаса, бұл апатты нәтижелерге әкеледі - $ жол нөлге тең болады, яғни жоқ пайдаланушы аты мен бос құпия сөзді енгізу арқылы сіз қорғалған аймаққа кіре аласыз.

    Нұсқаулар арасында Тақырып («HTTP/1.0 401 рұқсат етілмеген»); және exit(); біз кез келген нәрсені енгіземіз - мұнда бара алмайтын қарапайым сөйлемнен бір жерге бару, ұшу, қашу, жорғалау және т.б. ұсынысқа дейін. Иә, мен ұмытып кете жаздадым - $dbhost, $dbuser, $dbpasswd және $dbname айнымалылары дерекқорға және дерекқордың атауына кіруді қамтамасыз ететін деректерді сақтайды.

    Мұндай кодты қорғалған аймақтың әрбір бетіне енгізу керек, мысалы, include арқылы.

    Мұнда сіз қорғалғансыз. Мен өз атымнан осылайша құпия сөзді енгізу маған өте ыңғайлы және сенімді болып көрінетінін қоса аламын.

    Мақала ұнады ма? Достарыңызбен бөлісіңіз!
    Бұл мақала пайдалы болды ма?
    Иә
    Жоқ
    Пікіріңізге рахмет!
    Бірдеңе дұрыс болмады және сіздің дауысыңыз есептелмеді.
    Рақмет сізге. Сіздің хабарламаңыз жіберілді
    Мәтіннен қате таптыңыз ба?
    Оны таңдаңыз, басыңыз Ctrl+Enterжәне біз оны түзетеміз!