2010-02-08 22 views
7

這是不可能sqlite3_bind_text表名,因爲sqlite3_prepare_v2未能準備語句,如:有沒有用於引用/轉義表名稱的C SQLite API?

SELECT * FROM ? ; 

我假定表名是需要解析的語句,所以報價需要sqlite3_prepare_v2之前已經發生。

有沒有像sqlite3_quote_tablename?也許它已經存在於我無法識別的名稱下,但我在函數列表中找不到任何東西。

+1

您提議的sqlite3_quote_tablename函數可以清理輸入以防止SQL注入攻擊。要做到這一點,它可以解析輸入以確保它是一個字符串文字。 http://www.sqlite.org/lang_expr.html#litvalue – momeara 2011-07-28 12:51:12

+0

一個非常遲的迴應:謝謝,那是我採取的路線。不過,我的前僱主現在擁有這些代碼。如果你想發佈這個答案,我會接受它:) – gavinbeatty 2012-01-12 13:53:09

回答

1

你提出的sqlite3_quote_tablename功能,可以淨化輸入,以防止SQL注入攻擊。要做到這一點,它可以解析輸入以確保它是一個字符串文字。 http://sqlite.org/lang_expr.html#litvalue

+0

T他的回答是我提出的函數不存在,並且鏈接是實現它的有用指南;) – gavinbeatty 2012-01-16 14:40:18

2

如果表名中包含無效字符,則可以使用雙引號括起表名,如下所示。

​​

當然,您應該儘可能避免使用無效字符。它使開發複雜化並且幾乎總是不必要的(IMO唯一需要的時候是當你繼承一個已經這樣完成的項目並且它太大而不能改變時)。

+0

問題是以編程方式做到這一點。有沒有官方的方法? – gavinbeatty 2010-02-10 11:12:31

+0

+1是我能找到的第一個來源,告訴我表格和列的轉義字符。顯然我的google-fu今天很脆弱...... – 2012-03-15 19:22:17

+0

@Charlie Kilian,謝謝,sql從一個數據庫到另一個數據庫是非常一致的,最難的部分是找到所有不一致的地方。其他一些數據庫,如sql server和access,使用'['和']'來轉義無效的對象名稱。 sqlite ustes''',有趣的是,它也可以用於字符串,儘管'''更標準,並且在sqlite和大多數數據庫中都支持。 – 2012-03-16 01:43:58

0

如果SQLite不接受表名作爲參數,我不認爲這是你的問題的解決方案......

要考慮到:沒有分配

參數使用sqlite3_bind()的值被視爲NULL。

所以在查詢的情況下,表名將是NULL,當然這是無效的。

+0

'sqlite3_prepare_v2'階段失敗時'sqlite3_step'沒有語句 I' m詢問是否有另一個API可用於執行類似綁定表名的操作,如bash中的'printf'%q「' 編輯:格式 – gavinbeatty 2010-02-10 11:15:10

+1

我的意思是說你不能編寫一個可能導致 – 2010-02-10 12:22:31

1

當使用SQLite製備的參數的語句的參數:「指定要在運行時填充在文字值在表達式的佔位符」

執行任何SQL語句,SQLite的「編譯」之前將SQL字符串轉換爲由內部虛擬機執行的一系列opcodes。 SQL語句在其上運行的表名和列名是編譯過程必需的。

可以使用的參數,以「價值」綁定到這樣準備的語句:

SELECT * FROM FOO WHERE name=?; 

然後調用sqlite3_bind_text()字符串gavinbeatty綁定到已編譯的語句。然而,這種結構意味着你無法使用的參數是這樣的:

SELECT * FROM ? WHERE name=?; // Can't bind table name as a parameter 
SELECT * FROM FOO WHERE ?=10; // Can't bind column name as a parameter 
+1

我知道表名不能被綁定,因爲解析/編譯階段需要表名 我正在尋找一種既定的方式來測試表名是否有效或規範化表名。 – gavinbeatty 2010-02-10 11:11:27

0

我在找這樣的東西,也找不到它。就我而言,預期的表名總是在一組固定的表中(因此這些很容易驗證)。另一方面,字段名不是我最終過濾字符串,幾乎刪除了所有不是字母,數字或下劃線(我知道我的字段將適合這個參數)。那就是訣竅。

相關問題