能防止sql注入的 效率更高的 PreparedStatement

1)sql注入問題: 在拼接sql時,有一些sql的特殊關鍵字參與字符串的拼接,會造成安全性問題:
	用戶名: 隨便輸入
	密碼: a' or 'a' = 'a

	生成的sql語句:
		select * from user where username = 'abc' and password = 'a' or 'a' = 'a'

2)解決sql注入: PreparedStatement對象
	(1)繼承於Statement

	(2)表示預編譯的SQL語句的對象:
		1:參數使用?作爲佔位符;
		2:獲取PreparedStatement時,需要將預編譯的sql傳入進來;

	(3)SQL語句已經預編譯存儲在PreparedStatement對象中,然後可以使用該對象多次有效的執行此語句;

使用

  */
    public boolean login2(String username ,String password){
        if(username == null || password == null){
            return false;
        }
        //連接數據庫判斷是否登錄成功
        Connection conn = null;
        PreparedStatement pstmt =  null;
        ResultSet rs = null;
        //1.獲取連接
        try {
            conn =  JDBCUtils.getConnection();
            //2.定義sql
            String sql = "select * from user where username = ? and password = ?";
            //3.獲取執行sql的對象
            pstmt = conn.prepareStatement(sql);
            //給?賦值
            pstmt.setString(1,username);
            pstmt.setString(2,password);
            //4.執行查詢,不需要傳遞sql
            rs = pstmt.executeQuery();
            //5.判斷
           /* if(rs.next()){//如果有下一行,則返回true
                return true;
            }else{
                return false;
            }*/
            return rs.next();//如果有下一行,則返回true

        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JDBCUtils.close(rs,pstmt,conn);
        }


        return false;
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章