2010-01-26 61 views
0

我有一個MySQL查詢其要求參數在「」或「」被封閉,引號查詢

如果我有傳遞給該功能的數組:

function orderbyfield($column, array $selection) 
{ 
// will it be alright (secure) to do this? 
foreach ($selection as $s) 
{ 
    $s = '"' . $s . '"'; 
} 
$string = implode(',', $selection) 
return array($column, $string); 
} 

並將其傳遞給

function generate_sql() 
{ 
$fields = $this->orderbyfield(); // assuming the code is in a class 
$sql = 'SELECT FIELDS FROM TABLE ORDER BY FIELD (' . $fields[0] . ',' . mysql_real_escape_string($fields[1])); 
} 

這種方法會有什麼安全問題嗎?

編輯 假設碼屬於一類,做了必要的另外的$這個 - >

編輯 錯字上的foreach

+0

看起來您已經忘記了orderbyfield調用中的參數。 – chiborg 2010-01-26 09:39:04

回答

0

正如其他人所說,你應該使用mysql_real_escape_string 在您創建查詢字符串的位置。此外,儘管數據庫可能能夠類型之間投,不是所有的變量都需要在查詢中被引用:

function enclose($val, $dbh) 
{ 
    if (($val==='') || (is_null($val))) { 
     return 'NULL'; 
    } 
    // is it a number? 
    if (preg_match('/^[\+-]*\d+\.?\d*$/', $val)) { 
     return($val); 
    } 
    // its a string 
    return("'" . mysql_real_escape_string($val, $dbh) . "'"); 
} 

空處理可能需要進行調整。如果您使用PDO's prepared statements

C.

0

您應該添加引號角落找尋你的字符串,但您的字符串本身也應該被轉義裏邊有報價 - 這可通過mysql_real_escape_string完成,mysqli_real_escape_string,或PDO::quote,取決於樣的功能,你正在使用連接/方法到你的數據庫。

這樣做(因爲你已經做的 - 這是好的)應防止SQL注入(至少爲字符串:你還應該檢查NUMERICS確實與數值的數據,例如)


另一個解決方案,一旦得到它可能會更容易一些,那就是使用Prepared語句。
見:

0

(以上是從通用接口我用它也讀出表的使用說明爲得到時報價/使用空等提示結構砍下) ,你不必擔心逃脫自己。沒有引號,沒有反斜槓,沒有任何東西。