2012-04-11 41 views
6

Sử dụng PHP, cách tốt nhất để lưu trữ các ký tự đặc biệt (như sau) trong cơ sở dữ liệu MSQUL, để tránh tiêm.Phương pháp PHP đúng để lưu trữ các ký tự đặc biệt trong MySQL DB

« " ' é à ù 

Đây là cách tôi làm điều đó bây giờ:

$book_text=$_POST['book_text']; 
$book_text=htmlentities($book_text, "ENT_QUOTES"); 
$query=//DB query to insert the text 

Sau đó:

$query=//DB query to select the text 
$fetch=//The fetch of $book_text 
$book_text=html_entity_decode($book_text); 

Bằng cách này, tất cả các văn bản của tôi được định dạng trong các thực thể HTML. Nhưng tôi nghĩ điều này chiếm rất nhiều không gian cơ sở dữ liệu. Vậy, có cách nào tốt hơn không?

+2

utf8 là bạn của bạn –

+0

'' ENT_QUOTES "' cần phải là 'ENT_QUOTES' (không có dấu ngoặc kép) vì nó là một hằng số được xác định trước PHP. Và tôi nghĩ rằng bạn có thể đặt nó nguyên trong DB và khi bạn muốn echo nó, bạn sử dụng 'htmlentities' –

Trả lời

6

Sử dụng mã hóa utf8 để lưu trữ các giá trị này.

Để tránh tiêm sử dụng mysql_real_escape_string() (hoặc báo cáo đã chuẩn bị).

Để bảo vệ từ XSS sử dụng htmlspecialchars.

+0

utf8 trong collation cơ sở dữ liệu? –

+0

utf8 dưới dạng mã hóa cột bảng – Botanick

+1

bạn không thể mysql_real_escape_string() không thể so sánh với các câu lệnh đã chuẩn bị. Chức năng này là không để tránh tiêm, và không thể giúp chống lại chúng một mình. –

1

Có vẻ như câu hỏi của bạn có thể được khái quát hóa để xử lý và lưu trữ UTF8 bằng PHP và MySQL.

Để an toàn với việc tiêm SQL, bạn nên sử dụng các câu lệnh đã được chuẩn bị. Các trình điều khiển mysqliPDO đều hỗ trợ chúng.

Báo cáo chuẩn bị được tự động trích dẫn bởi người lái xe, vì vậy bạn không cần phải lo lắng về điều này.

Bảng cơ sở dữ liệu của bạn phải được tạo bằng bộ ký tự utf8 và đối chiếu utf8_general_ci. Các thiết lập này my.cnf sẽ đảm bảo máy chủ MySQL của bạn chạy UTF8 tất cả thông qua:

[mysqld] 
default-character-set=utf8 
default-collation=utf8_general_ci 
character-set-server=utf8 
collation-server=utf8_general_ci 
init-connect='SET NAMES utf8' 

[client] 
default-character-set=utf8 

Hãy nhận biết rằng PHP nói chung là không biết gì về UTF8, vì vậy bạn nên chăm sóc để sử dụng hoặc iconv hay mbstring thư viện để xử lý chuỗi. Xem PHPWACT để biết tổng quan tốt.

Hãy bộ ký tự nội bộ chắc chắn của PHP được thiết lập để Unicode

iconv_set_encoding('internal_encoding', 'UTF-8'); 
mb_internal_encoding('UTF-8'); 

Bạn cũng nên chắc chắn rằng trình duyệt biết mã hóa bằng cách gửi hoặc là tiêu đề chính xác hoặc thêm một thẻ <meta> cho charset.

Điều đó sẽ thực hiện.

0

Câu hỏi của bạn là một tập hợp tuyệt vời các nhầm lẫn. Bạn quản lý để gây nhầm lẫn tất cả mọi thứ.
Hãy cố gắng sắp xếp nó ra.

Sử dụng PHP, cách tốt nhất để lưu trữ các ký tự đặc biệt (như sau) trong cơ sở dữ liệu MSQUL, để tránh tiêm.

Đây là những vấn đề không thể so sánh. Lưu trữ ký tự đặc biệt là một vấn đề và tránh tiêm là một vấn đề khác. hoàn toàn khác.

$book_text=htmlentities($book_text, "ENT_QUOTES"); 

đây là phần thú vị nhất. mặc dù nó được thiết kế để bảo vệ các truy vấn của bạn, nó thực sự không làm gì cả. Bởi vì thay vì hằng số ENT_QUOTES giá trị là 3 bạn đang sử dụng chuỗi ENT_QUOTES giá trị số là 0, vì vậy, bạn đang thiết lập không có cờ.

Nhưng ngay cả khi bạn đặt cờ này chính xác, nó sẽ không tự động bảo vệ bạn. Bởi vì một mã tiêm có thể không chứa các ký tự đặc biệt.

Để tránh tiêm, bạn phải tuân theo toàn bộ bộ quy tắc, không phải một hàm đơn giản "make_my_data_safe()". Không có cây đũa thần.
Xem this my answer để biết chi tiết.

Đối với các specialchars, thật đơn giản. Vấn đề duy nhất là KHÔNG có ký tự đặc biệt vững chắc nào được đặt. Có khác nhau ký tự đặc biệt cho các môi trường khác nhau.

  • 'có ý nghĩa đối với các cơ sở dữ liệu và HTML
  • <> có ý nghĩa cho HTML chỉ
  • é à ù có ý nghĩa đối với chỉ HTML, phụ thuộc vào mã hóa.

bạn có sử dụng các quy tắc định dạng khác nhau cho mọi trường hợp không. Khác nhau, không phải là một duy nhất cho tất cả.

để sử dụng ký tự é à ù với HTML, bạn phải đặt tiêu đề HTTP thích hợp. để sử dụng é à ù với cơ sở dữ liệu, bạn phải đặt mã hóa bảng thành utf8 và mã hóa kết nối thành utf 8.

+0

$ book_text = htmlentities ($ book_text, "ENT_QUOTES"); là một lỗi khi đăng nó ở đây. Trên tệp php của tôi, nó là $ book_text = htmlentities ($ book_text, ENT_QUOTES); –