Cách Laravel chống SQL Injection, CSRF, XSS


Laravel đảm bảo ứng dụng web của bạn được bảo vệ chống lại 3 nguy cơ bảo mật nghiêm trọng : SQL injection, cross-site request forgery (CSRF), và cross-site scripting (XSS). Bài viết ngắn gọn sau giúp các bạn hiểu được cách mà Laravel thực hiện.



1. SQL Injection
Cả Eloquent ORM và Query Builder của Laravel sử dụng tham số PDO ràng buộc để chống SQL injection. Tham số ràng buộc đảm bảo rằng người dùng không thể truy dữ liệu bằng một cấu query đã bị thay đổi nội dung. Chúng ta hãy xem ví dụ về một form nhập liệu cung cấp địa chỉ email để tìm kiếm trong bảng users. Nhưng thay vì thực hiện một câu truy vấn :
SELECT * FROM users WHERE email = 'minhbangchu@gmail.com'
thì người dùng lại thêm đoạn "or 1=1" vào sau câu truy vấn:
SELECT * FROM users WHERE email = 'minhbangchu@gmail.com' or 1=1
"1=1" là một biểu thức logic luôn đúng nên trong câu truy vấn trên toàn bộ dữ liệu trong bảng users sẽ bị show ra. Hoặc nguy hiểm hơn câu query trên có thể bị thay đổi như sau:
SELECT * FROM users WHERE email = 'minhbangchu@gmail.com'; drop table users;
Và lúc này bảng users sẽ bị xóa.
Tuy nhiên khi tham số ràng buộc PDO được sử dụng thì các dữ liệu truyền vào cấu query sẽ được trích dẫn (quote), và câu truy vấn phá hoại sẽ có dạng như sau:
SELECT * FROM users WHERE email = 'minhbangchu@gmail.com or 1=1'
SELECT * FROM users WHERE email = 'minhbangchu@gmail.com; drop table users'
Lúc này không có dữ liệu nào khớp với "minhbangchu@gmail.com or 1=1" hay "minhbangchu@gmail.com; drop table users" nên kết quả câu query trả về sẽ là không có record nào.

2. Cross-Site Request Forgery
Giả sử trong hệ thống các bạn có một action xử lý xóa người dùng với url như sau: domain.com/delete.php?id=12 (Xóa users có id = 12). Như vậy giả sử một người nào đó biết được URL này thì họ sẽ hack được, và họ sẽ lợi dụng chính admin của hệ thống. Họ sẽ gửi một email với nội dung là một hoặc nhiều thẻ hình ảnh (IMG) với SRC là url đó và mỗi hình có 1 id khác nhau (hoặc một hình thức link đặc biệt nào đó để lừa bạn click vào), như vậy nếu admin đọc cái email đó thì trường hợp admin đang login vào hệ thống thì admin đã vô tình xóa đi những user như trong SRC của các hình trên vì lúc này hệ thống của bạn đang hiểu rằng bạn đã xác thực. Đây là ví dụ đơn giản để bạn hiểu CSRF là gì còn ứng dụng của nó thì nhiều và cao thâm lắm. ^^
Laravel sử dụng CSRF token để đảm bảo rằng hệ thống không bị những request như vậy lừa. Laravel tạo ra một token mà phải được thông qua bởi nội dung form. Token này sẽ được so sánh với giá trị đã được lưu trong session người dùng, nếu khớp thì request mới được xem là hợp lệ.
Nếu bạn sử dụng html thuần để tạo form thì bạn sẽ khởi tạo token này như sau:
<form ...>
{!! csrf_field() !!}
</form>
Tuy nhiên theo tôi bạn nên sử dụng package LaravelCollective/html để khởi tạo form của bạn, lúc này CSRF token sẽ được tự động tạo và add vào cho bạn.

3. Cross-Site Scripting
Cross-site Scripting (XSS) là lỗ hổng cho phép hacker có thể chèn những đoạn mã client-script (thường là Javascript hoặc HTML) vào trang web, khi người dùng vào những trên web này, mã độc sẽ được thực thi trên trình duyệt của người dùng, dẫn đến việc mất cookies, mật khẩu, session hay fishing lừa đảo hay chèn virus...
 Larave sử dụng cấu trúc {{}} để bỏ qua bất cứ thực thể HTML nào khi đi kèm với biến lúc hiển thị. Giả sử harker của thể nhập chuỗi sau đây vào một comment hoặc khi thay đổi hồ sơ người dùng của họ trên ứng dụng của bạn:
My list <script>alert("spam spam spam!")</script>
Nếu chuỗi trên được phép lưu vào database mà không thông qua bộ lọc nào thì khi được hiển thị lên nó sẽ chạy một câu alert như hacker đã truyền vào. Đây là một ví dụ nhỏ để bạn dễ hình dung tuy nhiên với một cuộc tấn công tinh vi hơn, harker có thể chèn đoạn mã để tạo form nhắc nhở người dùng cung cấp một thông tin nhạy cảm nào đó sau đó gửi về cho họ...

Tuy nhiên khi hiển thị bạn đưa biến vào giữa cặp thẻ {{ $string }} Laravel sẽ tạo ra chuỗi như sau, và ngăn chặn được XSS:
My list &lt;script&gt;alert("spam spam spam!")&lt;/script&gt;
Nếu bạn thực sự muốn giữ lại html và render ra website, bạn có thể sử dụng cấu trúc sau:
{!! Some hopefully not dangerous string here. !!}
Trên thực tế bạn sẽ sử dụng cấu trúc này để xay dựng form sử dụng package LaravelCollective/html :
{!! Form::label('Your Notebook Name') !!}

Trên đây là 3 lỗi bảo mật cơ bản mà nguy hiểm được laravel hỗ trợ bảo vệ, ngoài ra Laravel cũng hỗ trợ bảo vệ các lỗi bảo mật nghiêm trọng khác như : Mass Assignment cùng với cơ chế hỗ trợ rất tốt cho Cookies và HTTPS.

0 Nhận xét:

Đăng nhận xét

Rất mong các ý kiến của các bạn khi đọc bài viết này !