Dar*_*ria 4 php java postgresql json
编写 API 我曾经在 Java(或 PHP,无论)方面验证所有输入参数,但现在我们将 DB 移至 PostgreSQL,这为我们提供了出色的 JSON 功能,例如从表行构建 JSON 等等(我没有到目前为止,我们可以在没有 PGSQL JSON 函数的情况下找到任何我们不能做的事情)。所以我想如果我对 Postgres 进行所有参数验证会怎样(还考虑到我可以直接从数据库返回 JSON)?
在 Java 中,我是这样制作的:
if (!params.has("signature"))
//params comes from @RequestBody casted to JSONObject
return errGenerator.genErrorResponse("e01"); //this also need database access to get error description
Run Code Online (Sandbox Code Playgroud)
在 Postgres 上,我会这样做(经过测试,按预期工作):
CREATE OR REPLACE FUNCTION test.testFunc(_object JSON)
RETURNS TABLE(result JSON) AS
$$
BEGIN
IF (_object -> 'signature') IS NULL --so needed param is empty
THEN
RETURN QUERY (SELECT row_to_json(errors)
FROM errors
WHERE errcode = 'e01');
ELSE --everything is okay
RETURN QUERY (SELECT row_to_json(other_table)
FROM other_table);
END IF;
END;
$$
LANGUAGE 'plpgsql';
Run Code Online (Sandbox Code Playgroud)
等等...
到目前为止,我看到的一个问题是,如果我们转向 MS SQL 或 Sybase,它将需要重写所有过程。但随着 NoSQL 现在越来越多,这似乎不太可能,如果我们转向 NoSQL DB,我们还必须重新编码所有 API
您基本上必须考虑两个项目:
支票离数据存储越近,就越安全。如果您让数据库执行所有检查,那么无论您如何与其交互,无论是通过您的应用程序,还是通过您可能使用的某些第三方工具(即使仅用于维护),都将执行这些检查。从这个意义上说,在数据库端检查提高了安全性(如“数据一致性”)。在这方面,让数据库执行检查确实很有意义。
你越接近用户,你就能越快地回应他/她的输入。如果您有一个需要快速响应时间的 Web 应用程序,您可能希望在客户端进行检查。
并考虑一个重要的:
您可以有第三种方式:依次进行两项检查,首先是应用程序(客户端)端,然后是数据库(服务器)端。除非您有一些复杂的自动化,否则这需要额外的工作来确保执行的所有检查都是一致的。也就是说,在客户端不应该有任何被数据库检查时允许通过的数据被阻止。至少,最基本的检查是在第一阶段执行的,所有这些(即使它们是多余的)都在数据库中执行。
如果您有时间在多个应用程序层之间移动数据,我会选择安全。但是,要做出的选择是特定于案例的。