Security ( คลาสที่เกี่ยวกับการเข้ารหัส )

คลาสนี้ใช้ในการสร้างระบบรักษาความปลอดภัยต่างอย่างเช่น การเข้ารหัสเพื่อใช้ใน password,session,cookie <a name="configuration"></a>

<a name="storing-passwords"></a> ## การเก็บรหัสผ่าน

Class Hash ของ laravel ใช้ส่วนขยาย Bcrypt ของ php มาพัฒนาต่อยอด

การสร้างค่า hash

1 $password = Hash::make('secret');

การตรวจสอบค่า hash

1 if (Hash::check('secret', $hashedPassword))
2 {
3 	// The passwords match...
4 }

ตรวจว่า password ต้องการเข้ารหัสอีกครั้ง กรณีลืมรหัสผ่าน

1 if (Hash::needsRehash($hashed))
2 {
3 	$hashed = Hash::make('secret');
4 }

<a name="authenticating-users"></a> ## การยืนยันตัวบุคคล

การล็อกอิน laravel เตรียมเมทอด Auth::attempt มาให้ตัวอย่างการใช้งาน

1 if (Auth::attempt(array('email' => $email, 'password' => $password)))
2 {
3 	return Redirect::intended('dashboard');
4 }

ค่า email เราสามารถเปลี่ยนไปตามใจเราได้ครับ ส่วนเมทอด Redirect::intended ใช้ส่งผู้ใช้งานกลับไปที่ลิ้งที่เข้าเรียกมาครับ

เมื่อเมทอด attempt ถูกเรียก event auth.attempt จะถูกเรียกและ event auth.login จะถูกเรียกเมื่อการเข้าสู่ระบบสำเร็จ

ตรวจสอบว่ามีการล็อกอินค้างอยู่ไหม

1 if (Auth::check())
2 {
3 	// The user is logged in...
4 }

ตัวอย่างการปรับปรุงเมทอด attempt ให้สามารถทำการจำชื่อผู้ใช้กับรหัสผ่านได้

1 if (Auth::attempt(array('email' => $email, 'password' => $password), true))
2 {
3 	// The user is being remembered...
4 }

การกำหนดเงื่อนไขตอนล็อกอิน

1 if (Auth::attempt(array('email' => $email, 'password' => $password, 'active' => 1\
2 )))
3 {
4     // 
5 }

การเข้าถึงเข้อมูลคนที่ล็อกอิน

1 $email = Auth::user()->email;

ใช้เมทอด loginUsingId เพื่อดึง Id ของคนที่ล็อกอินมา

1 Auth::loginUsingId(1);

สมมุตว่าเรากำหนดว่าการเปลี่ยนแปลงเลขบัตรเครดิตต้องใช้รหัสผ่านยืนยันเพิ่มเติม เมทอด validate สามารถทำงานนี้ให้เราได้

การใช้งานการยืนยันตัวตนโดยไม่ได้เข้าสู่ระบบ

1 if (Auth::validate($credentials))
2 {
3 	//
4 }

<br /><br /><br />

การล็อกอินแบบไม่มี session หรือ cookies

1 if (Auth::once($credentials))
2 {
3 	//
4 }

เมทอดที่ใช้ล็อกเอาท์

1 Auth::logout();

<a name="manually"></a> ## การจำลองการล็อกอิน

การล็อกอินแบบ ที่เราจำลองขึ้้นมาเองครับ เมทอดlogin ใช้ค่าจากฐานข้อมูลมาล็อกอินได้ทันทีเลย

1 $user = User::find(1);
2 
3 Auth::login($user);

การป้องกัน CSRF

ทำการแนบค่า token เข้ากับฟอร์ม

1 <input type="hidden" name="_token" value="<?php echo csrf_token(); ?>">

ตรวจสอบค่า token ที่ถูกส่งมา

1 Route::post('register', array('before' => 'csrf', function()
2 {
3     return 'You gave a valid CSRF token!';
4 }));

<br /><br /><br /><br /><br /><br /> <a name="http-basic-authentication"></a> ## HTTP Basic Authentication

laravel เตรียม filter ชื่อ auth.basic เพื่อตรวจว่า มีการล็อกอินไหม

ตัวอย่าง

1 Route::get('profile', array('before' => 'auth.basic', function()
2 {
3 	// Only authenticated users may enter...
4 }));

โดยค่าเริ่มต้นเเล้วเมทอด basic ใช้คอลัมน์ email ในการตรวจสอบ ถ้าเราจะเปลี่ยนก็ใช้

1 return Auth::basic('username');

laravel เตรียมฟังก์ชัน Oncebasic มาเพื่อการล็อกอินแบบไม่สร้าง session ไว้เหมาะกับการให้ ผู้ใช้งานใช้ในกรณีไปล็อกอินเครื่องที่ไม่ใช่ของตัวเอง

