【发布时间】:2015-05-25 18:01:54
【问题描述】:
我正在根据这样的数据库检查输入:
$email = $_POST['newsletter_email'];
$email = filter_var($email, FILTER_SANITIZE_EMAIL);
然后:
$is_user = $db->count_rows('users', "WHERE email='" . $email . "'");
问题是,它是否足够好?还是我也应该使用mysql_real_escape_string?
【问题讨论】:
-
FILTER_SANITIZE_EMAIL、php.net/manual/en/filter.filters.sanitize.php 留下单引号,所以它是不够的。Remove all characters except letters, digits and !#$%&'*+-/=?^_`{|}~@.[]你应该使用带有 PDO 或 mysqli_ 的参数化查询。 -
在安全方面为什么要以“足够好”为目标?
-
real_escape_string() != security(),它用于转义用于描述值的字符(引号)。因此,它用于进行有效查询,not 出于安全目的。混淆之处在于,没有正确处理数据,当您将其添加到查询的字符串中时,您将引入一个可被利用来运行任意查询/代码的问题。使用准备好的语句(PDO/MYSQLI)没有这个问题,因为参数是单独交给 MySQL 的,它知道如何处理插入它们以进行有效的查询。
标签: php mysql security sql-injection