2010/04/30

PHP: Session-ы тухай && Login хийж нэвтрэх энгийн жишээ

Вэб програмчлалд зайлшгүй хэрэглэгддэг ойлголтуудын нэг нь Session юм. "Session" нь англи хэл дээр "хурал, чуулган" гэсэн утга илэрхийлдэг. Харин Вэб програмчлалын хувьд session гэдэг нь хэрэглэгч вэб үзэх(нэвтрэх гэх мэт) сервер дээр тухайн хэрэглэгчтэй холбоотой мэдээлэл(хувьсагч) сервер дээр үүсэх үйл явц хэмээн энгийнээр тайлбарлаж болох юм. Жишээ нь ямар нэг гишүүнчлэл бүхий сайтуудад уншигч, хэрэглэгчид өөрийн хэрэглэгчийн эрхээр нэвтрээд ижил хуудсуудаар "аялахад" тухайн хэрэглэгчид л хамаарах мэдээллүүдийг харуулдаг шүү дээ. Үүнийг session-ы тусламжтай програмчилдаг.

Дээрхи зургаас session-ыг боловсруулах үйл явцыг хялбархан ойлгож болно.

Одоо хэдэн энгийн жишээг PHP дээр нэвтрүүлье.

<?php
    session_start();
?>

Session ашиглахын тулд тухайн хуудасныхаа эхэнд session_start(); функцийг зайлшгүй дуудах ёстой.

<?php
    session_start();
    $_SESSION['hello'] = 'Hello World';
    echo $_SESSION['hello'];
?>

Session-д хадгалагдаж буй өгөгдөл(хувьсагч)-үүд $_SESSION[] массив хувьсагчид хандах байдлаар ажилладаг. Дээрхи жишээнд $_SESSION['hello'] хувьсагчид 'Hello World' утгыг оноож хэвлэж байна.

Дээрхи жишээг амжилттай туршсан бол Session-ы үйл ажиллагааг илүү сайн ойлгохын тулд дараах кодыг өөр эх файлд хадгалаад ажиллуулаад үз.

<?php
    session_start();
    echo $_SESSION['hello'];
?>

Энэ кодын хувьд $_SESSION['hello'] хувьсагчид утга оноогоогүй хэдий ч түрүүчийн файлыг ажиллуулахад үүссэн session-д утга оноогдон сервер дээр учир энэ файлд ч гэсэн $_SESSION['hello'] хувьсагч хүчин төгөлдөр үйлчилнэ гэсэн үг юм. Хичнээн Refresh хийж хуудсыг дахин дахин ачааллаж үзсэн ч зүгээр байгаа биз :)

Одоо session-ы талаар арай дэлгэрүүлэн ойлгоход дөхөм болгох үүднээс саяын эх кодыхоо төгсгөлд бүх session хувьсагчийг устгах session_destroy(); функцийг нэмж дуудаад үз.

<?php
    session_start();
    echo $_SESSION['hello'];
    session_destroy();
?>

Саяын хуудсаа 2 дахин ачааллаад үзвэл 'Hello World' тэмдэгт мөр хэвлэгдэхгүй болж байгааг анзаарсан уу? session_destroy() функц эхний удаа хуудас дуудалтанд биелсэн учир дараа дараачин дуудалтанд $_SESSION['hello'] хувьсагч устсан байгааг үүнээс анзаарч болно.

session устгахад session_destroy() функцээр бүх session-г устгахаас гадна тухайн нэг функцийн хувьд unset() функцийг ашиглах боломжтой.

<?php
session_start();  
if(isset($_SESSION['hello']))
    unset($_SESSION['hello']); 
?>

Session ашиглан уншигч та бүхэн өөрсдөө сэтгэмжлэн олон янзын жишээ туршиж үзэхийг зөвлөж байна. Миний зүгээс "амьд" жишээ болгох үүднээс нэвтрэх (login) маш энгийн жишээг бичиж үзүүлье.

login.php

<?php
    global $error;
    session_start();
    if(isset($_SESSION['user'])){
        header("Location: welcome.php");
    }
    
?>
<html>
    <head>
        <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
        <title>Нэвтрэх хэсэг</title>
    </head>
    <body>
        <form action="check.php" method="post" name="logform">
            <table>
                <tr>
                    <td>
                        Хэрэглэгчийн нэр:
                    </td>
                    <td>
                        <input type='text' name="user" />
                    </td>
                </tr>
                <tr>
                    <td>
                        Нууц үг:
                    </td>
                    <td>
                        <input type='password' name="pass" />
                    </td>
                </tr>
                <tr>
                    <td />
                    <td style='text-align:right;'>
                        <input type='submit' value="Нэвтрэх"/>
                    </td>
                </tr>
            </table>
            <?php
                echo $error;
            ?>
        </form>
    </body>
