filter_var是一个很好的方法吗?

时间:2009-03-18 17:05:51

标签: php security

filter_var对过滤数据有什么好处吗?它会过滤哪种不良数据?我确实使用mysql_real_escape_string,但我想知道添加filter_var是否有帮助?

5 个答案:

答案 0 :(得分:23)

要防止SQL注入,请尽可能使用预准备语句。如果不是,请将mysql_real_escape_string用于字符串,将(int)cast或intval()用于整数,(float)或floatval()用于浮点数,并使用addcslashes($ input,'%_')用于LIKE语句中使用的字符串。当尝试转义要在RLIKE语句中使用的字符串时,事情变得更加复杂。

对于过滤HTML内容,最好的是strip_tags(不传递$ allowable_tags),但是......你可能不喜欢/想要它,在这种情况下最合理的解决方案是:

$escaped = htmlspecialchars($input, ENT_QUOTES, $your_charset);

更可靠的解决方案是使用像HTML Purifier

这样的库

过滤功能没问题,但其中一些比过滤器更有效。根据您的需要,您可能会发现其中一些有用。

答案 1 :(得分:18)

您可以filter_var使用它来调整mysql_real_escape_string。听起来你正在寻找FILTER_* constants数据(实际调整数据以使其安全*)而不是sanitisation(检查数据是安全的)。

不同的过滤器可以帮助完成不同的任务。虽然FILTER_SANITIZE_SPECIAL_CHARS可以清理数据以防止SQL注入,但输出可能包含HTML的数据并不好。这里有几个我用于日常任务的过滤器:

  • FILTER_SANITIZE_STRING - 用于显示(不删除)HTML代码,防止XSS攻击并将符号转换为HTML实体。
  • 带有STRIP_LOW/HIGH标记的
  • strip_tags - 实际上删除了HTML(请参阅FILTER_SANITIZE_URL)。
  • FILTER_SANITIZE_EMAIL - 确保网址安全*。
  • {{1}} - 使电子邮件地址安全,但我更愿意在存储地址之前使用它的验证表。
  

*我松散地使用安全,我认为你永远不会太确定。

答案 2 :(得分:2)

这完全取决于您的有效网址或有效电子邮件的含义。

例如a@b-.c - 您可以过滤顶级域名以排除.c,但顶级域名列表不是常量。此外,所有角色都是有效的。即使这看起来很奇怪并且几乎肯定无效,但许多正则表达式过滤器也会验证它。

如果在链接中显示或使用电子邮件a@b-.c或网址http://.,即使它们无处可用,也不会造成任何损害。

我认为问题的一部分是您希望过滤器有多宽松的问题。如果主要关注的是 XSS SQL注入或以其他方式阻止危险输入,那么该值是否可用可能无关紧要,因此这种过滤器可能会起作用。

如果你想确保价值不仅安全而且可用,那就是一个棘手的野兽。

答案 3 :(得分:1)

这真的取决于你想要做什么,如果不知道细节我就无法回答。这里列出了可能的过滤器及其效果:Types of filters

答案 4 :(得分:-5)

基于一些小测试,我得出的结论是filter_var的常量不值得信赖。

例如:

filter_var('a@b-.c', FILTER_VALIDATE_EMAIL); // valid
filter_var('http://.', FILTER_VALIDATE_URL); // valid
filter_var('a@b-.c', FILTER_SANITIZE_EMAIL); // a@b-.c
filter_var('http://.', FILTER_SANITIZE_URL); // http://.

这些显然是无效的值,但传递filter_var的常量。不要相信filter_var