2013-05-06 19 views
1

我目前正在使用3dCart高級API,它使用SOAP請求和SQL來查詢數據庫。PHP Soap - 遠程SQL

我很擔心安全。什麼是使遠程查詢安全的選項?

下面是一些示例代碼:

class Data { 
    private $db; 
    public function __construct(){ 
     $this->db = new soapclient('http://api.3dcart.com/cart_advanced.asmx?WSDL',array('trace'=>1,'soap_version'=>SOAP_1_1)); 
    } 

    public function query($sql = "SELECT TOP 20 * FROM category"){ 
     $param = array(
      'storeUrl'=>"example.com", 
      'userKey'=>"supersecretcode", 
      'sqlStatement'=>$sql 
     ); 
     $result = $this->db->runQuery($param); 
     $match = $result->runQueryResult->any; 
     $sxe = new SimpleXMLElement($match); 
     return $sxe->runQueryRecord; 
    } 
} 

我運行查詢像這樣:

$db = new Data() 
$query = $db->query("SELECT id, category_name FROM category WHERE category_name LIKE '%".$search_term."%' AND isFilter = 0 AND hide = 0"); 
//WORK WITH QUERY DATA HERE 

如何保護呢? 因爲我沒有直接連接到SQL服務器有什麼辦法來防止SQL注入?

回答

1

如果沒有數據庫連接,您無法安全地轉義字符串,因爲轉義取決於數據庫類型以及可能的數據庫設置。他們的API是否接受參數化查詢?

如果不是這樣,對於像ints你可以檢查它們的類型,並確保他們是逸岸ints但對於字符串,所有我能想到的是addslashes這是不是很安全。已棄用的mysql_escape_string,但又不是很安全,是爲MySQL。

你可以做的最好的事情是問他們怎麼做,他們的API可能有一些逃避字符串的方法。

+0

如果我運行一個正則表達式來返回true,那麼只有字符串是字母數字時,如果有或沒有空格,該怎麼辦? – bottens 2013-05-07 13:14:10

+0

像這樣:$ search_term =(preg_match('/^[A-Za-z0-9 _] * $ /',$ search_term))?$ search_term:「默認搜索詞」; – bottens 2013-05-07 13:15:02

+0

是的,只要你不需要別的東西就可以工作。白名單是安全的,但用字符串你需要非常小心你允許的。我[發現這個問題](http://stackoverflow.com/questions/1162491/alternative-to-mysql-real-escape-string-without-connecting-to-db)有一些答案,可能會有所幫助。 – Sam 2013-05-07 14:08:34

1

防止SQL注入是關於清理輸入的。我通常在可能和可行的情況下推薦以下方法。

  1. 創建允許字符的白名單。 遞歸地使用白名單對輸入應用過濾器,刪除所有不允許的字符。只要用戶不需要的特定字符(意思是不要將它們放在白名單中)是<,>,'"如果可能,列舉所有有效用例並禁止其他所有用例。如果你有很多可能的輸入空間,可以使用黑名單,但是要明白你會忘記一些讓你容易受到攻擊的東西。

  2. 任何可能修改SQL語句的字符都應該正確轉義。

  3. 每次訪問數據時,無論是從用戶輸入還是從數據庫訪問數據,都要通過白名單和遞歸轉義過濾器來運行,直到輸出與輸入匹配(表示禁止所有可能的禁用字符實例被刪除。如果您篩選出<scipt>但不遞歸應用它<sc<script>ript>會發生什麼。

  4. 使用參數時,它是可用的。這件事會解決很多你的問題。一個參數化API並不總是可用然而,這樣瞭解其他技術很重要。

有許多API提供此功能,因此在您推出自己的應用程序之前,請嘗試找到一個。注意提供過濾/驗證但不是出於安全目的而設計的API。這些將工作99.99%的時間,直到你被一個1337的目標。