2010-09-17 32 views
8

Tôi đang chuyển PHPSESSID tới trang PHP (qua POST) và tôi đã tự hỏi cách tốt nhất để khử trùng đầu vào là gì. mysql_real_escape_string có đủ không? Có điều gì đặc biệt tôi nên đưa vào tài khoản khi giao dịch với ID phiên (ý tôi là, chúng chỉ có thể là chữ cái và số phải không?)?Vệ sinh PHPSESSID

EDIT: Để làm rõ những câu hỏi, những gì tôi thực sự muốn biết là: nếu ai đó tampers với các dữ liệu POST, ông có thể gửi một chuỗi độc hại như PHPSESSID mà có thể làm một cái gì đó khó chịu khi tôi gọi session_id($_GET['PHPSESSID'])? Cá nhân tôi không thể nghĩ ra bất kỳ, nhưng tốt hơn an toàn hơn xin lỗi ...

Cảm ơn

nico

+0

Tại sao bạn muốn vệ sinh nó? Đó là (trong hầu hết các trường hợp) được tạo tự động. – fabrik

+1

+1 cho tư duy có ý thức bảo mật tốt –

+0

@abrik: Tất nhiên nó được tạo tự động, tôi chỉ lo lắng rằng ai đó có thể giả mạo dữ liệu POST và làm điều gì đó khó chịu với nó. Không chắc họ có thể làm gì, nhưng đó là lý do tại sao tôi hỏi câu hỏi này! – nico

Trả lời

7

Tốt suy nghĩ, nhưng như xa như tôi có thể nhìn thấy, không có nhu cầu để khử trùng đầu vào này. PHPSESSID sẽ được chuyển đến số session_id().

session_id thực sự có some limitations:

Tùy thuộc vào phiên xử lý, không phải tất cả các nhân vật được phép trong phiên id. Ví dụ, trình xử lý phiên tập tin chỉ cho phép các ký tự trong phạm vi a-z A-Z 0-9, (dấu phẩy) và - (âm)!

Nhưng session_id() nên xử lý sai lệch so với các quy tắc này với thông báo lỗi. (Bạn có thể muốn nhận thông báo lỗi đó và chấm dứt tập lệnh do lỗi.)

Mối nguy hiểm thực sự duy nhất mà tôi có thể thấy là khi bạn sử dụng trình xử lý phiên tùy chỉnh, ví dụ: kết nối với cơ sở dữ liệu. Bạn sẽ phải khử trùng đầu vào trong trường hợp đó, ví dụ: sử dụng mysql_real_escape_string(). Tuy nhiên, đó là điều cần thực hiện bên trong trình xử lý phiên tùy chỉnh. Không cần phải nói rằng nếu bạn sử dụng ID phiên trong một số ngữ cảnh khác - ví dụ như tham số trong biểu mẫu HTML - bạn cần thực hiện các biện pháp vệ sinh cần thiết cho đầu ra cụ thể đó (Trong trường hợp đó, htmlspecialchars()).

+4

Cảm ơn bạn Pekka, đó là những gì tôi nghĩ, nhưng tôi nghĩ rằng nó là tốt hơn để đặt một câu hỏi ngu ngốc hơn là làm một sai lầm ngu ngốc! :) – nico

2

Nếu bạn thực sự cần truyền ID phiên qua POST (không thể hiểu tại sao thực sự ...) và bạn biết bạn muốn cho phép ký tự nào, tôi sẽ sử dụng cụm từ thông dụng để kiểm tra.

mysql_real_escape_string là dành cho đầu vào cơ sở dữ liệu và yêu cầu kết nối cơ sở dữ liệu và không làm vệ sinh bất cứ điều gì, chỉ cần thoát khỏi một số ký tự đặc biệt.

+0

Cảm ơn bạn đã trả lời. Tôi đang sử dụng một tập lệnh dựa trên Flash và tôi cần truyền PHPSESSID vì Flash không tự động thực hiện cho tôi ... chỉ là một trang và tôi không chắc chắn về những nguy hiểm với PHPSESSID là gì (nếu có). Kịch bản đang kết nối với một DB anyway, do đó, 'mysql_real_escape_string' đến tâm trí, nhưng tôi không chắc chắn nếu nó là cần thiết ở tất cả. – nico

1

Liệu mysql_real_escape_string có đủ không?

Sai. Bạn nên luôn luôn khử trùng dữ liệu bằng cách sử dụng một phương pháp phù hợp với địa điểm bạn đang viết giá trị. Bạn chỉ sử dụng mysql_real_escape_string() nếu/khi bạn đang viết một giá trị cho cơ sở dữ liệu MySQL.

Không rõ nhận xét của bạn chính xác bạn đang làm gì. Bạn có nghĩa là bạn đang sử dụng curl trong PHP để tạo POST? Nếu vậy thì không có yêu cầu vệ sinh (không đúng sự thật - nhưng curl làm điều đó cho bạn) nếu bạn vượt qua CURLOPT_POSTFIELDS như một mảng - nhưng bạn cần phải urlencode giá trị nếu bạn đang đi qua CURLOPT_POSTFIELDS như một chuỗi.

Bạn có đang viết giá trị cho trình duyệt để người dùng có thể gửi giá trị không? Trong trường hợp này bạn sẽ sử dụng htmlentities() để ghi giá trị vào trường biểu mẫu.

Cái gì khác?

+0

Bạn thực hiện một điểm tốt về 'htmlentities', cảm ơn bạn. Như tôi đã nói để jeroen trang được gọi là bởi Flash, và phiên không được thông qua trên, vì vậy tôi chỉ POST các PHPSESSID, để tạo lại phiên trong tập tin PHP được gọi là bởi Flash. (Tôi đang sử dụng JQuery Uploadify http://www.uploadify.com/ và chuyển id phiên với tham số scriptData, như chúng gợi ý để làm). – nico

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