我有一个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的错字
答案 0 :(得分:0)
因为您使用的是mysql_real_escape_string函数,所以就字符串而言它是非常安全的。有关详细信息,请参阅dealing with sql injection。
答案 1 :(得分:0)
您应该在字符串中添加引号,但字符串中的引号本身也应该转义 - 这可以使用mysql_real_escape_string
,mysqli_real_escape_string
或PDO::quote
来完成,具体取决于用于连接数据库的函数/方法。
执行此操作(正如您已经做的那样 - 这很好)应该阻止SQL注入(至少对于字符串:您还应该检查数字确实对应于数字数据,例如)
另一种解决方案,一旦获得它可能会更容易一些,就是使用Prepared语句。
见:
PDO::prepare
mysqli_prepare
mysql_*
功能一起使用) 答案 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,则无需担心自己逃脱。没有引号,没有反斜杠,没有任何内容。