2010-01-26 66 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

(以上是从通用接口我用它也读出表的使用说明为得到时报价/使用空等提示结构砍下) ,你不必担心逃脱自己。没有引号,没有反斜杠,没有任何东西。