int sqlite3_set_authorizer( sqlite3 *, int(* xAuth)(void *,int,const char *,const char *,const char *,const char *), 无效* pUserData );
此例程使用第一个参数中提供的特定数据库连接注册授权者回调 。当sqlite3_prepare()或其变体sqlite3_prepare_v2(), sqlite3_prepare_v3(),sqlite3_prepare16(),sqlite3_prepare16_v2()和sqlite3_prepare16_v3()编译SQL语句时,将调用Authorizer回调。在编译过程中的各个阶段,随着创建逻辑来执行各种动作,将调用授权者回调以查看是否允许这些动作。授权者回调应返回SQLITE_OK以允许操作SQLITE_IGNORE不允许执行特定操作,但允许继续编译SQL语句,或者允许SQLITE_DENY导致整个SQL语句被错误拒绝。如果授权者回调返回除SQLITE_IGNORE,SQLITE_OK或SQLITE_DENY之外的任何其他值, 则触发授权者的sqlite3_prepare_v2()或等效调用将失败,并显示一条错误消息。
当回调返回SQLITE_OK时,这意味着请求的操作正常。当回调返回SQLITE_DENY时,触发授权者的 sqlite3_prepare_v2()或等效调用将失败,并显示一条错误消息,说明访问被拒绝。
Authorizer回调的第一个参数是sqlite3_set_authorizer()接口的第三个参数的副本。回调的第二个参数是整数操作代码,它指定要授权的特定操作。回调的第三到第六个参数是NULL指针或零终止的字符串,其中包含有关要授权的操作的其他详细信息。应用程序必须始终准备在授权回调的第三个参数到第六个参数中的任何一个中遇到NULL指针。
如果操作代码为SQLITE_READ ,并且回调函数返回SQLITE_IGNORE,则将 准备语句语句构造为替换NULL值,以代替如果已返回SQLITE_OK将被读取的表列。所述SQLITE_IGNORE 返回可用于拒绝一个表中的各个列不可信的用户访问。当SELECT引用表但没有从该表中提取列值时(例如,在诸如“ SELECT count(*)FROM tab”之类的查询中),则对该表的SQLITE_READ Authorizer回调将被调用一次,其列名为是一个空字符串。如果操作代码为SQLITE_DELETE并且回调返回 SQLITE_IGNORE,然后继续执行DELETE操作,但 截断优化被禁用,并且所有行均被单独删除。
从不受信任的来源准备SQL语句时,将使用授权者,以确保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()或其变体期间调用authorizer回调 。除非如上一段所述,否则在sqlite3_step()中的语句评估期间不会执行授权,除非在上一段中声明,否则sqlite3_step()调用sqlite3_prepare_v2()以在模式更改后重新声明语句。