2016-07-16 61 views
0

我有一個包含許多有昏迷分離即其中的sprintf()子句

$emails = 「[email protected], [email protected], [email protected]」; 

我有波紋管的PHP代碼,做工精細

<?php 
function cust_get_oldest_items_all($limit = 1) { 
    $mSearch = new Search(); 
    $result = $mSearch->dao->query(sprintf('SELECT pk_i_id FROM %st_item ORDER BY dt_pub_date LIMIT 0, %d', DB_TABLE_PREFIX, $limit)); 

    return $result->result(); 
} 
?> 

我要電子郵件地址的字符串在上面的php代碼中使用WHERE子句只包含那些s_contact_email在$ emails中的項目?

+0

使用'sprintf'編寫查詢具有**非常**的風險,不應該完成。這裏的「dao」是什麼?你可以用它來爲你做[轉義](http://bobby-tables.com/php)嗎? – tadman

回答

1

操縱你的郵件是這樣的:

$emails = "[email protected], [email protected], [email protected]"; 
$emailsArr = explode(",",$emails);//make an array of emails  

//Todo: escape each array item (each email) to prevent SQL injection 

//surround each email with single quotes 
$emailsArr = array_map(function($e){return "'".trim($e)."'";},$emailsArr); 

//join. new string looks like >> ('[email protected]','[email protected]','[email protected]') 
$emails = '('. implode(",",$emailsArr) .')'; 

,改變你的SELECT查詢:

SELECT pk_i_id FROM %st_item 
WHERE s_contact_email IN $emails 
ORDER BY dt_pub_date LIMIT 0, %d 

安全提示

此修復程序將工作,但還不夠。您必須正確地轉義每個電子郵件地址或使用預準備語句來阻止攻擊者試圖接管您的數據庫(SQL注入攻擊)

+0

感謝您的非常有用的回覆,我如何使用準備好的語句?你能爲我編碼嗎? – Syed

+0

如果我的回覆幫助您解決了問題,請選擇我的回答作爲正確答案。至於準備好的聲明,我很抱歉,我不知道如何提供幫助,因爲它似乎是使用第三方工具來進行數據庫查詢。這是一個非常大的話題,但如果你搜索準備好的語句和你正在使用的工具,你一定會找到幫助。祝你好運。 – BeetleJuice

+0

你的回覆幫了我很多,我已經接受並投票了你的答案,如果可能的話請投我的問題。 – Syed