Trang

Thứ Năm, 18 tháng 7, 2013

Tùy chọn magic_quotes_gpc trong PHP [PHP]

Magic_quotes_gpc là 1 giá trị tùy chọn bật chế độ tự động thêm ký tự escape vào trước các ký tự đặc biệt như: nháy đơn ('), nháy kép ("), dấu backslash (\) khi nó đc POST hoặc GET từ client lên, mục đích là để tránh bị lỗi SQL Injection. Nó hoạt động tương tự như hàm addslashes().


Ví dụ:
Khi ta truy vấn câu lệnh SELECT
$select = " SELECT * FROM tin WHERE idTin = '".$id."'";
$qr = mysql_query($select);

Nếu như $id có chứa dấu nháy đơn, nháy kép hay dấu (\), thì kết quả sẽ là:
SELECT * FROM tin WHERE idLT= '1\''    // $id = 1'  nháy đơn
SELECT * FROM tin WHERE idLT= '1\"'   // $id = 1"  nháy kép
SELECT * FROM tin WHERE idLT= '1\\'   // $id = 1\   dấu backslash

Tuy nhiên, nó cũng gây không ít phiền phức cho người dùng
Thường khi insert một mẩu tin vào database, chúng ta dùng câu lệnh sau:
insert into news(title, content) values('$title', '$content')
Và sử dụng một số trình soạn thảo văn bản cho web như: Ckeditor, Wysiwyg, TinyMCE, … Nhưng vì là một bản tin tức nên nội dung của nó có thể sẽ chứa nhiều ký tự, đặc biệt là những ký tự có dấu nháy đơn ' (và vì trong câu lệnh trên, chúng ta cũng dùng nháy đơn). Và như thế, code của chúng ta bị lỗi và không thể nhập dữ liệu vào database được!

Nếu host của bạn có bật Magic quotes lên thì vấn đề đã được giải quyết, magic quotes sẽ tự tìm đến những dẫu nháy đơn/kép để vô hiệu hóa chúng.

Nhưng nếu host không bật Magic quotes, lúc này có thể bạn sẽ không biết xác định lỗi do mình code sai hay do server không hỗ trợ …

Nếu trên Localhost, chúng ta có thể khắc phục bằng cách: vào thư mục chứa webserver của bạn, tìm đến thư mục php chứa file php.ini

Nếu dùng xampp thì đường dẫn file php.ini là: xampp\php\php.ini

Nếu dùng AppSer thì vào Start->AppSer->Configuration Server->PHP Edit the php.ini Configuration File

Mở file php.ini, tìm đến dòng:
magic_quotes_gpc = Off
và sửa thành
magic_quotes_gpc = On

Nhưng nếu trên host server dịch vụ, bạn không thể chỉnh sửa được file này thì sao?
Chúng ta có thể dùng câu lệnh sau để kiểm tra tình trạng của Magic quotes trên host server
echo "Magic quotes is ";
if (get_magic_quotes_gpc()) {
    echo "enabled.";
} else {
    echo "disabled";
}

Như vậy, trước khi nhập vào database, chúng ta nên kiểm tra xem magic quotes đã được bật hay chưa? Nếu chưa bật thì chúng ta sẽ dùng hàm addslashes hoặc thay thế nháy đơn(') thành (\’) cho trường hợp trên:
$content = addslashes($content);
hoặc
$content= str_replace("'","\'",$content);

Chú ý: Chức năng này bị remove từ phiên bản PHP 5.4.0
Nguồn: http://www.zend.vn

Không có nhận xét nào:

Đăng nhận xét