2011-01-23 20 views

Trả lời

4

Chắc chắn KHÔNG.

Trong khi câu hỏi trong tiêu đề là mơ hồ và thể được hiểu là "Are truy vấn mysql năng động với mỗi nó là một phần đúng định dạng ..." và do đó có một câu trả lời tích cực, câu hỏi trong cơ thể là không:

Nếu tôi chạy tất cả các dữ liệu nhận được từ người sử dụng thông qua mysql thoát thực sự nó sẽ chỉ là an toàn như sử dụng mysql chuẩn bị báo cáo?

Nếu bạn nhìn vào câu hỏi này gần hơn, bạn sẽ hiểu rằng đây chỉ là một dấu ngoặc kép ma thuật hóa thân! Mục đích của tính năng này, không được chấp nhận và bị loại bỏ là chính xác để "chạy tất cả đầu vào của người dùng thông qua thoát".
Mọi người đều biết ngày nay rằng dấu ngoặc kép ma thuật là xấu. Tại sao lại là câu trả lời tích cực?

OK, có vẻ như nó cần phải được giải thích một lần nữa, tại sao số lượng lớn thoát là xấu.

Gốc của vấn đề là một ảo tưởng khá mạnh, được chia sẻ bởi hầu hết mọi người dùng PHP:
Mọi người đều có niềm tin kỳ lạ rằng thoát khỏi làm điều gì đó trên "nhân vật nguy hiểm" (chúng là gì?) Khiến chúng "an toàn" (làm sao?). Không cần phải nói rằng đó là một rác hoàn chỉnh.

Sự thật là:

  • Thoát không "khử trùng" bất cứ điều gì.
  • Thoát không có gì liên quan đến việc tiêm.
  • Thoát không có gì liên quan đến thao tác nhập của người dùng.

Thoát chỉ là một định dạng chuỗi và không có gì khác.
Khi bạn cần - bạn cần nó mặc dù khả năng tiêm.
Khi bạn không cần nó - nó sẽ không giúp chống lại tiêm ngay cả một chút.

Nói về sự khác biệt với chuẩn bị phát biểu, có ít nhất một vấn đề (mà đã được đề cập nhiều lần dưới sql-injection tag):
mã như thế này

$clean = mysql_real_escape_string($_POST['some_dangerous_variable']); 
$query = "SELECT * FROM someTable WHERE somevalue = $clean"; 

sẽ giúp bạn KHÔNG chống lại tiêm.
Thoát ra khỏi Beause chỉ là một cơ sở định dạng chuỗi, chứ không phải là phương pháp tiêm chích trước bằng bất kỳ phương tiện nào.
Tìm hình.

Tuy nhiên, thoát có một điểm chung với chuẩn bị phát biểu:
Them cả không đảm bảo bạn từ tiêm nếu

  • bạn đang sử dụng nó chỉ chống khét tiếng "người dùng nhập vào", không phải là một quy tắc nghiêm ngặt cho việc xây dựng BẤT CỨ truy vấn, mặc dù nguồn dữ liệu.
  • trong trường hợp bạn cần chèn không phải dữ liệu nhưng từ định danh hoặc từ khóa.

Để được an toàn trong những trường hợp này, xem câu trả lời của tôi giải thích FULL sql injection protection how-to

câu chuyện dài ngắn: bạn có thể xem xét cho mình an toàn chỉ khi bạn thực hiện 2 sự điều chỉnh cần thiết và một Ngoài tuyên bố ban đầu của bạn:

Nếu tôi chạy tất cả dữ liệu nhận được từ người dùng thông qua mysql thoát thực và luôn kèm theo nó trong dấu ngoặc kép (và, như ircmaxell được đề cập, mysqli_set_charset() được sử dụng để làm cho mysqli_real_esc ape chuỗi() thực sự làm công việc của nó (trong một dịp hiếm hoi của việc sử dụng một số mã hóa lẻ như GBK)) nó sẽ chỉ là an toàn như sử dụng các câu lệnh chuẩn bị mysql?

Thực hiện theo các quy tắc này - có, nó sẽ an toàn như báo cáo được chuẩn bị gốc.

+0

Tôi xin lỗi; Tôi không cố gắng cầu kỳ hay bất cứ điều gì nhưng ... "_Them cả hai không đảm bảo _..." –

+0

Tôi cầu xin sự tha thứ của tôi, bạn có về ngữ pháp hay ý nghĩa không? Nếu trước đây - xin vui lòng chỉnh sửa bài viết của tôi, tôi rất biết ơn. Tôi không phải là người bản xứ và đôi khi không thể nhìn thấy lỗi của tôi. –

17

Có, nhưng có đủ điều kiện.

Bạn cần phải thoát đúng 100% đầu vào. Và bạn cần đặt đúng bộ ký tự (Nếu bạn đang sử dụng API C, bạn cần gọi số mysql_set_character_set() thay vì SET NAMES). Nếu bạn bỏ lỡ một điều nhỏ nhặt, bạn sẽ dễ bị tổn thương. Vì vậy, đó là có, miễn là bạn làm mọi thứ đúng ...

Và đó là lý do rất nhiều người sẽ đề xuất các truy vấn đã chuẩn bị. Không phải vì chúng an toàn hơn. Nhưng vì họ tha thứ hơn ...

+0

tuyên bố bình thường có 2 chuyến đi khứ hồi, chuẩn bị và thực hiện. Liệu mỗi lần chạy chuỗi thoát mysql trên một biến số như một chuyến đi vòng đến cơ sở dữ liệu? – bshack

+0

@bshack: Tôi không tin như vậy. Nó sử dụng bộ ký tự từ kết nối mở, vì vậy nó không cần phải làm tròn (nhưng tôi có thể sai, tôi đã không kiểm tra mã nguồn của API, chỉ [tài liệu] (http: // dev. mysql.com/doc/refman/5.0/en/mysql-real-escape-string.html)) ... – ircmaxell

+0

Có điều gì khác mà bạn phải làm ngoài việc thiết lập bộ ký tự không? – Michael

1

Tôi nghĩ @ircmaxell đã làm đúng.

Theo dõi, hãy chú ý đến loại điều này.
tôi đã sử dụng để làm điều đó tất cả các thời gian:

<?php 

//sanitize the dangerous posted variable... 
$clean = mysql_real_escape_string($_POST['some_dangerous_variable']); 

//...and then forget to use it! 
$query = "SELECT * FROM someTable WHERE somevalue = '{$_POST['some_dangerous_variable']}'"; 

?> 

Và khi tôi nói "được sử dụng để làm điều đó", những gì tôi muốn nói là tôi cuối cùng đã từ bỏ và chỉ mới bắt đầu sử dụng chuẩn bị phát biểu!

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