Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Thay thế các hàm mysql_ * bằng PDO và các câu lệnh đã chuẩn bị

Cảm ơn vì câu hỏi thú vị. Của bạn đây:

Nó thoát khỏi các ký tự nguy hiểm,

Khái niệm của bạn hoàn toàn sai.
Trên thực tế, "các ký tự nguy hiểm" là một huyền thoại, không có. Và mysql_real_escape_string thoát ra ngoài mà chỉ đơn thuần là một dấu phân cách chuỗi . Từ định nghĩa này, bạn có thể kết luận đó là những hạn chế - nó chỉ hoạt động đối với chuỗi .

tuy nhiên, nó vẫn dễ bị tấn công bởi các cuộc tấn công khác có thể chứa các ký tự an toàn nhưng có thể gây hại cho việc hiển thị dữ liệu hoặc trong một số trường hợp, sửa đổi hoặc xóa dữ liệu một cách độc hại.

Bạn đang trộn mọi thứ ở đây.
Nói về cơ sở dữ liệu,

  • đối với các chuỗi, nó KHÔNG dễ bị tấn công. Miễn là các chuỗi của bạn được trích dẫn và thoát, chúng không thể "sửa đổi hoặc xóa dữ liệu một cách độc hại". *
  • đối với các kiểu dữ liệu khác - vâng, nó vô dụng . Nhưng không phải vì nó có phần “không an toàn” mà chỉ vì sử dụng không đúng cách.

Đối với dữ liệu hiển thị, tôi cho rằng đó là offtopic trong câu hỏi liên quan đến PDO, vì PDO cũng không liên quan gì đến việc hiển thị dữ liệu.

thoát đầu vào của người dùng

^^^ Một ảo tưởng khác cần được lưu ý!

  • đầu vào của người dùng hoàn toàn không liên quan gì đến việc thoát . Như bạn có thể học từ định nghĩa trước đây, bạn phải thoát khỏi các chuỗi, không phải bất kỳ "đầu vào của người dùng" nào. Vì vậy, một lần nữa:

    • bạn có các chuỗi thoát, bất kể nguồn của chúng là gì
    • việc thoát khỏi các loại dữ liệu khác là vô ích, bất kể nguồn nào.

Hiểu rõ chưa?
Bây giờ, tôi hy vọng bạn đã hiểu những hạn chế của việc trốn thoát cũng như quan niệm sai lầm về “nhân vật nguy hiểm”.

Tôi hiểu rằng việc sử dụng PDO / các báo cáo đã chuẩn bị sẵn sẽ an toàn hơn nhiều

Không hẳn.
Trên thực tế, có bốn các phần truy vấn khác nhau mà chúng tôi có thể thêm động vào nó:

  • một chuỗi
  • một số
  • một số nhận dạng
  • một từ khóa cú pháp.

vì vậy, bạn có thể thấy rằng thoát chỉ bao gồm một vấn đề. (nhưng tất nhiên, nếu bạn coi các số là chuỗi (đặt chúng trong dấu ngoặc kép), thì khi có thể , bạn cũng có thể làm cho chúng an toàn)

trong khi các câu lệnh chuẩn bị bao gồm - ugh - toàn bộ 2 isues! Một việc lớn;-)

Đối với 2 vấn đề khác, hãy xem câu trả lời trước đó của tôi, Trong PHP khi gửi chuỗi vào cơ sở dữ liệu, tôi nên lưu ý các ký tự bất hợp pháp bằng htmlspecialchars () hay sử dụng biểu thức chính quy?

Bây giờ, tên hàm đã khác nên mysql_query, mysql_fetch_array, mysql_num_rows, v.v. của tôi sẽ không hoạt động nữa.

Đó là một sự ảo tưởng nghiêm trọng của người dùng PHP , thiên tai, thảm họa:

Ngay cả khi sử dụng trình điều khiển mysql cũ, người ta không bao giờ nên sử dụng các hàm API trống trong mã của họ! Người ta phải đặt chúng vào một số chức năng thư viện để sử dụng hàng ngày! (Không phải như một nghi thức ma thuật nào đó mà chỉ để làm cho mã ngắn hơn, ít lặp lại, chống lỗi, nhất quán và dễ đọc hơn).

Tương tự đối với PDO cũng vậy!

Bây giờ lại tiếp tục với câu hỏi của bạn.

nhưng bằng cách sử dụng chúng, điều này có giúp loại bỏ nhu cầu sử dụng một cái gì đó như mysql_real_escape_string không?

CÓ.

Nhưng tôi nghĩ đây đại khái là ý tưởng về những gì nên làm để tìm nạp người dùng từ cơ sở dữ liệu

Không phải để tìm nạp, mà là để thêm bất kỳ dữ liệu nào vào truy vấn !

bạn phải cho một độ dài sau PDO:PARAM_STR nếu tôi không nhầm

Bạn có thể, nhưng bạn không cần phải làm thế.

Bây giờ, tất cả điều này có an toàn không?

Về mặt an toàn cơ sở dữ liệu, không có điểm yếu nào trong mã này. Không có gì để bảo mật ở đây.

để bảo mật hiển thị - chỉ cần tìm kiếm XSS trên trang web này từ khóa.

Hy vọng tôi làm sáng tỏ vấn đề này.

BTW, đối với các đoạn chèn dài, bạn có thể sử dụng một số chức năng mà tôi đã viết vào một ngày nào đó, Chèn / cập nhật chức năng trình trợ giúp bằng PDO

Tuy nhiên, hiện tại, tôi không sử dụng các câu lệnh đã soạn sẵn vì tôi thích các trình giữ chỗ tự pha chế hơn chúng, sử dụng thư viện Tôi đã đề cập ở trên. Vì vậy, để chống lại mã được đăng bởi riha dưới đây, nó sẽ ngắn gọn như 2 dòng sau:

$sql  = 'SELECT * FROM `users` WHERE `name`=?s AND `type`=?s AND `active`=?i';
$data = $db->getRow($sql,$_GET['name'],'admin',1);

Nhưng tất nhiên bạn cũng có thể có cùng một đoạn mã bằng cách sử dụng các câu lệnh đã chuẩn bị sẵn.

* (yes I am aware of the Schiflett's scaring tales)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL - Lỗi kết nối - [MySQL] [ODBC 5.3 (w) Driver] Host ‘IP’ không được phép kết nối với máy chủ MySQL này

  2. Php - Cài đặt PHP của bạn dường như thiếu phần mở rộng MySQL mà WordPress yêu cầu

  3. Làm thế nào để tham gia hai bảng mysql?

  4. Cách nhận dữ liệu tuần hiện tại trong MySQL

  5. CONVERT_TZ - Cách thay đổi múi giờ MySQL trong truy vấn