如何过滤功能参数

时间:2011-07-18 17:36:34

标签: php mysql function

过滤函数中传递的参数的正确方法是什么?目标是使功能安全,尤其是在使用数据库时。

示例:

function user_profile($user_id)
{
   //get user's profile data
   $query = "SELECT * FROM `users` WHERE `user_id` = $user_id";
}

$user_id是一个URI细分。

欢迎其他一般例子。

6 个答案:

答案 0 :(得分:1)

要转义字符串,请使用在函数外部使用的相同方法:

$user_id= mysql_real_escape_string($user_id);

如果你期望这个值是一个整数,并且想要从函数中返回错误,如果不是,你可以这样做:

if (!is_int($user_id)) {
  return FALSE;
}
else // do you query

或者如果您希望它与某些特定模式匹配,请使用preg_match()

// For example, $user_id should be 4 letters and 4 numbers
if (!preg_match("/^[A-Z]{4}[0-9]{4}$/", $user_id)) {
   return FALSE;
}
else // do you query

答案 1 :(得分:1)

有两种方法。旧方法是使用mysql_real_escape_string()然而,现在很多人对此抱怨不已,并说正确的方法是使用准备好的陈述。

答案 2 :(得分:1)

创建一个过滤器类来处理所有过滤。在将变量作为参数传递给函数之前,首先将其传递给过滤器类。或者通过函数第一行中的过滤器类运行参数。

基本上,你正在创建一个'过滤'的抽象层。

因此,您希望在您的方案中进行的过滤类型是过滤sql注入/代码注入。

因此,围绕mysql_real_escape_string()函数创建一个包含此过滤器类的包装器。

我们的想法是创建一个可扩展的过滤器类,可以在应用程序的任何其他位置使用,它在概念上足以满足未来的所有需求。

final class Filter
{
    static public function sqlInjections($some_parameter)
    {
        // my code to prevent injections by filtering $some_parameter
        return mysql_real_escape_string($some_paramters);
    }

    static public function badWords()
    {
        // code in the future that can be added to filter bad words
    }
}

称之为$filtered_parameter = Filter::sqlInjections($some_paramter);

答案 3 :(得分:1)

如果数据库中的user_id字段是字符串,那么您将使用mysql_real_escape_string()mysqli_real_escape_string()PDO::quote() - 取决于您正在使用的API

$query = "SELECT * FROM `users` WHERE `user_id` = '" 
              . mysql_real_escape_string($user_id) . "'";

$query = "SELECT * FROM `users` WHERE `user_id` = '" 
              . mysqli_real_escape_string($user_id) . "'";

或者,使用PDO - 提供$dbPDO对象:

$query = "SELECT * FROM `users` WHERE `user_id` = '" 
              . $db->quote($user_id) . "'";


但是,如果它是一个整数,你应该确保传递给它的值确实是一个整数 - 通常使用intval()来完成:

$query = "SELECT * FROM `users` WHERE `user_id` = " 
              . intval($user_id);

编辑:我刚刚意识到你说它是一个网段 - 所以,不是一个整数。我不删除这个想法:它可能会帮助其他人阅读这个答案。


另一种解决方案是不构建包含该值的查询 - 并使用预处理语句

见:

答案 4 :(得分:0)

使用mysql_real_escape_string()

$query = "SELECT * FROM users WHERE user_id = '" . mysql_real_escape_string($user_id) . "'";

答案 5 :(得分:0)

您可以采用两种或三种互补方式来阻止SQL注入:

  • 以上评论的转义函数。

  • 相反地查询:

    function user_profile($ user_id) {    //获取用户的个人资料数据    $ query =“SELECT * FROM users WHERE {$ user_id} = user_id”; }

  • 如果您的数据库引擎允许,用户准备并执行函数/方法 http://php.net/manual/en/pdo.prepare.php http://www.php.net/manual/en/pdostatement.execute.php