2009-07-26 38 views

Trả lời

23

Nếu ứng dụng của bạn chỉ làm mờ md5 khi ai đó đăng ký trên trang web của bạn hoặc đang đăng nhập, bạn có thể thực hiện nhiều cuộc gọi đến md5 mỗi giờ? Vài trăm người? Nếu vậy, tôi không nghĩ rằng thực sự nhỏ sự khác biệt giữa PHP và MySQL sẽ là đáng kể ở tất cả.

Câu hỏi phải giống như "nơi tôi đặt thực tế là mật khẩu được lưu trữ bằng md5" hơn "điều khiến tôi giành được hầu như không có gì".

Và, như một phụ trang, một câu hỏi khác có thể là: nơi bạn có thể đủ khả năng chi tiêu tài nguyên cho loại tính toán đó? Nếu bạn có 10 máy chủ PHP và một DB máy chủ đã theo tải trọng nặng, bạn sẽ có được câu trả lời của bạn ;-)

Nhưng, chỉ để cho vui:

mysql> select benchmark(1000000, md5('test')); 
+---------------------------------+ 
| benchmark(1000000, md5('test')) | 
+---------------------------------+ 
|        0 | 
+---------------------------------+ 
1 row in set (2.24 sec) 

Và trong PHP:

$before = microtime(true); 
for ($i=0 ; $i<1000000 ; $i++) { 
    $a = md5('test'); 
} 
$after = microtime(true); 
echo ($after-$before) . "\n"; 

cung cấp:

$ php ~/developpement/tests/temp/temp.php 
3.3341760635376 

Nhưng có thể bạn sẽ không tính toán triệu triệu md5 như thế này, đúng không?

(Và điều này không có gì để làm với việc ngăn ngừa tiêm SQL: chỉ cần thoát khỏi/quote dữ liệu của bạn luôn luôn hoặc sử dụng chuẩn bị phát biểu!)

+6

Khi mọi thứ khác không thành công, hãy tiến hành thử nghiệm. – Rafe

+2

vì vậy bạn sẽ tiết kiệm khoảng một micro giây làm việc đó trong cơ sở dữ liệu như trái ngược với thực hiện nó trong php. âm thanh khá không đáng kể, nhưng thú vị để biết dù sao – Kip

+1

+1 cho một câu trả lời rất kỹ lưỡng và điểm quan trọng về tiêm SQL :) – Draemon

4

Tôi không biết đó là nhanh hơn, nhưng nếu bạn làm điều đó trong PHP bạn tránh khả năng tiêm SQL.

+1

Trong mọi trường hợp, tôi tạo mysql_real_escape_string trên các thông số $ pwd của mình. –

+1

Điều này không liên quan gì đến nó. Một câu lệnh chuẩn bị sẽ sửa lỗi này mà không cần di chuyển hàm MD5, bạn cũng đang dựa vào hàm MD5 PHP để "thoát" mật khẩu. – Draemon

+1

@Draemon: tôi không nói không có cách nào khác xung quanh nó, nhưng ví dụ không đưa ra bất kỳ dấu hiệu nào về việc thoát tham số. @hiam: nếu bạn quyết định làm điều đó trong php, bạn không nên thoát khỏi chuỗi mật khẩu đầu tiên. Hàm md5 của php có thể lấy bất kỳ chuỗi nào và nó được đảm bảo trả về^[0-9a-f] {32} $ – Kip

0

Đo lường, đó là cách duy nhất để chắc chắn.

3

Hiệu suất có thực sự là vấn đề ở đây không? Nó có thể là cận biên.

  • Làm nó trong MySQL làm cho DB làm việc nhiều hơn, đó là một điều tốt
  • Làm nó trong MySQL có nghĩa là mật khẩu dạng cleartext được thông qua tiếp tục cùng (và kết nối DB thường không được mã hóa).
  • Điều này không liên quan gì đến việc tiêm SQL. Bạn có thể sửa phiên bản đầu tiên mà không cần di chuyển chức năng MD5. Ngoài ra nếu có lỗi trong hàm MD5 của PHP thì vẫn có khả năng xảy ra tấn công tiêm.
+2

Lỗi nào trong hàm md5? Bạn đang mong đợi bằng cách nào đó khai thác nó và thay vì 32 chữ số thập lục phân xuất ra một số ký tự đặc biệt và câu lệnh sql được định dạng tốt? Sẽ không xảy ra. – lacop

+1

Đó chính là loại thái độ dẫn đến khai thác. Bạn không nên sử dụng các chức năng tùy ý và hy vọng họ làm vệ sinh dữ liệu của bạn. Điều gì sẽ xảy ra nếu ai đó loại bỏ yêu cầu MD5 tại một thời điểm nào đó - liệu họ có nhận ra dữ liệu không an toàn không? – Draemon

+1

Điều này chỉ là ngớ ngẩn, bạn không thể tin tưởng ngay cả bất kỳ chức năng thoát nào, hoặc mang nó đến bất kỳ chức năng cực đoan nào cả. Ngay cả php chính nó hoặc mysql có thể được lỗi. Vì vậy, cách duy nhất để tránh khai thác là không viết bất kỳ mã nào. – lacop

0

Tôi xin nói, đọc các giá trị cột ra khỏi mysql, sau đó so sánh kết quả với băm được tính toán trong mã máy khách của bạn (ví dụ: php).

Lý do chính để làm điều này là tránh những thứ ngu xuẩn như cơ sở dữ liệu đối chiếu cột theo cách không nhị phân (ví dụ: không phân biệt chữ hoa chữ thường), thường không mong muốn đối với băm.

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