SQL Injection 防護設計建議與程式範例 Java, Python, .Net
SQL注入是最危险的Web应用程序的风险之一。 SQL注入是很容易透過现有许多开源自动化攻击工具達成。 SQL注入對於應用程序也可能造成致命性的嚴重影響.
恶意SQL代码注入到Web应用程序時 – 可以造成整个数据库有可能被窃取,刪除或修改。 Web应用程序甚至可以用来对運行數據庫的操作系统的主机操作系统命令. 導致SQL注入最主要的原因在於將SQL查询語句與參數的輸入包含在一个查询字符串。
要避免SQL注入的攻擊, 必須要避免不可信的資料輸入成為SQL語句的一部份. 設計上最好的防護方式就是將查詢參數化‘Query Parameterization’. 查詢參數化主要是將SQL語句與參數分離後送到數據庫處理.
有許多的開發框架(Rails, Django, Node.js, etc.) 使用object-relational model (ORM)方式將數據庫結構定義與數據庫隔離. ORMs使用參數化的方式存取數據庫資料. 因此程式開發者只需要關注使用者資料輸入的有效性.
其他的SQL注入的防禦方式還包含自動靜態分析與數據庫配置.數據庫引擎可配置為只支援參數化的查詢方式.
Java 範例
這裡有一個參數化查詢的Java代碼範例:
String newName = request.getParameter(“newName”);
int id = Integer.parseInt(request.getParameter(“id”));
PreparedStatement pstmt = con.prepareStatement(“UPDATE EMPLOYEES SET NAME = ? WHERE ID = ?”);
pstmt.setString(1, newName);
pstmt.setInt(2, id);
PHP範例
使用PDO的PHP參數化查詢範例:
$stmt = $dbh->prepare(”update users set email=:new_email where id=:user_id”);
$stmt->bindParam(‘:new_email’, $email);
$stmt->bindParam(‘:user_id’, $id);
Python範例
使用Python參數化查詢的範例
email = REQUEST[‘email’]
id = REQUEST[‘id’]
cur.execute(“update users set email=:new_email where id=:user_id”, {“new_email”: email, “user_id”: id})
.NET範例
使用C#.NET參數化查詢的範例
string sql = “SELECT * FROM Customers WHERE CustomerId = @CustomerId”;
SqlCommand command = new SqlCommand(sql);
command.Parameters.Add(new SqlParameter(“@CustomerId”, System.Data.SqlDbType.Int));
command.Parameters[“@CustomerId”].Value = 1;