Michael Vorburger created FINERACT-1095:
-------------------------------------------
Summary: Remove direct sqlSearch support from /clients and all
other APIs [Security & Performance]
Key: FINERACT-1095
URL: https://issues.apache.org/jira/browse/FINERACT-1095
Project: Apache Fineract
Issue Type: Improvement
Reporter: Michael Vorburger
While code reviewing PRs from [~Manthan] such as
[https://github.com/apache/fineract/pull/1171/files] and
[https://github.com/apache/fineract/pull/1123/files] re. FINERACT-854, I've
learnt about Fineract's support for an {{sqlSearch}} parameter on a number of
its APIs, such as {{/clients}} (and others).
According to [https://demo.fineract.dev/fineract-provider/api-docs/apiLive.htm]
:
{quote}_sqlSearch
String optional
Use an sql fragment valid for the underlying client schema to filter results.
e.g. display_name like %K%
{quote}
[https://github.com/apache/fineract/search?p=2&q=sqlSearch&unscoped_q=sqlSearch]
shows all current occurrences. There are a number, but not THAT many either.
(By far not every API supports this, only a handful.)
This can be used e.g. like this:
[https://demo.fineract.dev/fineract-provider/api/v1/clients?paged=true&sqlSearch=c.account_no=000000003&tenantIdentifier=default]
To me, this is an egregious violation of "layering architecture". Basically,
the REST API gives you direct SQL database access! You apparently have to know
the exact name of not the SQL table but the alias used in the respective
internally hard-coded query (note the use of {{c.}} in the example above, NOT
{{m_client}}), and the internal SQL column name (note the use of
{{account_no}}, NOT {{accountNo}}). There is no real documentation how to use
this, and even if there were, in my tests I've noticed its fairly easy to
provoke _500 Internal Server Errors_ when using {{sqlSearch}} with a slightly
wrong syntax.
>From a security point of view, it's not quite as bad as it looks, because
>there is code with heuristics to "validate" the {{sqlSearch}} and prevent SQL
>Injections. But that could have holes (I don't want to know!), so... this
>still isn't great, at all, IMHO.
>From a performance point of view, permitting clients to run arbitrary queries
>isn't great either. You can't really reliable offer performance guarantees, or
>offer tuning with indices, if at the end of the day the wide open API just
>lets a client "query whatever they want" anyway.
Use of {{sqlSearch}} by (public) API clients isn't that hard to find. I did
some digging, and:
* The new web-app UI doesn't use sqlSearch (or not yet), see
[https://github.com/openMF/web-app/search?q=sqlSearch&unscoped_q=sqlSearch]
* The old community-app UI does use sqlSearch, see
[https://github.com/openMF/community-app/search?p=1&q=sqlSearch&unscoped_q=sqlSearch].
But only in 2 very specific places, for Loans' {{l.loan_status_id in
(100,200)}} and Clients' {{c.status_enum=100}}. This was apparently introduced
by [~vishwasbabu] in
[https://github.com/openMF/community-app/pull/1582|https://github.com/openMF/community-app/pull/1582/files]
for [MIFOSX-2712.|https://mifosforge.jira.com/browse/MIFOSX-2712.] It's
noteworthy that the Find on
[https://cui.fineract.dev/.../clients|https://cui.fineract.dev/?baseApiUrl=https://demo.fineract.dev&tenantIdentifier=default#/clients]
does NOT use {{sqlSearch}} but the [/search
API|https://demo.fineract.dev/fineract-provider/api-docs/apiLive.htm#search]
* other repos on openMF, such as Mobile Apps & Co, don't realy seem to
actively use {{sqlSearch}}, looking at
[https://github.com/search?p=7&q=org%3AopenMF+sqlSearch&type=Code]
Other than that, I don't know if anyone actively using {{sqlSearch}} would have
any major objections to... just simply altogether removing this entirely? Folks
may of course be using this in their own client UIs, but... they really
shouldn't, this is a "bad" API. If you are missing a query facility, just
contribute to the upstream project and raise a pull request to add whatever
query option you are missing to whatever Fineract API (such as e.g. by status
for Loans and Clients).
Let's further discuss on the developer mailing list on thread "Use of sqlSearch
argument in Groups/Clients List" if anyone wants to strongly defend
{{sqlSearch}}. If not, let's just completely remove it. We do have to first
replace the small current use in the community-app.
PS: Nota bene that this issue isn't stating that a REST API with query
capabilities is bad per se. The point here is that an "SQL pass-through" is
wrong. We can, and to replace current existing use of {{sqlSearch}} in the
community-app must, add additional query parameters to API, as needed. Just
need a wide open "anything goes" too general query parameter like {{sqlSearch}}
.
[~ptuomola] I thought this kind of thing may interest you, feel free to chime
in.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)