【问题标题】:Validating and Sanitizing user input in PHP在 PHP 中验证和清理用户输入
【发布时间】:2011-08-24 20:21:56
【问题描述】:

使用 PHP 提供的 filter_var()sanitize_var() 过滤和清理变量是否被认为是最佳实践,还是有更好的选择?

谢谢。

【问题讨论】:

  • 这一切都取决于,我根据具体情况使用多种不同的方式。
  • 如果可能,最好使用内置版本,而不是自己滚动。
  • 奥利:一般来说。如果需要对输入进行清理,会这样做吗?
  • 你不是一般情况下(db、txt 文件、表单、屏幕输出、xml 等的不同方法),仅仅解释上下文有多难
  • @Francisc 如果我们了解上下文,我们可以提供更具体的答案。老实说,我很高兴您提出这个问题,因为太多的 php 开发人员甚至都没有考虑过这个问题。但现实情况是,我们需要知道您在“为”什么进行消毒。与 SQL 数据库甚至 CLI 相比,您对进入 LDAP 的字符串的处理方式略有不同。但是,我的假设是我们正在讨论准备数据以插入 SQL 数据库,在这种情况下,您可能想看看使用 PDO。

标签: php sanitization input-filtering


【解决方案1】:

我总是会考虑以下口头禅... “永远不要相信用户输入” ctype_alpha, ctype_alnum 在验证方面也表现出色,记住也要验证客户端(javascript 验证),这也将有助于减少服务器负载

【讨论】:

  • 客户端验证不能替代服务器端验证。您至少需要在服务器上进行验证,客户端验证对于可用性和减少服务器上的负载很有好处,如前所述,但它很容易被绕过,所以要小心。
  • 您是在说:“使用 ctype_alpha 而不是 filter_string,因为它是一种更好的做法”还是您说我也可以使用其他选项,这不是我要问的。谢谢。
【解决方案2】:

我想提及 HTML Purifier 进行任何 HTML 过滤/清理。

对于通用验证(数字、日期和其他值),有很多库,也有内置函数,您可以选择最合适的,但我还是想提一下Zend_Validate if你已经在使用 Zend 框架了。

【讨论】:

    【解决方案3】:

    让我们尝试验证来自表单的输入。

    我们需要做的第一件事是确认我们要查找的输入数据是否存在。

    然后我们使用 filter_input() 函数过滤输入数据。

    在下面的例子中,输入变量“email”被发送到PHP页面:

    【讨论】:

    • 您好像忘记在此处复制示例了。
    【解决方案4】:

    我认为最好使用 HTML5 的客户端验证,然后使用服务器端。 PHP 具有过滤字符串的 FILTER_SANITIZE_STRING 等函数(尽管您不需要验证),您可以使用 FILTER_VALIDATE_EMAIL 而不是使用正则表达式手动验证电子邮件。您还可以使用字符数等限制。

    概念上的示例...

    if form is submitted 
      if 'name' is not empty
        create a variable that equals filter_var($_POST['name'], FILTER_SANITIZE_STRING)
        if 'name' is empty then set echo an error message
    
      if 'email is not empty
        create a variable that equals filter_var($_POST['email'], FILTER_SANITIZE_STRING)
        // then you can validate email
        if (!filter_var($email, FILTER_VALIDATE_EMAIL))
          error message
      // do this for other variables
    
      if there's not error
        send email and or a thank you message
    
     //FORM here
    

    【讨论】:

      猜你喜欢
      • 2022-10-21
      • 2018-09-05
      • 2015-01-25
      • 2014-04-08
      • 2016-03-31
      • 2012-10-02
      • 1970-01-01
      • 2015-11-06
      • 1970-01-01
      相关资源
      最近更新 更多