5 Thủ thuật bảo mật PHP căn bản

Bảo mật là điều được quan tâm nhiều nhất khi phát triển bất kỳ web app PHP nào. Bên dưới là 5 thủ thuật đơn giản giúp các bạn bảo vệ app của mình. Bài này mình chỉ tập trung vào những thủ thuật căn bản về bảo mật PHP những điều quan trọng mà mọi developer nên biết. Và các bạn cũng nhớ rằng bảo mật chỉ là quá trình chứ không phải là kết quả.


1. Input Filtering

Giả sử mọi thứ đều không an toàn cho đến khi bạn chứng minh chúng sạch sẽ. Thì việc filter tất cả source bên ngoài có lẽ biện pháp quan trọng nhất mà bạn có thể áp dụng. Cái này có thể dễ dàng như chạy vài script đơn giản dựng sẵn trong các biến.
Trước khi cho phép user nhập dữ liệu, đừng bao giờ dùng trực tiếp bất cứ gì trong $_GET or $_POST. Kiểm tra từng giá trị để bảo đảm nó sạch sẽ và gán nó vào local varible để dùng.


// input filtering examples
 
// Make sure it is an integer
$integer = intval($_POST['variable_name']);
 
// Make it safe to use in a URL
$url_string = urlencode($_POST['variable_name']);
Bạn cũng có thể kiểm tra, đối chiếu 1 giá trị bằng 1 danh sách các giá được chấp nhận. Có 2 cách để làm:
$page = 'home'; // initialize the variable
 
// Kiểm tra input với white-list các option đã được biết
$valid_options = array();
$valid_options[] = 'home';
$valid_options[] = 'downloads';
$valid_options[] = 'about';
 
if(in_array($_GET['page'], $valid_options))
{
   $page = $_GET['page'];
}
 
// Hoặc cái này cũng hoạt động
switch($_GET['page'])
{
   case 'home':
   case 'downloads':
   case 'about':
      $page = $_GET['page'];
      break;
}


Do PHP 5.2 cung cấp nhiều hàm filter để filter user data. Hàm filter_input() được dùng để truy nhập các biến input được filter. Theo cách này bạn không phải đụng tới input thô qua các array $_GET hoặ $_POST
// filter_input examples
 
// Bảo đảm nó là 1 integer
$integer = filter_input(INPUT_POST, 'variable_name', FILTER_SANITIZE_NUMBER_INT);
 
// Làm nó an toàn để dùng trong 1 URL
$url_string = filter_input(INPUT_POST, 'variable_name', FILTER_SANITIZE_ENCODED);
 
// Đảm báo nó là 1 URL hợp lệ
$url = filter_input(INPUT_POST, 'variable_name', FILTER_VALIDATE_URL);


2. Output Filtering

Không chỉ mình lọc đầu vào, lọc đầu ra cũng quan trọng. Bạn muốn tránh xuất những ký tự sai và làm bể quá trình render trang. Việc chặn những tất công liên quan tới Javascript cũng rất quan trọng. Có vài hàm có thể làm sạch text để display cho user:
  • htmlspecialchars(): Chuyển đổi những ký tự HTML thành phần tử
  • htmlentities():Chuyển đổi tất cả những ký tự thành phần từ HTML
  • strip_tags(): Loại bỏ tất cả những thẻ HTML khỏi 1 chuổi
$text = '<a href="test">Test</a>';
echo htmlspecialchars($text); // &lt;a href=&quot;test&quot;&gt;Test&lt;/a&gt;
echo strip_tags($text); // Test

3. Database Queries

Nếu app của bạn dùng database dể lưu trữ dữ liệu thì sẽ có 1 nguy cơ có thể bị tấn công. SQL Injection là 1 lkiểu tấn công phỏ biến, SQL Injection là một kĩ thuật cho phép những kẻ tấn công thi hành các câu lệnh truy vấn SQL bất hợp pháp (người phát triển không lường trước được) bằng cách lợi dụng lỗ hổng trong việc kiểm tra dữ liệu nhập từ các ứng dụng web. Để ngăn chặn việc này có thể dùng những hàm escape data:
  • mysql_real_escape_string(): Dùng với mysql_* functions
  • mysqli::escape_string(): Dùng với MySQLi extension/class
  • pg_escape_string(): Dùng với PostgreSQL
  • addslashes(): Đây là 1 hàm escape chung chỉ dùng nếu database của bạn ko có 1 hàm cụ thể
Bên dưới là ví dụ cho từng hàm:
// $db refers to database connection resource/object
$name = "O'reilly"; // Chứa dấu ngoặc kép có thể làm bể query
 
// MySQL via mysql_*
$safe = mysql_real_escape_string($name, $db);
 
// MySQL via MySQLi
$safe = $db->escape_string($name); // OOP Style
$safe = mysqli_real_escape_string($db, $name); // Procedural Style
 
// PostgreSQL
$safe = pg_escape_string($db, $name);
 
// Generic (last resourt)
$safe = addslashes($name);

4. Giấu các lỗi của bạn

Tốt hơn hết là bạn ko nên để lộ điểm yếu của mình ra. Không chỉ làm website tệ nó còn có thể là nơi cho các hacker phá hỏng site của bạn. Bạn luôn luôn phải vô hiêu hóa display_errors khi site đang chạy, nhưng vẫn cần ghi lại những lỗi bằng log_errors để bạn kiểm soát riêng. 2 câu hình PHP này phù hợp cho 1 server đang hoạt động:
display_errors 0
log_errors 1

5. Dùng POST những hành động nguy hiểm

Có 2 phương pháp phổ biến được dùng để gửi data tới 1 PHP App đó là GET và POST. GET hoạt động bằng cách thêm các biến vào cuối các URL (ví dụ http://www.example.com/process.php?action=delete&id=123). GET là phương thức gửi dữ liệu thông qua đường dẫn URL nằm trên thanh địa chỉ của Browser ( User thông thường sẽ không thấy chúng). Bạn phải cẩn thận khi chọn 1 trong 2 cho những nhiệm vụ cụ thể. Bạn nên dùng POST khi bạn đang thực hiện những hành động nguy hiểm ( chẳng hạn đăng nhập, Comment, hoặc xóa 1 cái gì đó ). http://www.ultramegatech.com/2009/08/5-basic-php-security-tips/
Share on Google Plus

0 nhận xét :

Đăng nhận xét