2010-01-23 25 views
5

Tôi có nên sử dụng chức năng mysql_real_escape_string() trong các truy vấn MySQL của mình cho các biến số $_SESSION không? Về mặt lý thuyết, không thể sửa đổi các biến số $_SESSION bởi người dùng cuối không giống như các biến số $_GET hoặc $_POST phải không?

Cảm ơn :)

Trả lời

4

Cho dù người dùng có thể sửa đổi dữ liệu, có thể bạn muốn thoát khỏi nó anyway trong trường hợp bạn cần dữ liệu để chứa các ký tự đó sẽ phá vỡ SQL (dấu ngoặc kép, vv).

Tốt hơn, hãy sử dụng các thông số bị ràng buộc và bạn sẽ không phải lo lắng về điều đó.

+0

Cảm ơn Andrew. Tôi có thể hỏi "Thông số ràng buộc" là gì không? – Lyon

+0

Đây là phương tiện khai báo trình giữ chỗ trong SQL của bạn và sau đó gửi các giá trị dữ liệu đến máy chủ "ngoài băng" sao cho chúng không thể được hiểu là SQL, loại bỏ khả năng chèn SQL. Xem, ví dụ: http://usphp.com/manual/en/function.mysqli-stmt-bind-param.php –

+0

Hmm..Tôi thấy. Sau khi bạn đứng đầu, tôi bắt đầu đọc về params ràng buộc và hỗ trợ của nó trong mysqli. Tôi hiện đang sử dụng ext/mysql và tôi tin rằng không hỗ trợ các tham số ràng buộc. Cảm ơn bạn rất nhiều. Tôi sẽ phải lấy các truy vấn của tôi về việc di chuyển từ mysql sang mysqli trên một luồng khác (chẳng hạn như sử dụng mysqli mà không có các câu lệnh chuẩn bị sẵn sàng). – Lyon

4

Không được thoát/trích dẫn/mã hóa văn bản cho đến khi bạn ở điểm bạn cần. Các biểu diễn bên trong phải là "thô" nhất có thể.

+0

+1, chính xác những gì tôi đang nghĩ. – Inshallah

3

Bạn có thể trả lời câu hỏi cho mình bằng cách làm theo dòng này của lập luận:

Có phải giá trị trong $ _SESSION có nguồn gốc từ người dùng nhập vào?

Nếu có, đã được vệ sinh chưa?

+0

Có. Đó là lý do tại sao tôi đã tự hỏi nếu nó nên được thoát ra một lần nữa trước khi sử dụng nó trong một tuyên bố sql. – Lyon

+0

Sau đó, tôi sẽ không thoát khỏi nó một lần nữa, nó sẽ là tốt hơn để chèn nó trong db với xử lý ít nhất có thể –

+0

của tôi đưa vào nó: nếu bạn tạo SQL của bạn năng động, bằng cách nối dữ liệu vào nó, sanitizing và ghép nên được được thực hiện ở cùng một nơi. Rõ ràng là bạn đang xây dựng SQL một cách chính xác, và vệ sinh mọi thứ đúng cách, chỉ bằng cách nhìn vào mã ghép nối. – Inshallah

1

Về mặt lý thuyết, các biến $ _SESSION không thể được sửa đổi bởi người dùng cuối

Không, nhưng các dữ liệu phải đã đến từ nơi nào đó.

Bạn nên thoát khỏi bất kỳ đầu ra nào từ PHP, bằng cách sử dụng phương thức trợ giúp cho đích tại điểm mà nó rời khỏi PHP.

C.

+0

Cảm ơn bạn symcbean :) Tôi giả định "để lại PHP" ngụ ý hoặc mysql hoặc văn bản để nộp? Tôi đã từng sử dụng htmlspecialchars nhưng giờ chỉ sử dụng filter_var và mysql_real_escape_string để xử lý bất kỳ đầu vào nào từ người dùng. – Lyon

+0

Làm rõ: Để xử lý đầu vào từ người dùng để sử dụng trong mysql, đầu tiên tôi khử trùng đầu vào, sau đó sử dụng mysql_real_escape_string. Vì vậy, htmlentities (như trái ngược với htmlspecialchars) sẽ được sử dụng khi tôi xuất ra bất kỳ dữ liệu để hiển thị trong trình duyệt của khách hàng. – Lyon

Các vấn đề liên quan