勇芳软件工作室.汉化:  SQLite3 API Functions > Database Connection >

sqlite3_set_authorizer

Previous pageReturn to chapter overviewNext page

描述

 

注册具有特定数据库连接的授权器回调。

 

C / C ++语法

 

int sqlite3_set_authorizer(

sqlite3*,

nt (*xAuth)(void*,int,const char*,const char*,const char*,const char*),

void *pUserData

);

 

PB语法

 

FUNCTION sqlite3_set_authorizer ( _

BYVAL hDbc AS DWORD, _

BYVAL pAuthCallback AS DWORD, _

BYVAL pUserData AS DWORD _

) AS LONG

 

参数

 

pDb

 

[in]数据库连接句柄。必须是从sqlite3_opensqlite3_open16sqlite3_open_v2获取的sqlite3对象指针。 数据库连接不能关闭。

 

pAuthCallBack

 

[in]指向回调函数的指针。

 

pUserData

 

[in]作为唯一参数传递给回调函数的数据。

 

返回值

 

如果成功返回SQLITE_OK,否则返回错误代码。

 

备注

 

由于sqlite3_prepare或其变体sqlite3_prepare_v2sqlite3_prepare16sqlite3_prepare16_v2正在编译SQL语句,因此调用授权器回调。在编译过程中的各个不同点,由于正在创建逻辑以执行各种操作,调用授权程序回调以查看是否允许这些操作。授权器回调应返回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接口的第三个参数的副本。回调的第二个参数是一个整数操作代码,指定要授权的特定操作。回调的第三到第六个参数是零终止的字符串,其中包含有关要授权的操作的其他详细信息。

 

如果操作代码为SQLITE_READ,并且回调函数返回SQLITE_IGNORE,则准备好的语句语句被构造为替换NULL值,代替已经返回SQLITE_OK时已被读取的表列。SQLITE_IGNORE返回可用于拒绝不受信任的用户访问表的各个列。如果操作代码为SQLITE_DELETE,并且回调返回SQLITE_IGNORE,则DELETE操作继续进行,但截断优化被禁用,并且所有行都被单独删除。

 

从不受信任的源准备SQL语句时,将使用授权器,以确保SQL语句不会尝试访问不允许查看的数据,也不会尝试执行损坏数据库的恶意语句。例如,应用程序可能允许用户输入任意SQL查询以供数据库进行评估。但应用程序不希望用户能够对数据库进行任意更改。然后,在用户输入的SQL准备不允许除SELECT语句之外的所有内容的情况下,可以将授权器置于原位。

 

需要从不受信任来源处理SQL的应用程序也可能会考虑使用sqlite3_limit降低资源限制,并使用max_page_count PRAGMA限制数据库大小以及使用授权器。

 

一次只能在数据库连接上建立一个授权器。每次致电sqlite3_set_authorizer将覆盖以前的呼叫。通过安装NULL回调来禁用授权者。授权器默认禁用。

 

授权人回调不能做任何修改调用授权器回调的数据库连接的事情。请注意,sqlite3_prepare_v2sqlite3_step都会修改其数据库连接,以获取本段中“modify”的含义。

 

sqlite3_prepare_v2用于准备语句时,由于模式更改,该语句可能会在sqlite3_step期间重新准备。因此,应用程序应确保在sqlite3_step期间正确的授权人回调保留到位。

 

请注意,只有sqlite3_prepare或其变体才会调用授权器回调。在sqlite3_step中的语句评估期间不执行授权,除非前一段所述,sqlite3_step调用sqlite3_prepare_v2在模式更改后重新编写语句。

 

C ++实现代码

 

/*

** Set or clear the access authorization function.

**

** The access authorization function is be called during the compilation

** phase to verify that the user has read and/or write access permission on

** various fields of the database.  The first argument to the auth function

** is a copy of the 3rd argument to this function.  The second argument

** to the auth function is one of these constants:

**

**       SQLITE_CREATE_INDEX

**       SQLITE_CREATE_TABLE

**       SQLITE_CREATE_TEMP_INDEX

**       SQLITE_CREATE_TEMP_TABLE

**       SQLITE_CREATE_TEMP_TRIGGER

**       SQLITE_CREATE_TEMP_VIEW

**       SQLITE_CREATE_TRIGGER

**       SQLITE_CREATE_VIEW

**       SQLITE_DELETE

**       SQLITE_DROP_INDEX

**       SQLITE_DROP_TABLE

**       SQLITE_DROP_TEMP_INDEX

**       SQLITE_DROP_TEMP_TABLE

**       SQLITE_DROP_TEMP_TRIGGER

**       SQLITE_DROP_TEMP_VIEW

**       SQLITE_DROP_TRIGGER

**       SQLITE_DROP_VIEW

**       SQLITE_INSERT

**       SQLITE_PRAGMA

**       SQLITE_READ

**       SQLITE_SELECT

**       SQLITE_TRANSACTION

**       SQLITE_UPDATE

**

** The third and fourth arguments to the auth function are the name of

** the table and the column that are being accessed.  The auth function

** should return either SQLITE_OK, SQLITE_DENY, or SQLITE_IGNORE.  If

** SQLITE_OK is returned, it means that access is allowed.  SQLITE_DENY

** means that the SQL statement will never-run - the sqlite3_exec() call

** will return with an error.  SQLITE_IGNORE means that the SQL statement

** should run but attempts to read the specified column will return NULL

** and attempts to write the column will be ignored.

**

** Setting the auth function to NULL disables this hook.  The default

** setting of the auth function is NULL.

*/

SQLITE_API int sqlite3_set_authorizer(

sqlite3 *db,

int (*xAuth)(void*,int,const char*,const char*,const char*,const char*),

void *pArg

){

sqlite3_mutex_enter(db->mutex);

db->xAuth = xAuth;

db->pAuthArg = pArg;

sqlite3ExpirePreparedStatements(db);

sqlite3_mutex_leave(db->mutex);

return SQLITE_OK;

}