2020/02/19

Json SQL (JSQL) 概述

打造自己的GraphQL!
縁起

研究GraphQL後,發現它和SOAP的概念蠻像的,要先製定出前後端都認識的Schema,查詢的方式就是透過Schema放入查詢條件,很特別的是GraphQL可以在1次查詢取得多個Schema或多個查詢結果。省下很多Client發送Request/Response交握的時間成本。

SOAP的WSIL(WS-Inspection document)很類似GrapQL的Schema



GraphQL安全性

GraphQL安全性在於後端製定的Schema,所以Client端就不能太出格進行查詢,例如SQL Injection之類的攻擊對於GrapQL來說簡直是自然免疫。

GraphQL結構開發性

GraphQL結構上是以JSON做出類似SQL的查詢方式,在前端封裝也很方便,和JavaScript對XML的操作相比,JSON還是簡單很多的。

GraphQL效率

GraphQL嚴格來說是一種設計規範,目前市場主要以【Apollo】和【Yoga】這兩家團隊提供GrapQL Server建置方案,基於NodeJS Web Server的好處網路上太多了,在這邊就不再贅述。

GraphQL主觀評分(滿分10分)

安全性: 6 ⭐⭐⭐⭐⭐⭐
開發性: 8 ⭐⭐⭐⭐⭐⭐⭐⭐
效 率: 8 ⭐⭐⭐⭐⭐⭐⭐⭐

好處很多,但還是不夠

話說前頭,SQL Server這堵高牆就在眼前,能爬上它的就是好工具。
而NodeJS比較佳的使用環境是Linux,但載體是NAS,眼下最方便的就只有PHP+Apache可以選擇,但NAS的封閉環境就是和SQL SERVER無緣!
要為DB另外設計Schema這件事好像有點畫蛇添足,如果可以直接做ORM對應,就更加省事了!

雖然GraphQL很好,但不適合我使用的場合,NodeJS不是NAS預設的WebServer,同樣也不適用。

於是便興起自己刻GraphQL的念頭,開始尋找GraphQL的替代方案。



不在前端直上SQL的理由

避孕。



理想目標

  • 一次Request可以進行多個SQL CURD (DML)的處理,並回傳其資料結果。
  • 迴避SQL Injection攻擊是安全最低標準。
  • Schema自動對應Database Table。

一次Request可以進行多個SQL CURD (DML)的處理,並回傳其資料結果

這是GraphQL最吸引我的優點,所以這個項目為必要實作。前端可以直上CURD已經要承擔很大的資料人為操控風險,再增加DDL無異是找自己麻煩,DDL就輔以API處理會比較安心。

又或是搭配登入權限來調整DML可控內容也可以進一步定義。

迴避SQL Injection攻擊是安全最低標準

每個DML都必須加入參數化查詢,若無參數則視為解析失敗。另外能查詢的表格以Base Table和View為限,避免使用到系統物件(sys.*)進而造成不必要的資訊洩漏。

Schema自動對應Database Table

在開發初期,資料表格和欄位是經常異動的,這樣會造成頻繁修改Schema導致前後端和資料庫都必須一同調整。這功能可以專注在前端及資料庫上,加快程式產出時間。


網路上的資源

NPM Json-Sql-Builder2
在Github裡找到JSB,它的文件就是定義JSON和SQL轉換的結構,文件裡的範例相當直覺,概念很適合重製。

JSB的範例非常清楚好懂

結論

前端要使用SQL直接操作資料庫所要承擔的風險相當高,若要在安全性和開發易用性取得平衡,使用GraphQL是很棒的方案,規範有了,打造屬於自己的GQL不是夢。

參考了json-sql-builder後,發現我的想法更偏向這種JSQL的設計方式,


實作結果如上圖,能做出成果感覺超棒!


See also



沒有留言:

張貼留言