gpt4 book ai didi

php - FILTER_SANITIZE_EMAIL 是否足够或是否还需要 mysql_real_escape_string 来避免 PHP/MySQL 中的安全问题?

转载 作者:行者123 更新时间:2023-11-29 01:55:26 31 4
gpt4 key购买 nike

我正在检查像这样的数据库的输入:

$email = $_POST['newsletter_email'];
$email = filter_var($email, FILTER_SANITIZE_EMAIL);

然后:

$is_user = $db->count_rows('users', "WHERE email='" . $email . "'");

问题是,它够好吗?还是我也应该使用 mysql_real_escape_string

最佳答案

这个问题有两个部分。

  1. 如何验证电子邮件地址。
  2. How to prevent SQL Injection .

输入验证

$email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);
if ($email !== false) {
// Well, you've got yourself a valid email address!
}

防止SQL注入(inject)

不要使用 mysql_real_escape_string()prevent SQL Injection的正确方法是使用参数化查询。也称为准备好的语句。

推荐阅读:

您的代码应如下所示:

$stmt = $db->prepare('SELECT count(userid) FROM users WHERE email = ?');
if ($stmt->exec([ $email ])) {
$is_user = $stmt->fetchColumn(0);
}

如果这对您来说太麻烦了,您可以加载 EasyDB库并使您的查询看起来像这样:

$is_user = $db->cell('SELECT count(userid) FROM users WHERE email = ?', $email);

请停止使用输入转义并采用准备好的语句。他们在单独的数据包中发送查询和参数,这意味着即使使用 Unicode hack 也无法更改查询结构。

重要

您必须正确使用准备好的语句(即永远不要将用户输入与传递给 prepare() 的查询字符串连接起来)以实现此保证级别的安全性。

此外,在 PHP 中,某些驱动程序将默认模拟 准备好的语句。来自PHP manual :

PDO::ATTR_EMULATE_PREPARES Enables or disables emulation of prepared statements. Some drivers do not support native prepared statements or have limited support for them. Use this setting to force PDO to either always emulate prepared statements (if TRUE), or to try to use native prepared statements (if FALSE). It will always fall back to emulating the prepared statement if the driver cannot successfully prepare the current query. Requires bool.

模拟的准备好的语句不提供与真正的准备好的语句相同的安全保证(即 data/instruction separation )。为了安全起见,请禁用模拟准备。

$db = new PDO(/* etc */);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

关于php - FILTER_SANITIZE_EMAIL 是否足够或是否还需要 mysql_real_escape_string 来避免 PHP/MySQL 中的安全问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30443747/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com