2010-08-26 19 views
26

Tôi đang sử dụng chức năng của Magento để chèn các truy vấn cập nhật &. Yêu cầu của tôi là tôi muốn quản lý SQL Injection, khi thực hiện các loại truy vấn này. Nhưng tôi không thể tìm ra cách Magento thực hiện điều này. Tôi đang cung cấp một mẫu bắt đầu. Vui lòng cung cấp cho tôi một ví dụ hoàn chỉnh.Sử dụng các phương pháp Magento để viết các truy vấn chèn với sự chăm sóc cho SQL Injection

<?php 
$write = Mage::getSingleton("core/resource")->getConnection("core_write"); 
$sql = "INSERT INTO Mage_Example (Name, Email, Company, Description, Status, Date) 
    VALUES ('$name', '$email', '$company', '$desc', '0', NOW())"; 
?> 

Bây giờ tôi muốn thay đổi truy vấn trên để ngăn SQL Injection có thể xảy ra. Tôi không muốn sử dụng chức năng mặc định "mysql_real_escape_string()" của PHP. Ai có thể vui lòng cung cấp cho tôi một giải pháp hữu ích, sử dụng trình xử lý DB "$write".

Bất kỳ trợ giúp nào được đánh giá cao.

+0

$ write-> quote ($ string); – ppostma1

Trả lời

55

Được rồi, nghiên cứu vấn đề này một chút. Nếu bạn có thể nhận được một thể hiện của một DB_Adapter (mà tôi tin rằng cuộc gọi tài nguyên sẽ trở lại), điều này không nên quá khó khăn. Sâu bên trong, Magento dựa trên khung công tác Zend và bộ điều hợp DB đặc biệt là hậu duệ của Zend_Db_Adapter, vì vậy bạn có thể sử dụng những phương pháp đó miễn phí. Xem các liên kết trước khi để biết thêm ví dụ, nhưng đây là cú pháp được cung cấp trong tài liệu, mà nên thoát đầu vào của bạn automagically:

$write = Mage::getSingleton("core/resource")->getConnection("core_write"); 

// Concatenated with . for readability 
$query = "insert into mage_example " 
     . "(name, email, company, description, status, date) values " 
     . "(:name, :email, :company, :desc, 0, NOW())"; 

$binds = array(
    'name' => "name' or 1=1", 
    'email' => "email", 
    'company' => "company", 
    'desc' => "desc", 
); 
$write->query($query, $binds); 

Một lần nữa, xem tài liệu cho biết thêm thông tin.


UPDATE:

Tôi đã thay đổi ví dụ trên. Đối tượng mà bạn lấy lại với yêu cầu core_write của bạn là một đối tượng PDO cho thấy phương thức query (xem ở trên) sẽ cho phép bạn sử dụng các truy vấn được tham số hóa. Đây là BY FAR một cách tiếp cận tốt hơn so với cố gắng sử dụng một cái gì đó như mysql_real_escape_string cho vệ sinh dữ liệu, và tôi đã kiểm tra mã trên cho đúng đắn. Lưu ý rằng, trái ngược với hầu hết các truy vấn được tham số hóa MySQL, ràng buộc được thực hiện với: nhãn, và cũng là bạn không cần trích dẫn cho các vars của bạn.

Để trả lời cho điểm khác của bạn và như được lưu ý bên dưới, cách "đúng" để thực hiện trong Magento không phải là sử dụng truy vấn trực tiếp. Các mô hình đối tượng Magento đang phát triển tốt và có nghĩa là trừu tượng hóa loại chi tiết triển khai này khỏi bạn, bởi vì bạn không cần phải quan tâm đến chính mình với nó. Để làm điều đó "chính xác", hãy tạo một mô hình dựa trên cơ sở dữ liệu mới và lưu các nhức đầu.

+0

Cảm ơn thông tin. Nhưng tôi vẫn còn tối. Nêu tôi sai vui long chân chỉnh tôi.Trước hết, bạn đã sử dụng đối tượng "' $ db' "và sử dụng phương thức" 'insert()' "của nó để chèn bản ghi dữ liệu vào bảng" lỗi ". Bây giờ điều tôi thực sự muốn là sử dụng đối tượng "' $ write' "(trong câu hỏi của tôi) thay vì đối tượng" '$ db'" này. ** Hãy đối xử với tôi như một người mới trong kiến ​​trúc "Zend_Db" này. ** Một lần nữa cảm ơn thời gian của bạn, nhưng bạn có thể thử giải quyết nó theo câu hỏi của tôi không? Ngoài ra hãy chăm sóc trong việc cung cấp các giải pháp wrt Magento đặc biệt & không "Zend_Db", mặc dù tôi hiểu được mối quan hệ giữa hai. –

+0

Để công bằng, cách Magento không thực thi trực tiếp SQL. Xác định một mô hình dữ liệu (hoặc một mô hình EAV) và chèn nó theo cách đó. nhìn vào các mục khác bạn đã đề cập, vì vậy tôi sẽ cố gắng sửa đổi ví dụ. –

+0

Cảm ơn rất nhiều vì một câu trả lời thông tin và cụ thể như vậy. Do tài liệu đính kèm của tôi cho các tác phẩm khác, tôi hiện không có sẵn để sử dụng ví dụ của bạn và kiểm tra đơn đăng ký của tôi, nhưng chắc chắn tôi sẽ chỉ sử dụng câu trả lời của bạn trong tuần tới. Vì vậy, xin vui lòng cho tôi một chút thời gian, để đánh dấu đây là câu trả lời phù hợp. Cảm ơn một lần nữa. –

2

tôi đoán thoát tên $, $ email và các biến khác sẽ là đủ.

hãy xem chức năng mysql_real_escape_string.

+0

Vui lòng kiểm tra câu hỏi đã chỉnh sửa của tôi. Tôi không muốn sử dụng bất kỳ hàm PHP tích hợp nào; chỉ có phương pháp của Magento. Vui lòng cung cấp thêm tùy chọn và cảm ơn bạn đã thử. –

+0

@KC - xin lỗi, tôi không quen với magento. tôi đã trả lời một điều rõ ràng và rõ ràng, nhưng có vẻ như nó không rõ ràng sau tất cả;) – 0xAF

+0

Đó là okay, cho nỗ lực của bạn. +1 –

2

Trong tệp tài nguyên.

public function saveToTable($param){ 

$table = $this->getMainTable(); 

$this->_getWriteAdapter->insert($table,array(
      'col_1'=>$param['data1'] 
      'col_2'=>$param['data2'] 
      'col_3'=>$param['data3'] 
    )); 
} 

trả về số hàng bị ảnh hưởng.

13

Tôi đang sử dụng này để chèn nhiều hàng vào bảng

$table = Mage::getSingleton('core/resource')->getTableName('table_name'); 
$rows = array(
    array('cal_1'=>'value','cal_2'=>'value','cal_3'=>'value'), 
    array('cal_1'=>'value','cal_2'=>'value','cal_3'=>'value') 
); 

public function insertRows($table,$rows) 
{ 
    $write = Mage::getSingleton('core/resource')->getConnection('core_write'); 
    $write->insertMultiple($table,$rows); 
} 
Các vấn đề liên quan