2012-04-21 55 views
5

Tôi đang phát triển trang web cá nhân của mình bằng cách sử dụng php. tất cả mọi thứ là ok nhưng tôi chỉ đọc mysql_real_escape_string thủ công php.net và tìm thấy hai điều:câu hỏi về mysql_real_escape_string

  1. Chức năng này phải luôn (với vài ngoại lệ) được sử dụng để làm cho dữ liệu an toàn trước khi gửi một truy vấn đến MySQL.
  2. mysql_real_escape_string() không thoát% và _. Đây là các ký tự đại diện trong MySQL nếu được kết hợp với LIKE, GRANT hoặc REVOKE.

Tôi có hai câu hỏi:
1-những gì các trường hợp ngoại lệ là?
2- cách thoát khỏi những nhân vật đó?

+1

Bạn nên sử dụng [PDO] (http://php.net/manual/en/book.pdo.php). Làm trang web cá nhân của bạn là một cơ hội tuyệt vời để tìm hiểu nó. – kapa

+0

Điểm 2 đề cập đến mệnh đề 'LIKE' và không liên quan đến việc sử dụng dữ liệu chuỗi trong các ngữ cảnh khác. – mario

+0

một trong các ngoại lệ có thể là chuỗi đã thoát. – hjpotter92

Trả lời

5

Chức năng này phải luôn luôn (với một vài ngoại lệ) được sử dụng để làm cho dữ liệu an toàn trước khi gửi truy vấn đến MySQL.

Để thất vọng lớn của tôi, trang hướng dẫn cho biết hoàn toàn rác và they refuse to make it correct.
Vì vậy, hoàn toàn trái ngược, chỉ có vài trường hợp khi bạn cần chức năng này. Vì vậy, để nói ONLY ONE: khi bạn thêm một chuỗi vào truy vấn SQL.

mysql_real_escape_string() không thoát% và _. Đây là các ký tự đại diện trong MySQL nếu được kết hợp với LIKE, GRANT hoặc REVOKE.

Nó không quan trọng quá nhiều. Miễn là bạn đang sử dụng toán tử LIKE với mục đích, những nhân vật này sẽ không gây hại gì.

Nhưng nếu bạn muốn thoát khỏi chuỗi sẽ THÍCH tuyên bố, bạn có thể sử dụng mã này

$like = addCslashes($like,'\%_'); 

(lưu ý các dấu gạch chéo -. Nó cũng được yêu cầu để được thoát như nhãn hiệu nêu nó cũng lưu ý các C chữ cái trong tên hàm).
Sau thủ tục này, bạn có thể sử dụng kết quả $like biến bất kỳ cách nào bạn đang sử dụng để xây dựng các truy vấn của bạn - báo giá và thoát chúng hoặc sử dụng trong câu lệnh đã chuẩn bị.

+0

cảm ơn, nhưng làm thế nào để thoát khỏi chúng ('%', '_')? – undone

+1

chỉ đơn giản bằng dấu gạch chéo. 'addCslashes ($ data,"% _ ");' sẽ làm thủ thuật –

+1

Nhưng chỉ làm điều đó cho các phần đi vào một bối cảnh phù hợp với mẫu. Nếu không, bạn sẽ thấy một chữ '\%' trong SQL của bạn. – Matthew

3

Tôi không chắc chắn ngoại lệ mà hướng dẫn sử dụng đề cập đến khi nói về cách bảo mật dữ liệu. Bạn có thể nói rằng ngoại lệ là khi dữ liệu đã được biết là an toàn. Ví dụ, sau đây là một vài trường hợp mà tôi suy nghĩ:

  • dữ liệu được đánh máy như một số (điều này thực sự là một chuyên môn hóa của mặt hàng tiếp theo)
  • bạn đã biết nó không chứa bất kỳ ký tự cần phải được thoát (ví dụ như nó xuất phát từ nhìn lên một cái gì đó trong một mảng "danh sách trắng" có chứa một vài lựa chọn bạn hardcoded)

Ví dụ, nếu bạn có $id = intval($_GET['id']) sau đó bạn không cần phải thoát khỏi $id trước khi tiêm nó vào một truy vấn.

Tuy nhiên! Bạn không bao giờ có thể làm tổn thương bạn thoát khỏi tất cả các đầu vào và làm như vậy sẽ loại bỏ cơ hội bạn giới thiệu các lỗ hổng trong mã của mình (ví dụ: nếu bạn quên thoát, nếu yêu cầu thay đổi hoặc bất kỳ điều gì thực sự). Vì vậy, tôi khuyên bạn nên đi vào thói quen thoát khỏi mọi thứ và quên đi "ngoại lệ".

Đối với %_ nhân vật như một phần của đầu vào, những không cần phải được thoát trừ khi bạn đang đi để nuôi đầu vào này cho một lệnh công nhận họ. Vì vậy, ví dụ, nếu bạn có một truy vấn như thế này:

$term = $_GET['term']; 
$sql = sprintf("SELECT FROM table WHERE column LIKE '%%s%'", 
       mysql_real_escape_string($term)); 

Trong trường hợp này, nếu người dùng gõ một % như một phần của $term đó là hợp lý để giả định rằng họ muốn thực sự tìm kiếm một chữ %. Do đó, trong trường hợp này, bạn nên thoát khỏi % bằng cách thay thế bằng \% (\ là ký tự thoát mặc định). str_replace hoặc strtr là hai lựa chọn tốt cho việc này.

+0

mysql_real_escape_string không liên quan gì đến * an toàn *. đó là những vấn đề hoàn toàn khác nhau (được người dân PHP nhầm lẫn rộng rãi, tôi phải thừa nhận). Như một vấn đề của thực tế, thoát nhưng chỉ đơn thuần là một cơ sở định dạng chuỗi và không có gì nhiều hơn nữa. Ngay cả dữ liệu "an toàn" nào cũng có thể chứa dấu ngắt dòng phải được thay thế cho khả năng đọc nhật ký. chưa kể đến định danh không an toàn, nó sẽ không tốt chút nào. –

+0

@YourCommonSense: Đưa vào dấu ngoặc kép + 'mysql_real_escape_string' = an toàn. Nó có * tất cả mọi thứ * để làm với an toàn * gián tiếp *, bởi vì đó là điều kiện tiên quyết cho những gì cung cấp an toàn * trực tiếp * (trích dẫn). Cảm ơn cho DV anyway. – Jon

+0

'Tuy nhiên! Nó không bao giờ có thể làm tổn thương bạn để thoát khỏi tất cả các đầu vào, 'xin chúc mừng, bạn chỉ phát minh ra' tính năng báo giá ma thuật'! –

1

Bạn có thể write your own function;) Xem this thread để biết thêm thông tin.

Khác bạn có thể sử dụng PDO library hoặc bất kỳ thư viện nào khác như vậy.

+0

liên kết đầu tiên là cho 'MSSQL' không phải' mysql' :-) – undone

+0

yeah, đó chỉ là để đưa ra một ý tưởng như thế nào để thực hiện logic để viết một hàm thủ công cho mysql. Cùng một logic có thể được thực hiện cho MySQL quá .. – gopi1410