ตัวอย่าง

1 Route::filter('basic.once', function()
2 {
3 	return Auth::onceBasic();
4 });

<br /><br /><br /> <a name="password-reminders-and-reset"></a> ## การจัดการการลืมรหัสผ่าน การลืมรหัสผ่านและการสร้างใหม่ ### ส่งรหัสผ่านใหม่

laravel เตรียมการมาให้เราสามารถสร้างระบบการส่และเปลี่ยนรหัสผ่าน ให้เราโดยการให้ User model ทำการสืบทอด Illuminate\Auth\Reminders\RemindableInterface.

การใช้งาน RemindableInterface

1 class User extends Eloquent implements RemindableInterface {
2 
3 	public function getReminderEmail()
4 	{
5 		return $this->email;
6 	}
7 
8 }

ต่อมาเราก็ต้องสร้างตารางให้ระบบลืมรหัสผ่านก่อนโดย php artisan auth:reminders

สร้างตัว migration ของตารางลืมรหัส

1 php artisan auth:reminders
2 
3 php artisan migrate

การส่งรหัสใช้เมทอด Password::remind

ตัวอย่างการใช้งาน

1 Route::post('password/remind', function()
2 {
3 	$credentials = array('email' => Input::get('email'));
4 
5 	return Password::remind($credentials);
6 });

หมายเหตุ: เราต้องสร้าง view ที่ชื่อ auth.reminder.emailเพื่อรับ email เองนะครับ

เราสามารถส่งข้อความเพิ่มเติมให้ผู้ใช้โดยส่งพารามิเตอร์ไป $message ไปในฟังก์ชัน remind

1 return Password::remind($credentials, function($message, $user)
2 {
3 	$message->subject('Your Password Reminder');
4 });

<br /><br /> โดยค่าเริ่มต้นเเล้วเมทอด remind จะส่งกลับมาที่หน้าที่เรียกใช้ ถ้าเกิดข้อผิดพลาดขึ้น ตัวแปร errorจะมีค่าขึ้นใน session ส่วนเมื่อสำเร็จตัวแปร success ก็จะปรากฏขึ้นมาใน session แทน หน้าตาของหน้า auth.reminder.email ควรเป็นแบบนี้ครับ

1 @if (Session::has('error'))
2 	{{ trans(Session::get('reason')) }}
3 @elseif (Session::has('success'))
4 	An e-mail with the password reset has been sent.
5 @endif
6 
7 <input type="text" name="email">
8 <input type="submit" value="Send Reminder">

<br /><br /> ### การรีเซตรหัสผ่าน

การสร้าง route เพื่อรับการที่ผู้ใช้งานกดลิ้งทำการรีเซตรหัสผ่าน

1 Route::get('password/reset/{token}', function($token)
2 {
3 	return View::make('auth.reset')->with('token', $token);
4 });

หน้า view ที่ทำการให้ผู้ใช้งานทำการเปลี่ยนรหัสผ่าน

1 @if (Session::has('error'))
2 	{{ trans(Session::get('reason')) }}
3 @endif
4 
5 <input type="hidden" name="token" value="{{ $token }}">
6 <input type="text" name="email">
7 <input type="password" name="password">
8 <input type="password" name="password_confirmation">

<br /><br /><br /><br /> ตัวอย่างการสร้าง route เพื่อทำการรับค่ารหัสผ่านใหม่

 1 Route::post('password/reset/{token}', function()
 2 {
 3 	$credentials = array('email' => Input::get('email'));
 4 
 5 	return Password::reset($credentials, function($user, $password)
 6 	{
 7 		$user->password = Hash::make($password);
 8 
 9 		$user->save();
10 
11 		return Redirect::to('home');
12 	});
13 });

ถ้าการเปลี่ยนรหัสผ่านสำเร็จ User instance และรหัสผ่านใหม่จะถูกเก็บลงฐานข้อมูลและ ส่งกลับไปหน้า home

<a name="encryption"></a> ## Encryption

Laravel เตรียมการเข้ารหัสแบบ AES-256 โดยส่วนเสริม mcrypt ของ PHP มาให้เเล้ว

กาเข้ารหัส

1 $encrypted = Crypt::encrypt('secret');

Note: มั่นใจว่าเราเปลี่ยนค่า key ตรงที่ app/config/app.php ไม่งั้นการเข้ารหัสจะไม่ค่อยปลอดภัยครับ

การถอดรหัส

1 $decrypted = Crypt::decrypt($encryptedValue);

การกำหนดรูปแบบต่างๆ

1 Crypt::setMode('ctr');
2 
3 Crypt::setCipher($cipher);