filter_var
对过滤数据有什么好处吗?它会过滤哪种不良数据?我确实使用mysql_real_escape_string
,但我想知道添加filter_var
是否有帮助?
答案 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
- 确保网址安全*。*我松散地使用安全,我认为你永远不会太确定。
答案 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
。