Prepared statements from SQL #
This feature is available in Acra only starting from 0.95.
Acra support alternative SQL interface to prepared statements
for MySQL
and PostgreSQL
.
This interface is not as efficient as using the binary protocol through a prepared statement API, but requires no programming because it is available directly at the SQL level.
PostgreSQL #
AcraServer fully supports syntax of prepared statements for PostgreSQL.
For Prepare query like:
PREPARE fooplan (int, text, bool, numeric) AS INSERT INTO foo VALUES($1, $2, $3, $4);
AcraServer will detect the prepared statement query and store it decomposed for further processing.
For Execute query like:
EXECUTE fooplan(1, 'Hunter Valley', 't', 200.00);
AcraServer will extract values based on the query stored in Prepare
query and perform encryption/decryption.
MySQL #
MySQL has a different syntax for prepared statements.
It uses SET @a = 'value';
queries to provide data in DB and uses it as a reference in EXECUTE
statements.
To apply any security controls on data provided by SET
queries. AcraServer expects it in the following format:
{table_from_encryptor_config}{delimiter}{column_from_encryptor_config}:
For encryptor config:
schemas:
- table: users
columns:
- id
- name
encrypted:
- column: name
and query:
SET @users__name = 'value'
AcraServer will detect and apply pure encryption for column name
from users
table.
To overwrite the delimiter
used in SET
queries, prepared_statements_set_arg_delimiter
setting could be used (if no setting provided the __
delimiter will be used by default)
database_settings:
mysql:
prepared_statements_set_arg_delimiter: '&&'
schemas:
- table: users
columns:
- id
- name
encrypted:
- column: name
It is also possible to use searchable encryption with SQL prepared statements. AcraServer will analyze and transform queries as the following:
PREPARE stmt1 FROM 'SELECT * FROM test_table WHERE searchable_field = ?';
PREPARE stmt1 FROM 'SELECT * FROM test_table WHERE substr(searchable_field, 1, <search HASH size>) = substr(?, 1, <search HASH size>,)';
And
PREPARE stmt1 FROM 'SELECT * FROM test_table WHERE searchable_field = 'value';
PREPARE stmt1 FROM 'SELECT * FROM test_table WHERE substr(searchable_field, 1, <search HASH size>) = '<searchable HASH>';