过滤函数中传递的参数的正确方法是什么?目标是使功能安全,尤其是在使用数据库时。
示例:
function user_profile($user_id)
{
//get user's profile data
$query = "SELECT * FROM `users` WHERE `user_id` = $user_id";
}
$user_id
是一个URI细分。
欢迎其他一般例子。
答案 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 - 提供$db
是PDO
对象:
$query = "SELECT * FROM `users` WHERE `user_id` = '"
. $db->quote($user_id) . "'";
但是,如果它是一个整数,你应该确保传递给它的值确实是一个整数 - 通常使用intval()
来完成:
$query = "SELECT * FROM `users` WHERE `user_id` = "
. intval($user_id);
编辑:我刚刚意识到你说它是一个网段 - 所以,不是一个整数。我不删除这个想法:它可能会帮助其他人阅读这个答案。
另一种解决方案是不构建包含该值的查询 - 并使用预处理语句。
见:
mysqli::prepare()
PDO::prepare()
答案 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