成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Oracle數據庫的安全,PL/SQL的SQL注入

數據庫 Oracle
我們今天主要討論的是Oracle數據庫的安全:PL/SQL的SQL注入這一技術的實際應用,如果你對其的實際應用,感到“暈”的話。以下的文章會給你提供相關的資料。

以下的文章主要是淺談Oracle數據庫的安全:PL/SQL的SQL注入,我在一個信譽度很好的網站找到一個關于Oracle數據庫的安全:PL/SQL的SQL注入的資料,拿出來供大家分享。望大家會有所收獲。

SQL注入,一個老掉牙的安全問題,有SQL的地方就會有SQL注入。一般做企業應用的只關注Java層面的編寫規范,比如使用preparedStatement,或者干脆直接過濾掉危險字符等等。

其實在編寫PL/SQL的function或procedure的時候,也存在注入的問題,我們來簡單探討一下。

例如有這樣一個procedure,功能為禁用某個table的constraint:

Sql代碼

 

  1. CREATE OR REPLACE PROCEDURE Disable_Constraint 
    ( p_constraint_name VARCHAR2, p_table VARCHAR2 )  
  2. AUTHID CURRENT_USER  
  3. AS  
  4. p_schema VARCHAR2(32) :USER;  
  5. sql_stmt VARCHAR2(2000) :'ALTER TABLE ' 
  6. || p_schema  
  7. || '.'  
  8. || p_table  
  9. || ' DISABLE CONSTRAINT '  
  10. || p_constraint_name ;  
  11. BEGIN  
  12. EXECUTE IMMEDIATE sql_stmt;  
  13. END;  
  14. /   

 

了解SQL注入的同學應該可以看出來,上面的procedure存在幾個危險的變量:

1. p_table

2. p_constraint_name

3. p_schema

前兩者容易發現,但為什還有p_schema呢?因為當前的USER名字也有可能是用戶構造的危險字符串。好了,根據一般規律,我們應該遵循以下順序進行修改:

1. 靜態SQL。能不使用變量就不使用。

2. 綁定變量。與Java中的PreparedStatement類似,不把數據直接拼接在sql里,而是存入變量中,直接被Oracle數據庫使用。

3. 檢查變量的值。

顯然,前兩個方法對這個procedure不適用。我們只能使用最不爽的第3個方法。 好在對于PL/SQL來說,我們不用自己編寫復雜的字符判斷。Oracle有個SYS.DBMS_ASSERT包,提供了一些預置的function,如下:

 

  1. NOOP No Operation. Returns string unchanged  
  2. SIMPLE_SQL_NAME Verify that the input string is 
    a simple SQL name.  
  3. QUALIFIED_SQL_NAME Verify that the input string 
    is a qualified SQL name.  
  4. SCHEMA_NAME This function verifies that the input 
    string is an existing schema name.  
  5. SQL_OBJECT_NAME This function verifies that the input 
    parameter string is a qualified SQL identifier of an 
    existing SQL object.  
  6. ENQUOTE_NAME This function encloses a name in double 
    quotes.  
  7. ENQUOTE_LITERAL Add leading and trailing single 
    quotes to a string literal.  
     

 

在執行這些function時,如果傳入的變量不滿足規定的格式或條件,則會拋異常,從而保護我們自己的procedure不被SQL注入。

我們判斷這些方法是否可用:

1. SIMPLE_SQL_NAME, QUALIFIED_SQL_NAME

這些方法要求用戶出入的參數本身是一個有效的sql名字。比如,如果有個table名為"Table One",那么就要求傳入的值中包含雙引號。使用這些方法存在一個問題,直接從data-dictionary讀取出來的table名字是不帶雙引號的。如果用戶直接從data-dictionary中讀取table名字,然后直接傳入我們的procedure,則會因為它不滿足simple sql name的要求而拋異常,但實際上這個table名字應該是正確的。所以不能直接使用這些function。

2. SCHEMA_NAME, SQL_OBJECT_NAME

這些方法要求傳入的參數值是數據庫中已經存在的對象名字。如果Oracle數據庫中本來有個table名為 "Table One",那么如果用戶傳入Table One,則被視為正確。使用這些方法,避免了第一個方法的data-dictionary問題,而且也能夠避免遭受類似table' -- 的問題。但存在所謂二次攻擊的問題。如果用戶提前創建了一個包含危險字符的table,然后再調用我們的procedure,依舊會造成SQL注入。

3. ENQUOTE_NAME, ENQUOTE_LITERAL

