2010-09-23 38 views
6

Tôi muốn nhập dữ liệu người dùng, được ký hiệu là $ dangerous_string và sử dụng nó như một phần của RegEx trong truy vấn MySQL.Cách tốt nhất để thoát khỏi đầu vào của người dùng cho Cụm từ thông dụng trong MySQL là gì?

Cách tốt nhất để thực hiện việc này là gì? Tôi muốn sử dụng chuỗi của người dùng dưới dạng chữ - nếu nó chứa bất kỳ ký tự nào có ý nghĩa gì đó trong MySQL RegEx, những ký tự đó sẽ không thực sự ảnh hưởng đến Biểu thức chính quy của tôi.

$dangerous_string = $_GET["string"]; 
//do something here 
$dangerous_string = what_goes_here($dangerous_string); 
$sql = "SELECT * FROM table WHERE search_column REGEX '[[:<:]]$dangerous_string'"; 

//etc.... 

Trả lời

2

AFAIK, không có cách nào thoát gốc cho regex MySQL. Bạn có thể làm điều đó trong PHP với preg_quote (http://www.php.net/manual/en/function.preg-quote.php) mà có lẽ sẽ làm công việc cho bạn, nhưng rõ ràng là không được thiết kế cho mục đích này.

cách ưa thích của tôi nếu tôi là trong tình huống của bạn sẽ được để xây dựng một danh sách trắng regex trong PHP mà sau đó bạn có thể áp dụng cho chuỗi nguy hiểm của bạn:

$safeString = preg_replace('/[^\w]/','',$dangerousString); 

này loại bỏ bất kỳ ký tự không phải chữ (tức là bất cứ điều gì ngoại trừ A-Za-z0-9_) từ chuỗi của bạn.

NB Tôi tin rằng các câu trả lời khác được đưa ra sẽ không xóa/thoát các ký tự đặc biệt regex, mà tôi tin là yêu cầu của bạn.

+0

Điều đó sẽ hoạt động tốt. Cảm ơn bạn! – Sambo

-2

Bạn cần đảm bảo rằng dấu ngoặc kép và dấu được xử lý đúng cách trước khi chuyển đến cơ sở dữ liệu. Phương pháp tốt nhất cho việc này là:

mysql_real_escape_string ([php doc][1]) 

Phương thức này có sẵn trong cả thư viện khách PHP và C++ mysql.

Điều này phải đảm bảo bất kỳ 'dangerous_string' nào không còn nguy hiểm và có thể được sử dụng trong chuỗi được trích dẫn do RegEx sử dụng.

+0

Không làm gì để giải thích REGEXP, đó là câu hỏi. – Wrikken

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