int sqlite3_set_authorizer( sqlite3*, int (*xAuth)(void*,int,const char*,const char*,const char*,const char*), void *pUserData );
此例程會使用第一個參數提供的特定資料庫連線註冊一個授權回呼。當 SQL 陳述式正在被 sqlite3_prepare() 或其變體 sqlite3_prepare_v2()、sqlite3_prepare_v3()、sqlite3_prepare16()、sqlite3_prepare16_v2() 和 sqlite3_prepare16_v3() 編譯時,會呼叫授權回呼。在編譯過程中,當建立邏輯來執行各種動作時,會呼叫授權回呼以查看是否允許這些動作。授權回呼應返回 SQLITE_OK 以允許該動作,返回 SQLITE_IGNORE 以禁止特定動作但允許 SQL 陳述式繼續編譯,或返回 SQLITE_DENY 以導致整個 SQL 陳述式被拒絕並產生錯誤。如果授權回呼返回 SQLITE_IGNORE、SQLITE_OK 或 SQLITE_DENY 以外的任何值,則觸發授權器的 sqlite3_prepare_v2() 或等效呼叫將會失敗並顯示錯誤訊息。
當回呼返回 SQLITE_OK 時,表示請求的操作正常。當回呼返回 SQLITE_DENY 時,觸發授權器的 sqlite3_prepare_v2() 或等效呼叫將會失敗,並顯示說明拒絕存取的錯誤訊息。
授權回呼的第一個參數是 sqlite3_set_authorizer() 介面第三個參數的副本。回呼的第二個參數是一個整數動作代碼,用於指定要授權的特定動作。回呼的第三到第六個參數是指向 NULL 的指標或以零結尾的字串,其中包含要授權的動作的其他詳細資訊。應用程式必須隨時準備好在授權回呼的第三到第六個參數中遇到 NULL 指標。
如果動作代碼是 SQLITE_READ 且回呼返回 SQLITE_IGNORE,則建構已準備好的陳述式,以 NULL 值取代如果返回 SQLITE_OK 則會讀取的資料表欄位。SQLITE_IGNORE 返回值可用於拒絕不受信任的使用者存取資料表的個別欄位。當SELECT 參考一個資料表,但沒有從該資料表中擷取任何欄位值時(例如在查詢「SELECT count(*) FROM tab」中),會使用空字串作為欄位名稱,針對該資料表呼叫一次 SQLITE_READ 授權回呼。如果動作代碼是 SQLITE_DELETE 且回呼返回 SQLITE_IGNORE,則 DELETE 操作會繼續進行,但截斷最佳化會被停用,並且所有資料列都會被單獨刪除。
當從不可信的來源準備 SQL 陳述式時,會使用授權器,以確保 SQL 陳述式不會嘗試存取它們不被允許查看的數據,或者不會嘗試執行損壞資料庫的惡意陳述式。例如,應用程式可能允許使用者輸入任意 SQL 查詢以供資料庫評估。但應用程式不希望使用者能夠對資料庫進行任意更改。然後,可以在準備使用者輸入的 SQL 時設置一個授權器,它除了SELECT陳述式之外,禁止所有其他操作。
需要處理來自不可信來源的 SQL 的應用程式,除了使用授權器之外,還可以考慮使用 sqlite3_limit() 降低資源限制,並使用 max_page_count PRAGMA 限制資料庫大小。
資料庫連線上一次只能設置一個授權器。每次呼叫 sqlite3_set_authorizer 都會覆蓋之前的呼叫。透過安裝 NULL 回呼來停用授權器。預設情況下,授權器是停用的。
授權器回呼不得執行任何會修改調用授權器回呼的資料庫連線的操作。請注意,在本段中,「修改」指的是 sqlite3_prepare_v2() 和 sqlite3_step() 都會修改它們的資料庫連線。
當使用 sqlite3_prepare_v2() 準備陳述式時,由於結構描述變更,該陳述式可能會在 sqlite3_step() 期間重新準備。因此,應用程式應確保在 sqlite3_step() 期間,正確的授權器回呼保持在適當的位置。
請注意,授權器回呼僅在 sqlite3_prepare() 或其變式期間被調用。在 sqlite3_step() 中的陳述式評估期間不會執行授權,除非如前一段所述,sqlite3_step() 調用 sqlite3_prepare_v2() 在結構描述變更後重新準備陳述式。