MySQL--SQL中的安全问题
---恢復內容開始---
1) SQL 注入簡介
SQL 注入(SQL Injection) 就是利用某些數據庫的外部接口將用戶數據插入到實際的數據庫操作語言(SQL)當中,從而達到入侵數據庫乃至操作系統的目的。他的產生主要是由程序對用戶輸入的數據沒有進行嚴格的過濾,導致非法數據庫查詢語句的執行。
?
2) 應用開發中可以采取的應對措施
- PrepareStatement + Bind-Variable
MySQL 服務器端并不存在共享池概念,所以在 MySQL 上使用綁定變量(Bind Variable)最大的好處主要是為了避免 SQL 注入,增加安全性。
同樣,使用注釋 /* 或 # 讓后續條件失效也可以防范。
需要注意,PrepareStatement 語句是由 JDBC 驅動來支持的,在使用 PrepareStatement 語句的時候,僅僅做了簡單的替換和轉義,并不是 MySQL 提供了 PrepareStatement 的特性。對 Java、JSP 開發的應用,可以使用?PrepareStatement + Bind-Variable 來防止 SQL 注入,另外從 PHP 5開始,也在擴展的 MySQLI 中支持 PrepareStatement,所以在使用這類語言作數據庫開發時,強烈建議使用 PrepareStatement + Bind-variable 來實現。
- 使用應用程序提供的轉換函數
很多應用程序接口都提供了對特殊字符進行轉換的函數,恰當的使用這些函數,可以防止應用程序用戶輸入使應用程序生成不期望的語句。
MySQL C API: 使用 mysql_real_escape_string() API 調用
MySQL++: 使用 escape 和 quote 修飾符
PHP: 使用 mysql_real_escape_string() 函數(適用于 PHP 4.3.0版本)。從 PHP 5開始,可以使用擴展的 MySQLI,這是對 MySQL 新特性的一個擴展支持,其中的一個優點就是支持 PrepareStatement
Perl DBI: 使用 placeholders 或者 quote() 方法
Ruby DBI: 使用 placeholders 或者 quote() 方法
- 自己定義函數進行校驗
如果現有的轉換函數仍然不能滿足要求,則需要自己編寫函數進行輸入校驗。輸入驗證是一個很復雜的問題。輸入驗證的途徑可以分為以下幾種:
整理數據使之變得有效
拒絕已知的非法輸入
只接受已知的合法輸入
因此,如果想要獲得最好的安全狀態,目前最好的解決辦法就是,對用戶提交或者可能改變的數據進行簡單分類,分別應用正則表達式來對用戶提供的輸入數據進行嚴格的檢測和驗證。
?
轉載于:https://www.cnblogs.com/microcat/p/6672987.html
總結
以上是生活随笔為你收集整理的MySQL--SQL中的安全问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 招商银行财新传媒联名卡额度有多少?教你快
- 下一篇: SQL 字符串分割表函数