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_var
或mysqli_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 statement
是prepared statement
的拼写错误?
【参考方案1】:
filter_var
和 mysqli_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来验证电子邮件或号码