2012-01-16 31 views
7

Theo PDO PHP Tài liệu :: chuẩn bị() thêm dấu ngoặc kép để tất cả các thông số của bạn để bạn không cần phải lo lắng về việc làm việc đó:Đối phó với trích dẫn thêm bởi PDO :: chuẩn bị()

Nếu một ứng dụng độc quyền sử dụng các câu lệnh chuẩn bị, nhà phát triển có thể chắc chắn rằng không có SQL injection nào xảy ra (tuy nhiên, nếu các phần khác của truy vấn đang được sử dụng) được xây dựng với đầu vào không thoát, SQL injection vẫn có thể). "

Vấn đề với điều này đối với tôi là cách tôi đang xây dựng các truy vấn và cấu trúc cơ sở dữ liệu của mình. Thông thường, phần FROM của một câu lệnh SQL sẽ không cần phải được parametrized vì Bảng có thể sẽ được xác định bởi đầu vào người dùng trực tiếp. Tuy nhiên với mã của tôi là trường hợp ở một số nơi và do đó tôi cảm thấy thoải mái hơn với phiên bản parametrized.

SELECT * FROM ? WHERE ?=? 

thay vì SELECT * FROM tablename WHERE? =?

Vì vậy, câu hỏi của tôi là điều này, có thể ngăn PDO Object của tôi thêm dấu ngoặc kép xung quanh tham số FROM để tôi không nhận được các lỗi SQL được ném vào mặt tôi không? Hay tôi phải làm điều này theo một cách khác.

+2

Câu hỏi chính xác là gì? – jeroen

+0

Nó không nhất thiết phải thêm dấu ngoặc kép. Các trình điều khiển hỗ trợ các câu lệnh được chuẩn bị sẵn có sẽ giữ nguyên '?' Và máy chủ cơ sở dữ liệu thực hiện việc thay thế. - Tuy nhiên, bạn cần phải giải thích cụ thể mã của bạn đang làm gì và tại sao đó là vấn đề ở đây. Thêm ''?'' Hoặc '': placeholder'' trong các mệnh đề FROM của bạn là các chuỗi ký tự, chứ không phải các tham số ràng buộc. – mario

+0

Xin lỗi về điều đó, tôi vô tình nhấn enter trước khi tôi gõ xong câu hỏi – hamalnamal

Trả lời

4

Trình giữ chỗ trong các câu lệnh đã chuẩn bị chỉ dành cho các giá trị. Cách duy nhất để chèn tên bảng động là tự làm điều đó

"SELECT FROM `".$table."` WHERE `".$column."` = ?" 
+3

Và tất nhiên chỉ cần gói giá trị với bọ ve không an toàn nếu nội dung biến đến từ một nguồn bị nhiễm độc. – Matthew

+0

@YourCommonSense Bạn có thể cho tôi trường hợp sử dụng không, tên _table_ và _column_ đến từ nguồn nào ngoài tầm kiểm soát của bạn? Khi họ _somehow_ dựa vào đầu vào của người dùng, việc cung cấp cho họ mật khẩu DB của bạn dễ dàng hơn nhiều. Điều này nói rằng bạn có thể cho rằng họ đến từ một nguồn đáng tin cậy (một cấu hình ví dụ, hoặc hardcoded ở một nơi khác), hoặc bạn đã làm một cái gì đó rất sai. Và nó vẫn không ngăn cản bạn sử dụng bộ não của bạn :) – KingCrunch

+0

Nói chuyện giá rẻ, anh chàng. –

2

@KingCrunch hầu như đúng trong câu trả lời của anh ấy. Bạn nên thực sự thoát khỏi chuỗi của riêng bạn. Một cái gì đó như thế này nên bảo vệ chống lại hầu hết các mũi tiêm:

//make sure $table and $column only contain alphanumeric chars 
$table = preg_replace("/[^A-Za-z0-9]/", '', $table); 
$column = preg_replace("/[^A-Za-z0-9]/", '', $column); 

$query = "SELECT FROM `{$table}` WHERE `{$column}` = ?" 
Các vấn đề liên quan