描述
注册具有特定数据库连接的授权器回调。
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_open,sqlite3_open16或sqlite3_open_v2获取的sqlite3对象指针。 数据库连接不能关闭。
pAuthCallBack
[in]指向回调函数的指针。
pUserData
[in]作为唯一参数传递给回调函数的数据。
返回值
如果成功返回SQLITE_OK,否则返回错误代码。
备注
由于sqlite3_prepare或其变体sqlite3_prepare_v2,sqlite3_prepare16和sqlite3_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_v2和sqlite3_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;
}