</html>

check.php

<?php
    session_start();
    $username = "ganaa";
    $password = "pass";
    $user = $_POST['user'];
    $pass = $_POST['pass'];
    if($user == $username && $pass == $password){
        $_SESSION['user'] = $user;
        header("Location: welcome.php");
    }
    else    {
        $error = "Хэрэглэгчийн нэр, эсвэл нууц үг буруу байна.";
        include("login.php");
    }
?>

welcome.php

<?php
    session_start();
    if(!isset($_SESSION['user'])){
        header("Location: login.php");
    }
?>
<html>
    <head>
        <title>Welcome <?php echo $_SESSION['user']; ?> </title>
    </head>
    <body>
        <p>
            <a href="logout.php">Log out</a>
        </p>
    </body>
</html>

logout.php

<?php
    session_start();
    if(isset($_SESSION['user'])){
        unset($_SESSION['user']);
    }
    session_destroy();
    header("Location: login.php");
?>

Session-той холбоотой функц, боломжуудын талаар илүү лавлагааг эндээс үзээрэй :)

10 comments:

  1. session_destroy();
    хийхэд бусад зарлагдсан session-уудыг устгаад байна уу үгүй юу.
    Би тэгж бодоод байдгийн.

    ReplyDelete
  2. тийм. session_destroy функцийг дуудахад бусад session оо устгачихадаг тал бий.

    Үүнээс сэргийлэх энгийн арга нь тулд unset() функцийг ашиглах юм уу даа. (ижил индекстэй session давхардах аюулаас аврахгүй)

    Ер нь олон прожект дээр ажиллаж байгаа үед virtual host үүсгэж ашиглах нь хамгий найдвартай санагдсан :)

    ReplyDelete
  3. Энэ нь шиг логин хийвэл амархан хакдуулаад тэгээд веб сайт чинь будаа болно. Арай advanced юм нийтэлж хийрхэл дээ

    ReplyDelete
  4. @Anonymous:

    Санаа оноогоо нэмэрлэхдээ нэрээ биччихэж байвал сайн байна.

    Хийрхэж бичсэнгүй. Тэгээд ч өөрийхөө блогтоо юу бичихээ би өөрөө шийднэ шүү, нэрээ ч биччихээс айгаад байгаа чам шиг нөхдүүдээр бол бүр ч заалгахгүй.

    Хэрэв өөрөө учиргүй advanced түвшний зүйл судалмаар байгаа бол нэтээс ухаад олохыг зөвлөе. Анхлан сурч байгаа хүүхдүүдэд зүг чиг, ойлголт өгөх үүднээс энэ бичлэгүүдийг оруулсан болно.

    Үнэхээр чадал чинь байвал энэ жишээн дээр бичсэн login-г хакдах аргыг коментээр үлдээгээрэй.

    ReplyDelete
  5. Tnx andaa nice Jishee bna. ASP.NET deer sessiontei login hiih talaar neg jishee oruulj uguuch plz!!!

    ReplyDelete
  6. Энэ Ганаагийн сүүлийн сэтгэгдэл дээр байгаа шиг АНХЛАН СУРЧ БАЙГАА ХҮҮХЭД байна аа би :P Естой гоё тайлбарлаж, үүнээс илүү яаж тайлбарлахав. Чи хол явна аа. Баярлалаа :D

    ReplyDelete
  7. @sumiya
    Thank a lot. I got confused this way. now i found mistake. I am just studying about php. again thaks..

    ReplyDelete
  8. Сайн байна уу? Session-ий хичээл ойлгомжтой, товчхон байна. Баярлалаа. PHP кодыг яаж нууцладаг юм бэ? энкрипт л хийдэг юм шиг байна лээ. Гэхдээ сайн ойлгохгүй юм. Энэ тал дээр туслаач. Хүч хөдөлмөрөө гаргаж хийсэн вэб-ээ хакдуулахаас үнэхээр айж байна. хэхэх

    ReplyDelete
  9. мааш их баярлалаа хэрэгтэй зүйл байна

    ReplyDelete
  10. mash ih taalagdlaa bayarlalaa

    ReplyDelete

Миний бичсэн бичлэг танд өчүүхэн ч болтугай хэрэг болсон бол сэтгэгдлээ бичиж үлдээхийг хүсье. Баярлалаа :)