查询中的引号

时间:2010-01-26 07:13:47

标签: php sql mysql

我有一个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]));
}

这种方法会出现任何安全问题吗?

修改 假设代码在一个类中,必须添加$ this->

修改 关于foreach的错字

4 个答案:

答案 0 :(得分:0)

因为您使用的是mysql_real_escape_string函数,所以就字符串而言它是非常安全的。有关详细信息,请参阅dealing with sql injection

答案 1 :(得分:0)

您应该在字符串中添加引号,但字符串中的引号本身也应该转义 - 这可以使用mysql_real_escape_stringmysqli_real_escape_stringPDO::quote来完成,具体取决于用于连接数据库的函数/方法。

执行此操作(正如您已经做的那样 - 这很好)应该阻止SQL注入(至少对于字符串:您还应该检查数字确实对应于数字数据,例如)


另一种解决方案,一旦获得它可能会更容易一些,就是使用Prepared语句。
见:

答案 2 :(得分: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) . "'");
}

可能需要调整空值处理。 (以上是从我使用的通用接口中删除的,它也使用DESCRIBE读取表的结构,以获取有关何时引用/使用空值等的提示)

℃。

答案 3 :(得分:0)

如果您使用PDO's prepared statements,则无需担心自己逃脱。没有引号,没有反斜杠,没有任何内容。