首頁>Club>
7
回覆列表
  • 1 # 網路圈

    WEB應用暴露在公網上,時刻都會面臨著各種各樣的攻擊,而SQL攻擊也是最為常見且危害很大的。

    SQL注入其實就是利用不嚴謹的SQL查詢方法和語言來構造具有危害性的SQL語句,資料庫一旦執行了這些SQL,駭客的目的就能達到了。像以前最為常見的SQL注入就是:" or 1="1 類似這種的SQL構造。

    考慮到資料庫型別不同,SQL操作上也是有一定區別的,但對於SQL注入防禦手段而言還是有一些共同方案的,結合我的開發經驗總結出一些方案供大家參考:

    1、使用者所有的輸入資料務必做校驗

    “永遠不要相信使用者的輸入”,所以在WEB應用中,但凡是使用者提交的資料我們都要進行合法性校驗,另外要做必要的資料型別轉換和過濾,比如通常我們會將使用者輸入的單號引、雙引號等字元做一個轉換,防止其直接傳遞到SQL語句中。

    2、SQL預編譯

    開發人員在處理查詢時,不要採取拼接SQL這種方式來處理,建議使用預編譯SQL,引數使用佔位符來替換。

    3、伺服器關閉錯誤回顯

    線上伺服器可以關閉具體的錯誤回顯,不要將具體的錯誤資訊暴露給攻擊者(如果暴露這些錯誤資訊會被駭客利用),所以通常我們都是做個友好的錯誤頁來作為出錯時的提示頁。

    像一些WEB容器、語言/指令碼/框架的版本資訊也要隱藏或者偽造一個。

    4、伺服器對GET、POST資料進行處理

    比如我們透過Nginx來對使用者的GET、POST資料進行一個校驗,如果包含某些危險字元(比如SQL關鍵字、特殊字元等),則直接拒絕請求。

    5、資料庫層面上嚴格控制權限

    不同應用使用不同的帳號來操作資料庫,不能使用超級帳戶來操作資料庫,另外不同業務分配不同的資料庫帳號,比如:只讀許可權、只寫許可權等,另外像DROP這類操作就不允許執行了。

    另外資料庫埠禁止網路訪問。

  • 2 # 定格往憶

    1.凡事涉及到使用者輸入操作的必須前後端檢驗,儘可能限制輸入的範圍,例如排除特殊字元

    2. 資料庫必須只能內網訪問,涉及到sql操作必須使用預編譯,防止sql直接提交到資料庫,例如mybatis的#佔位符,而不是$

    3. 鑑權:所有涉及到面向客戶的操作須鑑權,防止出現暴力破解情況,核心介面可做訪問統計,限流控制,錯誤資訊個性化定製,不暴露內部資訊,一般使用內部約定的錯誤碼等形式

  • 3 # 駱駝清人

    1. 能不用sql語句就不用

    比如很多orm 框架或庫都將sql語句操作隱藏起來了,你直接 new 一個物件,然後insert. 或 update. 從資料庫取出來也是一個物件。

    2. 非要用sql,儘量用預編譯

    預編譯的流程是先預編譯,然後繫結執行。 繫結時不會發生直接執行sql語句的注入問題

    3. 即使用非預編譯的sql 也有周邊工具防止注入

    工具就自己找吧,多的是。如 java 的 mybatis 的 sql類,xml中的#{},go語言內建庫中的多引數 exec 方法等等

  • 4 # 冷峰江湖

    第一,專案分層處理!邏輯層和資料層嚴格分開,不要隨意暴露資料表結構!

    第二,對使用者輸入進行驗證,對客戶輸入的資料進行引數化查詢!

  • 中秋節和大豐收的關聯?
  • 孩子天天哭晚上不睡覺,該怎麼辦?