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

tránh tiêm MySQL với lớp Zend_Db

Tôi đã viết rất nhiều mã cho các tham số cơ sở dữ liệu và trích dẫn trong Zend Framework trong khi tôi là trưởng nhóm của dự án (lên đến phiên bản 1.0).

Tôi đã cố gắng khuyến khích các phương pháp hay nhất nếu có thể, nhưng tôi phải tạo ra sự cân bằng để dễ sử dụng.

Lưu ý rằng bạn luôn có thể kiểm tra giá trị chuỗi của Zend_Db_Select để xem nó đã quyết định thực hiện trích dẫn như thế nào.

print $select; // invokes __toString() method

Ngoài ra, bạn có thể sử dụng Zend_Db_Profiler để kiểm tra SQL do Zend_Db chạy thay mặt bạn .

$db->getProfiler()->setEnabled(true);
$db->update( ... );
print $db->getProfiler()->getLastQueryProfile()->getQuery(); 
print_r $db->getProfiler()->getLastQueryProfile()->getQueryParams(); 
$db->getProfiler()->setEnabled(false);

Dưới đây là một số câu trả lời cho các câu hỏi cụ thể của bạn:

  • Zend_Db_Select::where('last_name=?', $lname)

    Giá trị được trích dẫn một cách thích hợp. Mặc dù "? "trông giống như một trình giữ chỗ tham số, trong phương thức này, đối số thực sự được trích dẫn một cách thích hợp và được nội suy. Vì vậy, nó không phải là một tham số truy vấn đúng. Thực tế, hai câu lệnh sau tạo ra cùng một truy vấn như cách sử dụng ở trên:

    $select->where( $db->quoteInto('last_name=?', $lname) );
    $select->where( 'last_name=' . $db->quote($lname) );
    

    Tuy nhiên, nếu bạn truyền một tham số là một đối tượng thuộc loại Zend_Db_Expr , thì nó không được trích dẫn. Bạn chịu trách nhiệm về rủi ro chèn SQL, vì nó được nội suy nguyên văn, để hỗ trợ các giá trị biểu thức:

    $select->where('last_modified < ?', new Zend_Db_Expr('NOW()'))
    

    Bất kỳ phần nào khác của biểu thức đó cần được trích dẫn hoặc phân tách là trách nhiệm của bạn. Ví dụ:nếu bạn nội suy bất kỳ biến PHP nào vào biểu thức, bạn có trách nhiệm đảm bảo an toàn. Nếu bạn có tên cột là từ khóa SQL, bạn cần tự phân tách chúng bằng quoteIdentifier() . Ví dụ:

    $select->where($db->quoteIdentifier('order').'=?', $myVariable)
    
  • Zend_Db_Adapter_Abstract::insert( array('colname' => 'value') )

    Tên bảng và tên cột được phân cách, trừ khi bạn tắt AUTO_QUOTE_IDENTIFIERS .

    Giá trị được tham số hóa dưới dạng tham số truy vấn đúng (không nội suy). Trừ khi giá trị là Zend_Db_Expr đối tượng, trong trường hợp đó nó là nguyên văn nội suy, vì vậy bạn có thể chèn biểu thức hoặc NULL hoặc bất cứ điều gì.

  • Zend_Db_Adapter_Abstract::update( array('colname' => 'value'), $where )

    Tên bảng và tên cột được phân cách, trừ khi bạn tắt AUTO_QUOTE_IDENTIFIERS .

    Các giá trị được tham số hóa, trừ khi chúng là Zend_Db_Expr các đối tượng, như trong insert() phương pháp.

    $where đối số hoàn toàn không được lọc, vì vậy bạn phải chịu trách nhiệm về bất kỳ rủi ro tiêm SQL nào trong đối số đó. Bạn có thể sử dụng quoteInto() để giúp việc trích dẫn thuận tiện hơn.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. cách khởi động Mysql trong git bash trong windows 8.1

  2. Django và các kết nối cơ sở dữ liệu chỉ đọc

  3. Làm cách nào để lấy các kiểu số từ MySQL bằng PDO?

  4. Sử dụng lớp cơ sở dữ liệu Django bên ngoài Django?

  5. Cách tính độ dốc trong SQL