Skip to content

Commit

Permalink
SQLite3: add DEFENSIVE config for SQLite >= 3.26.0 as a mitigation st…
Browse files Browse the repository at this point in the history
…rategy against potential security flaws
  • Loading branch information
bohwaz authored and krakjoe committed Mar 11, 2019
1 parent 66bd861 commit 58c25bf
Show file tree
Hide file tree
Showing 6 changed files with 74 additions and 1 deletion.
3 changes: 2 additions & 1 deletion NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@ PHP NEWS
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
?? ??? 2019, PHP 7.1.28


- SQLite3:
. Added sqlite3.defensive INI directive. (BohwaZ)

07 Mar 2019, PHP 7.1.27

Expand Down
1 change: 1 addition & 0 deletions ext/sqlite3/php_sqlite3.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ extern zend_module_entry sqlite3_module_entry;

ZEND_BEGIN_MODULE_GLOBALS(sqlite3)
char *extension_dir;
int dbconfig_defensive;
ZEND_END_MODULE_GLOBALS(sqlite3)

#ifdef ZTS
Expand Down
9 changes: 9 additions & 0 deletions ext/sqlite3/sqlite3.c
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,9 @@ static void php_sqlite3_error(php_sqlite3_db_object *db_obj, char *format, ...)
*/
PHP_INI_BEGIN()
STD_PHP_INI_ENTRY("sqlite3.extension_dir", NULL, PHP_INI_SYSTEM, OnUpdateString, extension_dir, zend_sqlite3_globals, sqlite3_globals)
#if SQLITE_VERSION_NUMBER >= 3026000
STD_PHP_INI_ENTRY("sqlite3.defensive", "1", PHP_INI_SYSTEM, OnUpdateBool, dbconfig_defensive, zend_sqlite3_globals, sqlite3_globals)
#endif
PHP_INI_END()
/* }}} */

Expand Down Expand Up @@ -166,6 +169,12 @@ PHP_METHOD(sqlite3, open)
sqlite3_set_authorizer(db_obj->db, php_sqlite3_authorizer, NULL);
}

#if SQLITE_VERSION_NUMBER >= 3026000
if (SQLITE3G(dbconfig_defensive)) {
sqlite3_db_config(db_obj->db, SQLITE_DBCONFIG_DEFENSIVE, 1, NULL);
}
#endif

if (fullpath != filename) {
efree(fullpath);
}
Expand Down
40 changes: 40 additions & 0 deletions ext/sqlite3/tests/sqlite3_defensive.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
--TEST--
SQLite3 defensive mode ini setting
--SKIPIF--
<?php require_once(__DIR__ . '/skipif.inc');

if (SQLite3::version()['versionNumber'] < 3026000) {
die("skip: sqlite3 library version < 3.26: no support for defensive mode");
}

?>
--INI--
sqlite3.defensive=On
--FILE--
<?php

$db = new SQLite3(':memory:');
var_dump($db->exec('CREATE TABLE test (a, b);'));

// This does not generate an error!
var_dump($db->exec('PRAGMA writable_schema = ON;'));
var_dump($db->querySingle('PRAGMA writable_schema;'));

// Should be 1
var_dump($db->querySingle('SELECT COUNT(*) FROM sqlite_master;'));

// Should generate an error!
var_dump($db->querySingle('DELETE FROM sqlite_master;'));

// Should still be 1
var_dump($db->querySingle('SELECT COUNT(*) FROM sqlite_master;'));
?>
--EXPECTF--
bool(true)
bool(true)
int(1)
int(1)

Warning: SQLite3::querySingle(): Unable to prepare statement: 1, table sqlite_master may not be modified in %s on line %d
bool(false)
int(1)
11 changes: 11 additions & 0 deletions php.ini-development
Original file line number Diff line number Diff line change
Expand Up @@ -991,8 +991,19 @@ cli_server.color = On
;intl.use_exceptions = 0

[sqlite3]
; Directory pointing to SQLite3 extensions
; http://php.net/sqlite3.extension-dir
;sqlite3.extension_dir =

; SQLite defensive mode flag (only available from SQLite 3.26+)
; When the defensive flag is enabled, language features that allow ordinary
; SQL to deliberately corrupt the database file are disabled. This forbids
; writing directly to the schema, shadow tables (eg. FTS data tables), or
; the sqlite_dbpage virtual table.
; https://www.sqlite.org/c3ref/c_dbconfig_defensive.html
; (for older SQLite versions, this flag has no use)
sqlite3.defensive = 1

[Pcre]
;PCRE library backtracking limit.
; http://php.net/pcre.backtrack-limit
Expand Down
11 changes: 11 additions & 0 deletions php.ini-production
Original file line number Diff line number Diff line change
Expand Up @@ -991,8 +991,19 @@ cli_server.color = On
;intl.use_exceptions = 0

[sqlite3]
; Directory pointing to SQLite3 extensions
; http://php.net/sqlite3.extension-dir
;sqlite3.extension_dir =

; SQLite defensive mode flag (only available from SQLite 3.26+)
; When the defensive flag is enabled, language features that allow ordinary
; SQL to deliberately corrupt the database file are disabled. This forbids
; writing directly to the schema, shadow tables (eg. FTS data tables), or
; the sqlite_dbpage virtual table.
; https://www.sqlite.org/c3ref/c_dbconfig_defensive.html
; (for older SQLite versions, this flag has no use)
sqlite3.defensive = 1

[Pcre]
;PCRE library backtracking limit.
; http://php.net/pcre.backtrack-limit
Expand Down

0 comments on commit 58c25bf

Please sign in to comment.