เทคนิคการสร้างเวบเปลี่ยนรหัสผ่านบน linux

จาก Wiki Opensource

บันทึกนี้ปรับปรุงล่าสุดเมื่อวันที่ 10-02-2555

ดูแลโดย WIPAT

  • ทดสอบกับ ubuntu 10.04
  • เป็นเวบสำหรับให้ผู้ใช้เปลี่ยนรหัสผ่านด้วยตนเอง


  1. ต้องติดโปรแกรมต่างๆก่อนด้วยคำสั่งดังนี้
    sudo apt-get install apache2 php5 mkpasswd expect
  2. สร้างพื้นที่เก็บ script ไว้ที่ /var/www/myservice ด้วยคำสั่ง sudo mkdir -p /var/www/myservice
  3. สร้างแฟ้ม /var/www/myservice/check-shadow.sh มีข้อมูลดังนี้
    #!/bin/bash
    # usage: sudo check-shadow.sh 'username' 'password'
    # output true = correct , false = incorrect
    USER=$1
    MYPASS=$2
    SHADOWFILE="/etc/shadow"
    if [ -z "$2" ] ; then
      echo "false"
      exit 2
    fi
    BASEPASS=$(grep "^${USER}:" ${SHADOWFILE} )
    if [ -z "${BASEPASS}" ] ; then
      echo "false"
      exit 1
    fi
    DECODEPASS=$(echo "${BASEPASS}"|cut -d':' -f 2)
    TYPE=$(echo "${DECODEPASS}"|cut -c 1-2)
    case ${TYPE} in
      '$1' ) METHOD="md5" ;;
      '$5' ) METHOD="sha-256" ;;
      '$6' ) METHOD="sha-512" ;;
      * ) METHOD="des" ;;
    esac
    if [ "${METHOD}" = "des" ] ; then
      SID=${TYPE}
    else
      SID=$(echo "${DECODEPASS}"|cut -d '$' -f 3)
    fi
    GENPASS=$(mkpasswd -m ${METHOD} -S ${SID} ${MYPASS})
    if [ "${DECODEPASS}" = "${GENPASS}" ] ; then
      echo "true"
      exit 0
    fi
    echo "false"
    exit 3
  4. แล้วจัดให้ execute ได้ ด้วยคำสั่ง sudo chmod +x /var/www/myservice/check-shadow.sh
  5. สร้างแฟ้ม /var/www/myservice/change-passwd.exp มีข้อมูลดังนี้
    #!/usr/bin/expect
    # usage: expect change-passwd 'UserName' 'NewPassword'
    set timeout 5
    set DELAY 1
    set PASSWORD [lindex $argv 1]
    set USERNAME [lindex $argv 0]
    spawn passwd $USERNAME
    sleep $DELAY
    expect -nocase "password:"
    sleep $DELAY
    send "$PASSWORD\r"
    expect -nocase "password:"
    sleep $DELAY
    send "$PASSWORD\r"
    sleep $DELAY
    expect {
      -nocase "success" { puts "true" ; exit }
    }
    puts "false"
  6. แล้วจัดให้ execute ได้ ด้วยคำสั่ง sudo chmod +x /var/www/myservice/change-passwd.exp
  7. แก้ไขแฟ้ม /etc/sudoers ให้เพิ่มบรรทัดต่อท้ายว่า
    www-data ALL= NOPASSWD: /var/www/myservice/check-shadow.sh, /var/www/myservice/change-passwd.exp
  8. สร้างแฟ้ม /var/www/myservice/change-password.php มีข้อมูลดังนี้
    <?php
    function process_post() {
       $username=stripslashes(trim($_POST['username']));
       $password=stripslashes(trim($_POST['password']));
       $apspassword=stripslashes(trim($_POST['apspassword']));
       $confirmapspassword=stripslashes(trim($_POST['confirmapspassword']));
       if(empty($_POST['username'])) {
        echo "no Username";
        exit;
       }
       $myscript = "sudo /var/www/myservice/check-shadow.sh";
       $cmd="$myscript " . $username . " " . $password;
       $result=exec($cmd);
       if ($result == "false") {
        echo "$username wrong password";
        exit;
       }
       if(empty($_POST['apspassword'])||empty($_POST['confirmapspassword'])) {
        echo "no new password";
        exit;
       }
       if ($apspassword != $confirmapspassword) {
           echo "different new password";
        exit;
       }
       $myscript = "sudo /var/www/myservice/change-passwd.exp";
       $cmd="$myscript " . $username . " " . $apspassword;
       $result=exec($cmd);
       if ($result == "false") {
        echo "$username unsuccessful password changed";
        exit;
       }
       echo "$username password changed OK";
    }
       if ($_SERVER['REQUEST_METHOD'] == 'POST') process_post();

    ?> <html>
    <head>
    <link href="template_css.css" rel="stylesheet" type="text/css">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    </head>
            <body>
             <form action="<?= $_SERVER['SCRIPT_NAME'] ?>" method="post">
             <div align="center">
               <table>
                  <tr>
                     <td colspan=2><span class="button"> Change Password </span></td>
                  </tr>
                  <tr>
                     <td> 1. Username </td>
                     <td> <input name=username></td>
                  </tr>
                  <tr>
                     <td> 2. old Password </td>
                     <td> <input type=password name=password></td>
                  </tr>
                  <tr>
                     <td> 3. new Password </td>
                     <td> <input type=password name=apspassword></td>
                  </tr>
                  <tr>
                     <td> 4. new Password (again)</td>
                     <td> <input type=password name=confirmapspassword></td>
                  </tr>
                  <tr>
                     <td> </td>
                     <td>
                       <input type=submit value="Change Password">
                       <input type=reset value="Cancel">
                     </td>
                  </tr>
               </table>
             </div>
             </form>
            </body>
    </html>
  9. ทดสอบใช้งานโดยไปที่เวบ http://localhost/myservice/change-password.php