【问题标题】:Is filter_var a good way to go?filter_var 是个好方法吗?
【发布时间】:2023-04-06 11:57:01
【问题描述】:

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

【问题讨论】:

  • 不知道为什么这被否决了
  • 您应该更好地尝试了解 XSS 和 SQL 注入是什么以及为什么它们可能,而不是要求一个神奇的功能来阻止它们。
  • 会有什么帮助?您希望 filter_var 完成的工作是什么?
  • 投了反对票,因为问题真的很模糊。对于每种需求,操作数据都是不同的。由于您提到 mysql_real_escape_string 大多数人会假设您想要 filter_var 代替 mysql_real_escape_string 但同时您提到您也将使用它... filter_var 用于基本输入清理/验证。 php.net/manual/en/intro.filter.php。正如您将从手册中看到的那样,没有什么特定于数据库的,只有数据类型。

标签: php security


【解决方案1】:

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

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

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

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

过滤器函数是可以的,但其中一些比过滤器更多的验证器。根据您的需要,您可能会发现其中一些很有用。

【讨论】:

  • htmlspecialchars() 是将文本输出到 HTML 的正确做法。如果您想在文本中使用合法的“
【解决方案2】:

您可以通过将filter_varFILTER_* constants 一起使用来调整它。听起来您正在寻找sanitisation 的数据(实际上是调整数据以使其安全*)而不是validation(检查数据是否安全)。

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

  • FILTER_SANITIZE_SPECIAL_CHARS - 用于显示(而不是删除)HTML 代码、防止 XSS 攻击以及将符号转换为 HTML 实体。
  • FILTER_SANITIZE_STRING 带有 STRIP_LOW/HIGH 标志 - 实际上会删除 HTML(请参阅 strip_tags)。
  • FILTER_SANITIZE_URL - 确保 URL 安全*。
  • FILTER_SANITIZE_EMAIL - 确保电子邮件地址安全,但我更喜欢在存储地址之前使用它的验证表亲。

* 我用 safe 松散,我认为你永远不能太确定。

【讨论】:

    【解决方案3】:

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

    例如a@b-.c - 好吧,您可以过滤顶级域以排除.c,但顶级域的列表不是恒定的。而且所有字符都是有效的。尽管这看起来很奇怪并且几乎可以肯定是无效的,但许多正则表达式过滤器也会对其进行验证。

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

    我认为部分问题在于您希望过滤器有多松散。如果最关心的是 XSSSQL 注入 或以其他方式防止危险输入,则该值是否可用可能无关紧要,因此这种过滤器可能会起作用。

    如果您想确保该值不仅安全而且可用,那就更棘手了。

    【讨论】:

      【解决方案4】:

      这真的取决于您要做什么,如果不知道具体情况,我无法真正回答。此处列出了可能的过滤器及其效果:Types of filters

      【讨论】:

      • 主要用于过滤和验证来自用户输入的任何 xss 或 mysql 漏洞利用。
      • XSS 和 SQL 注入的方式太多(ha.ckers.org/xss.html)。这完全取决于您的应用程序如何处理用户数据。
      【解决方案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

      【讨论】:

      • 消毒不等于验证。
      • @Mathew,你是对的,但我不确定这与我指出的filter_var 的问题有什么关系。它既不会正确过滤也不会正确清理我提供的输入。
      • 据我在tools.ietf.org/html/rfc822 中看到的,电子邮件地址的格式是正确的。特别是,c 可能注册为新 TLD,b- 可能是其中的域(- 是有效字符)。我认为那里没有问题。 !def!xyz%abc+tag@[127.0.0.1] 不是有效地址吗? (我不会让你想知道 - 它是。)我没有很快找到任何域名示例,但我可以告诉你 dig . 给出了合理的响应,并且 stackoverflow.com. 返回与 @ 相同的 ip 987654333@(是的,第一个网址上的尾随点)。我同意 filter_var 和 PHP 在这。
      猜你喜欢
      • 2011-02-09
      • 1970-01-01
      • 2011-05-16
      • 2012-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-19
      • 2013-11-05
      相关资源
      最近更新 更多