2013-05-08 62 views
2

在我的CodeIgniter中,我將我的查詢綁定到一組變量。CodeIgniter - 查詢綁定「order by」

$q  = "SELECT * FROM my_table WHERE name=? ORDER BY ?"; 
$name  = $this->input->get("name"); 
$order_by = $this->input->get("order_by"); 
$this->db->query($q, array($name, $order_by)); 

但「order_by」工作不正常。我已經搜遍了,但我不知道如何「清理」「order by」條款。

回答

1
$order_by = $this->db->escape_like_str($this->input->get("order_by")); 
$q  = "SELECT * FROM my_table WHERE name=? ORDER BY {$order_by}"; 
$name  = $this->input->get("name"); 
$this->db->query($q, array($name)); 

請參考此鏈接,這最適合您的要求。

Query Binding in codeigniter

+0

這不消毒的$ ORDER_BY價值 - 並不妨礙對ORDER_BY變量SQL注入。 – ericbae 2013-05-08 08:32:39

+0

我認爲這在一定程度上是安全的。 http://ellislab.com/codeigniter/user-guide/database/queries.html – 2013-05-08 08:47:14

+0

我通過URL運行上述查詢如下 - http:// myapp/get_table?name = table_name&order_by = id - 現在,我可以做一個下面的SQL注入http:// myapp/get_table?name = table_name&order_by = id; select * from用戶 - 並且注入的查詢將返回結果 - 所以我不認爲它是安全的。 – ericbae 2013-05-08 08:51:30

2

嘗試這種方式,

$order_by_arr = array('name', 'age', 'date'); 
if (!in_array($order_by, $order_by_arr)) { 
    $order_by = 'name'; 
} 

// now u can use $order_by. its safe :) ... 
+0

嗯。有道理,但似乎有點哈克! – ericbae 2013-05-08 08:55:42

+0

不應該是(in_array)而不是if(!in_array)? – ericbae 2013-05-08 08:56:53

+0

是的。取決於你。我剛剛說了一個主意。 :) – Dino 2013-05-08 08:57:33