-
-
Notifications
You must be signed in to change notification settings - Fork 87
Description
Why prepared statements are needed
The documentation links to this practice document for SQL safety:
https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html
It states:
Defense Option 4: STRONGLY DISCOURAGED: Escaping All User-Supplied Input¶
In this approach, the developer will escape all user input before putting it in a query. It is very database specific in its implementation. This methodology is frail compared to other defenses and we CANNOT guarantee that this option will prevent all SQL injections in all situations.
If an application is built from scratch or requires low risk tolerance, it should be built or re-written using parameterized queries, stored procedures, or some kind of Object Relational Mapper (ORM) that builds your queries for you.
In other words, we absolutely need prepared statements, if users are writing their own inputs to our queries or inserts.
Postgres?
I thought this must be possible by Postgres connection as this allows prepared statements. I managed to get a Postgres connection working by Rust tonight. But then I came to understand, as per the documentation:
Particularly, ArcadeDB does only support "simple" query mode and does not support SSL!
Simple query mode is no different than HTTP query. For example, in Rust with Postgres this is the same format of an HTTP Request (plain string, which is unsafe when you may have user written inputs):
let query_result = client.simple_query("SELECT * FROM Customer"); //hypothetically, just to show syntax
Other practices like whitelisting input are not possible when users can type their own text inputs such as free entry text fields. Limiting characters to a-z,A-Z, 0-9 is also not possible when you have global users inputting every variety of unicode or emojis or punctuation.
JDBC?
Is JDBC then the only way to perform prepared statements with Arcade? If so I think this should be better documented in the documentation.
Say from a Rust or Elixir server, which is interfacing to Arcade installed and running on a separate Ubuntu server - I can get a JDBC system working under my Rust server. Is that then my only choice to connect and query/insert to Arcade from there safely?
Whatever the answer, I think the options for prepared statements should be more clearly enumerated in the documentation, given how critical this is.
Are the options (whatever they are) ever likely to change as well? Thanks for any thoughts or clarification.