這些方法直接把參數的值用雙引號或單引號括起來。如果括起來之后的值本身還存在危險的話,會拋異常。對于我們舉例的procedure來說,只需要使用ENQUOTE_NAME。ENQUOTE_NAME需要兩個參數,一個是需要enquote的變量,另一個為是否轉換為大寫。現在,對于我們的procedure,應該使用ENQUOTE_NAME(p_table, FALSE),保證Table One不被轉換為"TABLE ONE"。

這是我們的最終解決方案。但需要注意的是,由于使用了ENQUOTE_NAME,對于我們的procedure來說,table和constraint的名字對大小寫敏感。如果名為table_1,則必須傳入TABLE_1,否則會執行錯誤。

修改后的代碼如下:

Sql代碼

 

  1. CREATE OR REPLACE PROCEDURE Disable_Constraint 
    ( p_constraint_name VARCHAR2, p_table VARCHAR2 )  
  2. AUTHID CURRENT_USER  
  3. AS  
  4. p_schema VARCHAR2(32) :SYS.DBMS_ASSERT.
    ENQUOTE_NAME(USER, FALSE);  
  5. sql_stmt VARCHAR2(2000);  
  6. safe_table VARCHAR2(32);  
  7. safe_constraint VARCHAR2(32);  
  8. BEGIN  
  9. safe_table :SYS.DBMS_ASSERT.
    ENQUOTE_NAME(p_table, FALSE);  
  10. safe_constraint :SYS.DBMS_ASSERT.
    ENQUOTE_NAME(p_constraint_name, FALSE);  
  11. sql_stmt :'ALTER TABLE ' 
  12. || p_schema  
  13. || '.'  
  14. || safe_table  
  15. || ' DISABLE CONSTRAINT '  
  16. || safe_constraint ;  
  17. EXECUTE IMMEDIATE sql_stmt;  
  18. END;  
  19. /  

 

上述的相關內容就是對Oracle數據庫的安全:PL/SQL的SQL注入的描述,希望會給你帶來一些幫助在此方面。

【編輯推薦】

  1. Oracle創建Split 與Map 函數的代碼示例
  2. Oracle索引整理的詳細描述
  3. Oracle 權限入門如何管理
  4. Oracle數據庫緩沖區命中率的概述
  5. Oracle數據庫調試和優化詳解
責任編輯:佚名 來源: 互聯網
相關推薦

2010-04-13 14:35:17

2010-05-05 11:17:55

Oracle數據庫

2011-04-14 13:01:53

Oracle數據庫

2011-08-29 13:24:50

Oracle數據庫PLSQL設置快捷鍵

2010-04-09 10:32:03

Oracle 數據庫

2010-10-26 11:04:48

oracle數據導入

2014-01-17 12:35:48

2024-10-12 15:29:56

2010-07-13 11:47:47

2011-07-29 13:40:34

Oracle數據庫PLSQL異常處理

2011-07-05 16:27:14

過程函數PL

2010-10-26 15:54:02

連接oracle數據庫

2010-05-10 18:54:12

Oracle數據庫索引

2011-08-18 16:42:04

Oracle數據庫維護SQL代碼示例

2011-02-28 10:57:56

2010-04-26 18:32:48

Oracle數據庫

2009-07-24 10:29:29

PL SQL編程規范

2011-05-25 15:10:59

SQL Server安全數據庫

2013-07-25 20:36:02

2009-03-26 10:46:58

OraclePL、SQL存儲過程
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲一区视频在线 | 亚洲视频第一页 | 夜夜草天天草 | 亚洲欧美在线视频 | 国产精品国产三级国产aⅴ中文 | 亚洲一区二区三区免费观看 | 久久99深爱久久99精品 | 九九色综合 | 亚洲精品在线91 | 国产成人免费视频网站高清观看视频 | 国产精品国产精品国产专区不卡 | 99综合| 日韩高清国产一区在线 | 九九热这里 | 亚洲国产精品一区 | chinese中国真实乱对白 | 精品久久久久久久久久 | 日韩精品一区二区三区在线播放 | 极品销魂美女一区二区 | 婷婷丁香在线视频 | 亚洲欧美日韩成人在线 | 亚洲在线日韩 | 视频三区 | 看片网站在线 | 亚洲国产精品一区在线观看 | 精品一级 | 国产精品久久久久久久久久久新郎 | 成人在线免费观看 | 国产视频精品在线观看 | 视频在线一区二区 | 盗摄精品av一区二区三区 | 国产美女视频黄 | 特黄视频 | 国产一二区免费视频 | 国产欧美一区二区三区在线看 | 亚洲精品小视频在线观看 | 91精品国产91久久久久福利 | 1级黄色大片 | 在线免费观看a级片 | 日韩图区 | 久久久久久国模大尺度人体 |