filter_var 或 mysqli_real_escape_string [重复]

Posted

技术标签:

【中文标题】filter_var 或 mysqli_real_escape_string [重复]【英文标题】:filter_var or mysqli_real_escape_string [duplicate] 【发布时间】:2015-11-07 17:15:40 【问题描述】:

我想知道filter_varmysqli_real_escape_string哪个更强。

更具体。

选项1:

//Course Title
$ctitle = trim($_POST['courseTitle']);
$clean_ctitle = filter_var($ctitle, FILTER_SANITIZE_STRING);

选项2:

//Course Title
$ctitle = trim($_POST['courseTitle']);
$clean_ctitle = mysqli_real_escape_string($con, $ctitle);

我也知道准备好的语句,但我想预先过滤传入的数据。如果有其他选择,请告诉我。

【问题讨论】:

“更强”是什么意思?哪个更擅长转义字符,哪个更有效? 我认为preferred statementprepared statement 的拼写错误? 【参考方案1】:

filter_varmysqli_real_escape_string 是两个不同的东西。 您还没有真正说出您使用字符串的目的,但过滤器函数是可以的,但其中一些是比过滤器更多的验证器。

FILTER_SANITIZE_STRING 过滤器选项删除标签并从字符串中删除或编码特殊字符。对mysql来说卫生不好。

所以这取决于你要消毒的目的。

如果您希望在 MySQL 查询中使用字符串之前对其进行清理,那么您确实应该使用mysqli_real_escape_string。但正如您所说,准备好的语句 (PDO) 更好。

【讨论】:

谢谢。我正在使用从联系表中收集的数据向我们发送电子邮件,这里的数据库中没有存储任何内容。出于好奇,为什么 FILTER_SANITIZE_STRING 不利于 mysql 卫生 因为它会破坏数据。您根据目标清理数据。所以你不会为你的 mysql 目标清理 html。您只需保存 HTML。如有必要,在需要时将其转义。【参考方案2】:

它们没有达到相同的目标,您将使用 filter_var($ctitle, FILTER_SANITIZE_STRING) 去除不需要的特殊字符,而 mysqli_real_escape_string 是一种传输编码,用于应用所需的转换,以便您存储的内容与您提供的内容完全相同,避免 SQL 错误或注入。

通常您将首先使用filter_var()(或您使用的框架中的任何内置功能)来强制执行来自外部输入(表单数据、URL 参数...)的格式和允许的字符规则。然后,在保存您验证的数据时,您将使用mysqli_real_escape_string() 将数据注入您的 MySQL 字符串。

总结一下,

filter_var() 是关于过滤和验证输入数据的。 mysqli_real_escape_string() 是关于在 MySQL 字符串中使用数据之前转义数据。

你不应该在它们之间做出选择,你应该同时使用它们;-)

【讨论】:

@TimDev 可能是喜欢准备好的陈述的人 他/她解开了它们。不阅读实际问题的吹毛求疵者*翻白眼。

以上是关于filter_var 或 mysqli_real_escape_string [重复]的主要内容,如果未能解决你的问题,请参考以下文章

PHP 使用PHP的filter_var来验证电子邮件或号码

为啥 PHP filter_var 说这是一个有效的电子邮件地址?

php filter_var()

PHP filter_var() 函数

Laravel实现用户名或密码登录

filter_var() 验证邮箱ipurl的格式 php