小編給大家分享一下MySQL語句的注入錯誤指的是什么,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!
目前成都創(chuàng)新互聯(lián)公司已為數(shù)千家的企業(yè)提供了網(wǎng)站建設、域名、網(wǎng)站空間、網(wǎng)站托管、服務器租用、企業(yè)網(wǎng)站設計、太子河網(wǎng)站維護等服務,公司將堅持客戶導向、應用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
mysql語句的注入式錯誤就是利用某些數(shù)據(jù)庫的外部接口將用戶數(shù)據(jù)插入到實際的SQL語言當中,從而達到入侵數(shù)據(jù)庫乃至操作系統(tǒng)的目的。攻擊者利用它來讀取、修改或者刪除數(shù)據(jù)庫內(nèi)的數(shù)據(jù),獲得數(shù)據(jù)庫中用戶資料和密碼等信息,更嚴重會獲得管理員的權限。
SQL Injection 就是利用某些數(shù)據(jù)庫的外部接口將用戶數(shù)據(jù)插入到實際的數(shù)據(jù)庫操作語言(SQL)當中,從而達到入侵數(shù)據(jù)庫乃至操作系統(tǒng)的目的。它的產(chǎn)生主要是由于程序?qū)τ脩糨斎氲臄?shù)據(jù)沒有進行嚴格的過濾,導致非法數(shù)據(jù)庫查詢語句的執(zhí)行。
《深入淺出 MySQL》
危害
攻擊者利用它來讀取、修改或者刪除數(shù)據(jù)庫內(nèi)的數(shù)據(jù),獲得數(shù)據(jù)庫中用戶資料和密碼等信息,更嚴重的就是獲得管理員的權限。
例子
//注入式錯誤 public static void test3(String name,String passward){ Connection connection = null; Statement st = null; ResultSet rs = null; try { // 加載JDBC 驅(qū)動 Class.forName("com.mysql.jdbc.Driver"); // 獲得JDBC 連接 String url = "jdbc:mysql://localhost:3306/tulun"; connection = DriverManager.getConnection(url,"root","123456"); //創(chuàng)建一個查詢語句 st = connection.createStatement(); //sql語句 String sql = "select * from student where name = '"+ name+"' and passward = '"+passward+"'"; rs = st.executeQuery(sql); if(rs.next()){ System.out.println("登錄成功。"); }else{ System.out.println("登錄失敗。"); } } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { test3("wjm3' or '1 = 1","151515"); }
數(shù)據(jù)庫信息
如上面的代碼所示,用戶名為wjm3’ or '1 = 1,密碼為151515,從數(shù)據(jù)庫中可以看出我們沒有這樣的用戶,本來應該顯示登錄失敗,但是結果卻是登陸成功,因為or '1 = 1 已經(jīng)不是用戶名里面的內(nèi)容了,它現(xiàn)在為SQL 語句里面的內(nèi)容,不論如何,結果都為true,等于不用輸密碼都可以登錄。這里就產(chǎn)生了安全問題。
1. PrepareStatement
//注入式錯誤 public static void test3(String name,String passward){ Connection connection = null; PreparedStatement st = null; ResultSet rs = null; try { // 加載JDBC 驅(qū)動 Class.forName("com.mysql.jdbc.Driver"); // 獲得JDBC 連接 String url = "jdbc:mysql://localhost:3306/tulun"; connection = DriverManager.getConnection(url,"root","123456"); //創(chuàng)建一個查詢語句 String sql1 = "select * from student where name = ? and passward = ?"; st = connection.prepareStatement(sql1); st.setString(1,name); st.setString(2,passward); //sql語句 //String sql = "select * from student where name = '"+ name+"' and passward = '"+passward+"'"; rs = st.executeQuery(); if(rs.next()){ System.out.println("登錄成功。"); }else{ System.out.println("登錄失敗。"); } } catch (Exception e) { e.printStackTrace(); }finally{ try { connection.close(); st.close(); rs.close(); } catch (SQLException e) { e.printStackTrace(); } } } public static void main(String[] args) { test3("wjm3' or '1 = 1","151515"); }
上面這個代碼不管name 參數(shù)是什么,它都只是name 參數(shù),不會作為sql語句的一部分來執(zhí)行,一般來說推薦這個方法,比較安全。
2.自己定義函數(shù)進行校驗
所以如果想要獲得最好的安全狀態(tài),目前最好的解決辦法就是對用戶提交或者可能改變的數(shù)據(jù)進行簡單分類,分別應用正則表達式來對用戶提供的輸入數(shù)據(jù)進行嚴格的檢測和驗證。
其實只需要過濾非法的符號組合就可以阻止已知形式的攻擊,并且如果發(fā)現(xiàn)更新的攻擊符號組合,也可以將這些符號組合增添進來,繼續(xù)防范新的攻擊。特別是空格符號和其產(chǎn)生相同作用的分隔關鍵字的符號,例如“/**/”,如果能成功過濾這種符號,那么有很多注入攻擊將不能發(fā)生,并且同時也要過濾它們的十六進制表示“%XX”。
看完了這篇文章,相信你對mysql語句的注入錯誤指的是什么有了一定的了解,想了解更多相關知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
文章題目:mysql語句的注入錯誤指的是什么
分享網(wǎng)址:http://vcdvsql.cn/article4/pphsie.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、網(wǎng)站策劃、關鍵詞優(yōu)化、云服務器、軟件開發(fā)、
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)