【问题标题】:Input filtering in PHP?PHP中的输入过滤?
【发布时间】:2011-01-21 04:32:22
【问题描述】:

link 是否足以例如输入过滤表单数据?以帖子为例?

<?php
$var=300;

$int_options = array(
"options"=>array
  (
  "min_range"=>0,
  "max_range"=>256
  )
);

if(!filter_var($var, FILTER_VALIDATE_INT, $int_options))
  {
  echo("Integer is not valid");
  }
else
  {
  echo("Integer is valid");
  }
?> 

最常见的过滤方式是什么?就像对字符串和数字进行消毒一样。我使用 preg_match 验证服务器端的电子邮件字段和 javascript 中的正则表达式检查。我不是验证纳粹,但希望对最常见的事情进行某种过滤。

我认为我可以在我的应用程序中通过类中的一些公共静态函数来抽象出这些东西,例如,像这样

  Validate::String($str);
     Validate::Interger($int);

你怎么看?

【问题讨论】:

    标签: php security filtering


    【解决方案1】:

    filter_var() 是一个好的开始。如果您计划在任何类型的 SQL 语句中使用这些输入,您也应该考虑对其进行适当的清理。

    PDO 与准备好的语句、mysql_real_escape_string 或任何其他数据库包装器(MBD2 等...)应该为您提供此功能。

    我想这里的关键思想是过滤和清理数据之间存在差异,并且每种操作都有不同的级别。这是一个非常多部分的过程。

    对于过滤,您可以进行类型检查(这是一个 int 吗?),然后验证输入是否符合您的条件(这个 int 是否介于 1 和 128 之间?)

    您还需要清理数据。 htmlspecialchars 用于输出,一些适当的引用和转义以在 SQL 中使用。

    【讨论】:

    • 但是如果你使用更像动态的sql,怎么办?
    • 还是不应该做动态sql?
    • @marko:如果您从用户输入(动态)构建查询,您需要正确转义并引用输入,这样您就不会受到 SQL 注入的攻击。您可以使用任何可用的包装器轻松构建查询。除非您在谈论使用可变列名,否则普遍的共识是这是一个坏主意。见:stackoverflow.com/questions/2323161/…
    【解决方案2】:

    日期过滤很常见。为此,我只使用 strtotime() 并查看它是否出现在合理的日期(即不是 1969 年)。然后用户可以输入任何内容,包括“+12 天”。

    密码很常见,但有特殊情况。您可能不想允许空格,必须是最小长度,包含字母和数字等。

    社会保险号、电话和邮政编码等数据元素可以很简单,必须有一定的长度并且只包含数字(美国)。或者使它们健壮,确保它们是有效的格式并且在“使用”范围内。例如,电话号码不能以 0 开头。

    理想情况下,一个验证会使用另一个验证。例如,邮政编码先调用“only_digits”验证函数,然后更详细地检查是否有效。

    【讨论】:

    • 您的 zip 示例在美国以外失败 - 例如,英国的系统要复杂得多,有些地区甚至没有邮政编码。即使在美国,/\d{5}-\d{4}/ 也是有效的邮政编码,因此 only_digits 不可靠。
    【解决方案3】:

    没有通用规范说明如何过滤用户输入。 但是使用内置函数是一个很好的起点。

    【讨论】:

      猜你喜欢
      • 2011-08-30
      • 2010-11-05
      • 2011-05-18
      • 1970-01-01
      • 2011-02-15
      • 2012-03-18
      • 2011-06-27
      • 1970-01-01
      相关资源
      最近更新 更多