2017-01-15 86 views
0

如何防止SQL注入,而從數據庫中獲取數據時從用戶輸入收到的使用參數:如何防止SQL注入的參數使用CakePHP

if(isset($_GET['cityval']) && $_GET['cityval'] !=''){ 

    $city = $this->request->query('cityval'); 

     $searching .= " and college_city in ($city) "; 
    } else { 
     $searching .= ""; 
    } 
    if(isset($_GET['scholarship']) && $_GET['scholarship'] !=''){ 
     $searching .= " and college_scholarship = '".$_GET['scholarship']."' "; 
    } else { 
     $searching .= ""; 
    } 

我的主查詢低於

$search = $this->Search->query("select * from colleges where college_id!='' and status='active' $searching order by $order desc limit $start, 10 "); 

回答

0

Cake ORM似乎使用PDO:

在封面下方,查詢生成器使用PDO預處理語句 可防止SQL注入攻擊。

參考:https://book.cakephp.org/3.0/en/orm/query-builder.html

不幸的是因爲你不使用ORM蛋糕既不PDO準備語句要創建的查詢方式是脆弱的。

如果要使用原始查詢,你可以做這樣的事情來保護你的代碼:

// Add this in the beginning of the file/code: 
use Cake\Datasource\ConnectionManager; 

// Replace connection_name with the name of your connection (maybe it's "default") 
$connection = ConnectionManager::get('connection_name'); 

$bindList = []; 

$city = $this->request->query('cityval'); 

// PDO as a limitation for the parameter markers. See in the comments below 
$cityList = array_filter(explode(',', $city), function($item) { 
    return preg_match('/^\d+$/', $item); 
}); 

$csvCity = implode(',', $cityList); 


$scholarship = $this->request->query('scholarship'); 

if (!empty($csvCity)) { 
    $searching .= " and college_city in ($csvCity)"; 
} 

if (!empty($scholarship)) { 
    $searching .= " and college_scholarship = :scholarship"; 
    $bindList['scholarship'] = $scholarship; 
} 

$stmt = $connection->prepare($searching); 
$stmt->bind($bindList); 
$stmt->execute(); 

// Read all rows. 
$rows = $stmt->fetchAll('assoc'); 

// Read rows through iteration. 
foreach ($rows as $row) { 
    // Do work 
} 

PDO有一個限制,因爲這有使用SQL IN()子句中沒有編寫有道語句(將值綁定到它),所以我們需要像在代碼中那樣手動解析該子句中的值。

PDO Prepare手冊頁:

注:參數標記可以代表一個完整的數據只包含文字。 任何部分的文字,也不是關鍵字,也不是標識符,也不是任何可以使用參數綁定的任意查詢部分。例如,您 無法將多個值綁定到SQL語句的IN()子句 中的單個參數。

參考

+0

嗨,這將返回一個數組,並且如果(!empty($ city)){PDO作爲參數標記的限制,如何將數組放入查詢 – user3198563

+0

中。 $ cityList = array_filter(explode(',',$ city),function($ item){ return preg_match('/^\ d + $ /',$ item); }); $ searching。=「and college_city in($ cityList)」; } – user3198563

+0

我剛更新了代碼。對不起。我忘了添加implode(),因爲我沒有運行/測試代碼 – wcomnisky

2

不要使用原始查詢。只需使用CakePHP提供的查詢生成器,它將阻止注入。請參閱在線CakePHP書籍以獲取更多信息。

在CakePHP中需要使用原始查詢是非常罕見的。

4

開始實際使用框架或根本不使用它。你沒有使用請求對象,你沒有使用ORM,你正在和框架一起工作。從您的代碼中可以清楚地看出,您沒有花時間閱讀手冊。

wcomniskys答案有一噸不是必需的代碼,也不是這個答案使用框架的目標方式。

如果你關心創建一些寫得很好的代碼,那麼你真的應該開始做官方文檔​​的博客教程。如果不停止閱讀,並且做wcomniskys建議。它可能有效,但它不是好的代碼,也不是使用框架的正確方式,也不是最簡單的解決方案。如果你沒有興趣正確地做事,你現在可以停止閱讀。


你試圖做的顯然是通過獲取參數進行搜索。有一個美好的插件,使得它很容易https://github.com/FriendsOfCake/search

這可能是實際上是用插件很簡單:

$query = $this->Colleges->find('search', [ 
    'search' => $this->request->query 
]); 
$this->set('results', $this->Paginator->paginate($query)); 

PARAMS本身搜索將在模型層處理,檢查該插件文件。框架將負責消毒輸入。

上述要求,你實際上瞭解框架非常基本的和你知道你做了什麼。如果你對任何原因沒有興趣不使用框架提供的內容,那麼而不是會更好,因爲你只會堆積不可維護的代碼並導致開銷。