2010-08-09 30 views
7

Tôi thường sử dụng chức năng này để khử trùng đầu vào hình thức của tôi trước khi lưu trữ chúng vào cơ sở dữ liệu của tôi:mẫu liên hệ Sanitize mà không mysql_real_escape_string

//Function to sanitize values received from the form. Prevents SQL injection 
function clean($str) { 
    $str = @trim($str); 
    if(get_magic_quotes_gpc()) { 
     $str = stripslashes($str); 
    } 
    return mysql_real_escape_string($str); 
} 

Cho đến hôm nay tôi đã không nhận ra rằng mysql_real_escape_string đòi hỏi một kết nối cơ sở dữ liệu như tôi chỉ đã sử dụng nó khi tôi đã làm sạch dữ liệu trước khi lưu trữ nó vào cơ sở dữ liệu.

Tôi đã thử sử dụng chức năng trên biểu mẫu liên hệ và nhận lỗi "Liên kết tới máy chủ không thể thiết lập được". Tôi có thể kết nối với cơ sở dữ liệu nhưng không cần thiết vì tôi chỉ đơn giản là đang cố gắng khử trùng dữ liệu trước khi nó được gửi đến e-mail của tôi thông qua biểu mẫu liên hệ.

Cách tốt nhất để vệ sinh dữ liệu không được lưu trữ trong cơ sở dữ liệu mysql và dữ liệu này vẫn cần được vệ sinh?

Trả lời

15

sử dụng filter_var()

http://php.net/manual/en/function.filter-var.php

như thế nào nếu bạn muốn để khử trùng một email:

$_POST['email'] = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL); 

để nhắn

$_POST['message'] = filter_var($_POST['message'], FILTER_SANITIZE_STRING); 

là enogth

+0

ý bạn là các bộ lọc cụ thể nào? có rất nhiều người trong số họ –

1

Mục đích của việc vệ sinh dữ liệu với mysql_real_escape_string là để tránh SQL injection. Nếu bạn không sử dụng SQL, bạn đã được miễn dịch.

Đàn ông không bị ung thư cổ tử cung.

Sử dụng chức năng vệ sinh phù hợp với các ký tự đặc biệt bạn cần tránh. Lý tưởng nhất, không loại bỏ một cái gì đó mà sẽ không gây hại.

+0

mysql_real_escape_string một mình không giúp đỡ bất cứ điều gì –

-1

Toàn bộ khái niệm là sai. Chức năng này không giúp ích gì cho email ngay cả đối với cơ sở dữ liệu.

mysql_real_escape_string không "khử trùng" bất kỳ thứ gì. Nó chỉ đơn thuần là delimiters thoát và không có gì khác. Chỉ cần để ngăn chặn các lỗi cú pháp nếu bạn có một dấu phân cách trong dữ liệu của bạn:

SELECT * FROM table WHERE name = 'it's me' # error! 

sau khi số liệu được trốn thoát, dữ liệu của bạn trở thành 'it\'s me' và không có lỗi.
Do đó, chức năng này chỉ hoạt động với truy vấn SQL và dữ liệu, được đính kèm trong dấu ngoặc kép chỉ.

Vì vậy, không có ý nghĩa trong việc chỉ mysql_real_escape_string mà không có dấu ngoặc kép xung quanh. mysql_real_escape_string nên được sử dụng
a) một mình. các công cụ như trim hoặc stripslashes không có gì để làm ở đây
b) ngay trước khi chuỗi truy vấn sáng tác và không phải ở nơi khác
c) chỉ với dữ liệu được đính kèm trong dấu ngoặc kép.
d) tất cả các dữ liệu khác cần một cách khác để vệ sinh

Đối với email, bạn không cần bất kỳ sự khử trùng nào bạn gửi nó dưới dạng văn bản thuần túy. Đề phòng duy nhất bạn phải thực hiện là chống lại tiêm thư
Không phải là một vấn đề lớn. Chỉ cần đưa người dùng nhập vào nội dung thư. không vào chủ đề, đến hoặc từ hoặc bất kỳ tiêu đề nào khác. Chỉ nội dung thư. Và bạn được an toàn

+0

Cái gì? Luôn sử dụng vệ sinh. Không bao giờ tin vào đầu vào của người dùng. Lời khuyên như vậy giả định rằng a) không có cách nào để chèn một tiêu đề khác vào kịch bản (nếu bạn không làm vệ sinh đầu vào, làm sao bạn biết chắc chắn?) Và b) tất cả các ứng dụng thư sẽ làm điều đúng ngay cả với một văn bản/tiêu đề đơn giản. Tôi nghiêm túc nghi ngờ điều đó. – Cfreak

+0

@ Làm hỏng điểm hợp lý duy nhất ở đây là về một số ứng dụng thư khách lẻ. Có một ví dụ? Nhưng bạn "không bao giờ tin tưởng người dùng đầu vào" cầu nguyện mindless thực sự là buồn cười. Tại sao không để có được một số kinh nghiệm trước khi đánh giá những người khác? –

-1

(Tôi mới đến stackoverflow vì vậy tôi đi về việc này một cách sai lầm/làm một công việc xấu với phong cách của câu trả lời của tôi cảm thấy tự do để cho tôi biết.)

Đúng tôi nếu tôi sai vì tôi cũng đang đối phó với cùng một vấn đề ngay bây giờ, nhưng tôi không nghĩ rằng câu trả lời được chấp nhận bằng cách sử dụng filter_var là đủ như kẻ tấn công có thể bỏ qua điều này bằng cách sử dụng unicode.

Ví dụ: "& # 66; & # 99; & # 99; & # 58;" (các khoảng trống được thêm vào do đó stackoverflow sẽ hiển thị chính xác)

Điều này sẽ không bị xóa khỏi chuỗi và sau đó sẽ được thay thế bằng "Bcc:".

Đây là giải pháp của tôi, nhưng có thể có cách tốt hơn. Nếu có ai biết tôi muốn nghe nó.

$string = str_replace("&", "(and)", $string); 
    $string = str_replace("#", "(num)", $string); 
    $string = str_replace(";", "(semi-colon)", $string); 
    $string = str_replace(":", "(colon)", $string); 
    $string = str_replace("@", "(at)", $string); 
    $string = str_replace("\\", "(backslash)", $string); 
    $string = filter_var($string, FILTER_SANITIZE_STRING); 
Các vấn đề liên quan