java連線資料庫操作2--防止sql注入
- sql注入
- 概念
- 所謂sql注入,即使用者輸入的字串和我們的sql結合產生預判之外的結果,比如下面這段判斷使用者名稱密碼是否正確的程式碼
- String sql = "SELECT * FROM user WHERE " + "username='" + username + "' and password='" + password + "'";
- rs = stmt.executeQuery(sql);
- 如果使用者輸入為:"a' or 'a'='a", "a' or 'a'='a"
- 最後執行的sql語句為:SELECT * FROM tab_user WHERE username='a' or 'a'='a' and password='a' or 'a'='a'
- 可以發現這句sql的where條件是永真,其執行結果是返回tab_user表中所有行
- 所謂sql注入,即使用者輸入的字串和我們的sql結合產生預判之外的結果,比如下面這段判斷使用者名稱密碼是否正確的程式碼
- 防範有三種方法
- 過濾使用者輸入的資料中是否包含非法字元;
- 分步校驗!先使用使用者名稱來查詢使用者,如果查詢到了,再比較密碼;
- 使用PreparedStatement
- PreparedStatement叫預編譯宣告!
- PreparedStatement是Statement的子介面,你可以使用PreparedStatement來替換Statement。
- PreparedStatement的好處:
- 防止SQL攻擊;
- 提高程式碼的可讀性,以可維護性;
- 提高效率。
- 如何使用
- 使用方法
- 1.使用Connection的prepareStatement(String sql):即建立它時就讓它與一條SQL模板繫結;
- 2.呼叫PreparedStatement的setXXX()系列方法為問號設定值
- 3.呼叫executeUpdate()或executeQuery()方法,但要注意,呼叫沒有引數的方法;
- String sql = “select * from tab_student where s_number=?”;
- PreparedStatement pstmt = con.prepareStatement(sql);
- pstmt.setString(1, “S_1001”);
- ResultSet rs = pstmt.executeQuery();
- rs.close();
- pstmt.clearParameters();
- pstmt.setString(1, “S_1002”);
- rs = pstmt.executeQuery();
- 在使用Connection建立PreparedStatement物件時需要給出一個SQL模板,所謂SQL模板就是有“?”的SQL語句,其中“?”就是引數。
- 在得到PreparedStatement物件後,呼叫它的setXXX()方法為“?”賦值,這樣就可以得到把模板變成一條完整的SQL語句,然後再呼叫PreparedStatement物件的executeQuery()方法獲取ResultSet物件。
- 注意PreparedStatement物件獨有的executeQuery()方法是沒有引數的,而Statement的executeQuery()是需要引數(SQL語句)的。因為在建立PreparedStatement物件時已經讓它與一條SQL模板繫結在一起了,所以在呼叫它的executeQuery()和executeUpdate()方法時就不再需要引數了。
- PreparedStatement最大的好處就是在於重複使用同一模板,給予其不同的引數來重複的使用它。這才是真正提高效率的原因。
- 所以,建議大家在今後的開發中,無論什麼情況,都去需要PreparedStatement,而不是使用Statement。
- 概念
- 使用PreparedStatement之後的程式
//查詢兩個結果 Class.forName("com.mysql.jdbc.Driver"); Connection con = DriverManager.getConnection( "jdbc:mysql://localhost:3306/ecshop?useUnicode=true&characterEncoding=UTF8", "root", "123456"); String sql = "Select * from ecs_article where article_id=? and title=?" ; PreparedStatement pstmt = con.prepareStatement(sql); pstmt.setInt(1, 1); pstmt.setString(2, "免責條款"); ResultSet rs = pstmt.executeQuery(); while(rs.next()) { int id = rs.getInt(1); String title = rs.getString(3); System.out.println(id + ", " + title); } rs.close(); pstmt.clearParameters(); pstmt.setInt(1, 2); pstmt.setString(2, "隱私保護"); rs = pstmt.executeQuery(); while(rs.next()) { int id = rs.getInt(1); String title = rs.getString(3); System.out.println(id + ", " + title); } //釋放資源,順序和建立的順序相反 rs.close(); pstmt.close(); con.close();
相關推薦
java連線資料庫操作2--防止sql注入
sql注入 概念 所謂sql注入,即使用者輸入的字串和我們的sql結合產生預判之外的結果,比如下面這段判斷使用者名稱密碼是否正確的程式碼 String sql = "SELECT * FROM use
Android五種資料儲存方式之SQLite資料庫儲存 載入SD卡資料庫 sql操作 事務 防止SQL注入
資料庫 前言 資料庫儲存 資料庫建立 內建儲存資料庫 外接儲存資料庫 編寫DAO 插入操作 更新操作 刪除操作 查詢操作
php操作mysql防止sql注入(合集)
本文將從sql注入風險說起,並且比較addslashes、mysql_escape_string、mysql_real_escape_string、mysqli和pdo的預處理的區別。 當一個變數從表單傳入到php,需要查詢mysql的話,需要進行處理。 舉例: $unsafe_variable
玩轉JDBC打造資料庫操作萬能工具類JDBCUtil,加入了高效的資料庫連線池,利用了引數繫結有效防止SQL注入
SELECT * FROM emp_test 成功查詢到了14行資料 第1行:{DEPT_TEST_ID=10, EMP_ID=1001, SALARY=10000, HIRE_DATE=2010-01-12, BONUS=2000, MANAGER=1005, JOB=Manager, NAME=張無忌}
資料庫連線中使用PreparedStatement預編譯防止SQL注入
//使用預編譯不需要對SQL語句進行拼接,而是使用?佔位符,因此可以防止SQL注入,提升了安全性。 1.提高程式碼可讀性和可維護性 2.提高sql語句執行效能 3.提高安全性 PreparedS
java連線並操作mongodb資料庫(增、刪、查、改)
文末附有原始碼下載地址 package com.mongo.controller; import com.mongodb.*; import java.net.UnknownHostException; import java.util.Date; import java.util.Se
PHP實現防止SQL注入的2種方法
PHP簡單實現防止SQL注入的方法,結合例項形式分析了PHP防止SQL注入的常用操作技巧與注意事項,PHP原始碼備有詳盡註釋便於理解,需要的朋友可以參考下! 方法一:execute代入引數 $var_Value) { //獲取POST陣列最大值 $num = $nu
java防止SQL注入的兩種方法
1.採用預編譯語句集,它內建了處理SQL注入的能力,只要使用它的setString方法傳值即可: String sql= "select * from users where username=? and password=?; PreparedStatement
Java連線和操作資料庫
JDBC 1、JDBC是開發資料庫引用的java API,通過JDBC,使用Java設計的程式能夠執行SQL語言、獲取結果、在使用者介面中顯示資料,並且能將所做的改動傳回資料庫,同時JDBC API可用於分散式異型機環境中國多種資料來源之間的互動; 2、一般使用Jav
Java連線資料庫 #05# SQL與程式碼分離 Java連線資料庫 #04#
索引 讀取html中的SQL語句 缺陷總結 在Java連線資料庫 #04#裡是大概是這樣放sql語句的: package org.sample.shop.db.queryrunner; import org.sample.shop.db.que
關於Java連線資料庫的一些操作
使用JDBC連線資料庫 import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import ja
java連線資料庫和執行靜態和動態的sql語句
►JDBC (Java DatabaseConnectivity) 是用於執行SQL 語句的Java 應用程式介面,由一組用Java 語言編寫的類和介面組成。 ►JDBC 是一種規範,各資料庫廠商為J
java處理SQL特殊字元轉義 防止sql注入
SQL特殊字元轉義 應 該說,您即使沒有處理 HTML 或 JavaScript 的特殊字元,也不會帶來災難性的後果,但是如果不在動態構造 SQL 語句時對變數中特殊字元進行處理,將可能導致程式漏洞、資料盜取、資料破壞等嚴重的安全問題。網路中有大量講解 SQL 注入的文
java 防止SQL注入 字串過濾
防止SQL注入,字串過濾關鍵字元 public class SQLFilterTest { public static void main(String[] args) {
2.MySQL8.0版本jdbc驅動連線資料庫操作
1.JDBC操作資料庫的步驟: 1.註冊驅動 告知JVM使用的是哪一個資料庫的驅動; 2.獲得連結 使用JDBC中的類,完成對MySql資料庫的連結; 3.獲得語句執行平臺 通過連結物件獲取對SQL語句的執行者物件;
JDBC(3)JAVA連線資料庫之 抽象DAO操作
抽象DAO操作 關於所有的表操作都會對應一些操作,我們都會把這些抽取到對應的DAO中。那麼存在大量的重複操作,是否可以抽出通用的部分,供大家繼承使用。 把DAO的操作先寫成介面,把通用的操作提煉出來。 實現操作 根據主鍵查詢 查詢所有 增加、刪除、修改、記
java中預處理PrepareStatement為什麼能起到防止SQL注入的作用??!!
大家都知道,java中JDBC中,有個預處理功能,這個功能一大優勢就是能提高執行速度尤其是多次操作資料庫的情況,再一個優勢就是預防SQL注入,嚴格的說,應該是預防絕大多數的SQL注入。
java連線資料庫後進行更新插入操作
接上一次的查詢操作,這次將更新與插入的程式碼補充 首先是服務端的接收端,接收到客戶端的請求則傳送相應操作 if ("1".equals(message)) { //從mysql資料庫倉庫中查詢資料 jc.mysqlSelect("selec
JAVA經典面試題(一)-- 判斷以及防止SQL注入
SQL注入是目前黑客最常用的攻擊手段,它的原理是利用資料庫對特殊識別符號的解析強行從頁面向後臺傳入。改變SQL語句結構,達到擴充套件許可權、建立高等級使用者、強行修改使用者資料等等操作。 那怎麼判斷是否被SQL注入了呢? 通過SQL注入的原理我們知道,判斷S
nodejs中查詢mysql防止SQL注入
Performing queries The most basic way to perform a query is to call the .query() method on an object (like a Connection, Pool, or PoolNamespace inst