2010-05-12 29 views
5

Tôi đã thử và cố gắng để đạt được một tiêm SQL bằng cách thực hiện các truy vấn tùy chỉnh tới máy chủ bên ngoài firefox.Đây có phải là cách an toàn để cấu trúc mysql_query trong PHP

Bên trong php, tất cả các biến được chuyển vào truy vấn trong chuỗi như sau.

Lưu ý, ở giai đoạn này, $ _POST chưa được xúc động.

mysql_query('INSERT INTO users (password, username) VALUES(' . sha1($_POST['password']) . ',' . $_POST['username'] . ')); 

Đó có phải là cách an toàn để thực hiện thay đổi không?

+0

bạn đã thử như thế nào? –

+1

Với tất cả sự tôn trọng. Có hàng triệu người ngoài kia thông minh hơn bạn và tôi. Ai độc hại hơn nhiều. Những gì bạn có ở đó là lời mời mở để đưa trang web của bạn xuống. Chỉ vì bạn không thể thực hiện tiêm SQL thích hợp, không có nghĩa là nó không thể thực hiện được. –

+0

sử dụng truy vấn ajax tùy chỉnh của tôi trong javascript từ văn bản được mã hóa bằng UTF-8 và từ bên trong một vài trình duyệt (mà tôi nhận ra có thể mã hóa dữ liệu). Có cách nào tốt nhất để kiểm tra không? – Supernovah

Trả lời

3

Bạn chắc chắn nên thoát tên người dùng bằng mysql_real_escape_string.

Tất nhiên, giải pháp tốt nhất là sử dụng các câu lệnh đã chuẩn bị. Bằng cách đó, việc tách cú pháp truy vấn và dữ liệu được thực hiện trên cấp API mysql.

Và, như những người khác đã chỉ ra, giá trị phải được bao quanh hoàn toàn bằng dấu ngoặc kép. Đặc biệt là những văn bản.

+0

Bất kỳ lời giải thích nào về -1? Có gì sai tôi viết không? – macbirdie

+0

tôi đã không cung cấp cho bạn -1 nhưng ngay cả khi ông đã chạy $ _POST ['username'] mặc dù addslashes hoặc msyql_real_escape_string nó vẫn sẽ dễ bị tổn thương vì biến không có trong dấu ngoặc kép. – rook

3

những gì bạn đang làm có nguy hiểm vì ai đó có thể gửi yêu cầu POST có tên người dùng xấu. bạn có thể kiểm tra mọi tham số và thoát khỏi nó, ngoài ra bạn có thể sử dụng mysqli (http://php.net/manual/en/book.mysqli.php), và ràng buộc các tham số bằng cách sử dụng chuẩn bị + liên kết.

bước đầu tiên là tốt để tránh khai thác trên người dùng khác, trong khi thứ hai là tốt cho sự an toàn của phía máy chủ của bạn.

cũng kiểm tra câu hỏi này: How do you prevent SQL injection in LAMP applications?

+0

tại sao tôi không thể khám phá nó? Tôi đã thử vô số lần tiêm phổ biến và không sản xuất bất cứ thứ gì ... – Supernovah

+0

không chắc chắn cách cấu hình PHP của bạn, bạn đã thử in các chuỗi chưa? nó có thể đã thực hiện một số phép thuật trên chúng. nếu họ không có vẻ giống như các chuỗi bạn đã gửi, bạn cũng có thể muốn đảm bảo rằng bạn đang gửi chúng đúng cách, chúng có thể được mã hóa theo cách này hay cách khác ở phía khách hàng. –

+0

@Supernovah '$ _POST ['username'] =" (chọn Mật khẩu từ giới hạn mysql.user 1) "dấu ngoặc kép không cần thiết để khai thác lỗ hổng tiêm sql này – rook

1

này là không an toàn, trừ khi magic_quotes_gpc chỉ cấu hình được bật.
var_dump(ini_get('magic_quotes_gpc')); hoặc phpinfo(); có thể hiển thị cho bạn những giá trị thực tế

Lưu ý rằng chỉ thị này là bẩn, không dùng nữa và tất cả-ghét. Và sẽ làm cho một số mật khẩu không hoạt động.

+1

-1 magic_quotes_gpc rất không an toàn và đang bị xóa trong PHP6. Quan trọng nhất ** đây vẫn là SQL Injection ngay cả với magic_quotes_gpc ** '$ _POST ['username']' không được bao quanh bởi dấu trích dẫn trong truy vấn để bạn có thể tiêm một cái gì đó như '(chọn Mật khẩu từ giới hạn mysql.user 1) ', dấu ngoặc kép không bắt buộc để khai thác truy vấn này. – rook

+0

Ahaha @Người cố gắng thuyết giảng tôi lần nữa. Cũng giống như với MD5, bạn chỉ cần chạy la hét điên cuồng "rất không an toàn! Rất không an toàn!" Nhưng trên thực tế bạn không thể chứng minh không "rất" hay thậm chí "không an toàn" với một ví dụ bạn đánh lừa. Vì vậy, đừng nói những gì bạn vừa nghe nhưng không bao giờ hiểu được. Và không ai hỏi ý kiến ​​của bạn về các dấu ngoặc kép xung quanh, bởi vì chúng được sử dụng trong ví dụ. Tất nhiên nó sẽ không hoạt động nếu không có dấu ngoặc kép. Điều đó rõ ràng là –

+0

Chà, nếu bạn không thấy lỗ hổng tiêm sql cụ thể này sau khi tôi đã chỉ ra nó thì bạn có vấn đề lớn hơn chỉ là tôi. – rook

2

On kiểm tra mã của bạn Tôi ngạc nhiên nó hoạt động ở tất cả khi bạn không trích dẫn literals bạn đang chèn - bạn sẽ được tạo mã như:

INSERT INTO user (password, username) VALUES (abc1234fg00000, admin); 

Vì vậy, nó sẽ cho một lỗi mỗi lần . Giả sử đây chỉ là lỗi đánh máy ....

Tiện ích mở rộng mysql giới hạn khả năng thực hiện các cuộc tấn công bằng cách chỉ cho phép một truy vấn cho mỗi cuộc gọi. Ngoài ra, có giới hạn phạm vi cho một cuộc tấn công tiêm vào một tuyên bố INSERT. Thêm vào đó thực tế là bạn thay đổi biểu diễn thành định dạng trung lập trước khi nối vào câu lệnh chèn có nghĩa là nó không phải là một đại lộ tiềm năng cho một cuộc tấn công như vậy. Tuy nhiên, mã của bạn nên rơi xuống nếu ai đó đăng tên người dùng có chứa một trích dẫn duy nhất (nếu không thì bạn đã bật tính năng kích hoạt magic_quotes không được dùng nữa).

OTOH nếu bạn áp dụng cùng một phương pháp để xác nhận tài khoản khi đó bạn đang rộng mở cho các cuộc tấn công tiêm - xem xét

"SELECT 1 
FROM users 
WHERE username='" . $_POST['username'] . "' 
AND password='" . sha1($_POST['username'] . "';"; 

Nếu $ _POST [ 'username'] chứa "admin' OR 1", sau đó hệ thống của bạn bị xâm phạm.

Bạn nên luôn sử dụng mysql_real_escape_string() trừ khi bạn đã thực hiện các dữ liệu an toàn bằng cách sử dụng chức năng khác nhau (ví dụ sha1, bas64_encode .... nhưng KHÔNG addslashes)

C.

+0

điểm tốt về cú pháp truy vấn sai –

+0

Tôi không thể đồng ý với nội dung 'sha1, bas64_encode'. tất cả những điều này không liên quan gì đến cơ sở dữ liệu. bạn có thể thay đổi ý định và bỏ sử dụng các chức năng này. nhưng thuật toán xây dựng truy vấn phải giống nhau. Tốt hơn là làm cho nó trừu tượng và độc lập với giá trị dữ liệu. –

+1

@Col. Shrapnel: nhưng sha1 ($ x) === mysql_real_escape_string (sha1 ($ x)) và base64_encode ($ x) === mysql_real_escape_string (base64_encode ($ x)) bất kể $ x là gì. Lưu ý tôi không nói rằng bạn không nên sử dụng mysql_real_escape_string() chỉ là nó là dự phòng trong một số trường hợp. – symcbean

0

Tôi tự hỏi đôi khi, nếu họ tìm thấy tôi ở nhà cũ, hãy hét lên "BIND VARIABLES" tại các y tá khi họ đi ngang qua.

Đó là năm 2010 mọi người, không phải năm 1995.

LOẠI SỰ KHÁC BIỆT!

CÁC LOẠI BIND!

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