zoukankan      html  css  js  c++  java
  • PHP安全编程:过滤用户输入

    如果你能正确可靠地识别和过滤输入,你的工作就基本完成了。最后一步是使用一个命名约定或其它可以帮助你正确和可靠地区分已过滤和被污染数据的方 法。我推荐一个比较简单的命名约定,因为它可以同时用在面向过程和面向对象的编程中。我用的命名约定是把所有经过滤的数据放入一个叫$clean的数据 中。你需要用两个重要的步骤来防止被污染数据的注入:

    • 经常初始化$clean为一个空数组。
    • 加入检查及阻止来自外部数据源的变量命名为clean.

    实际上,只有初始化是至关紧要的,但是养成这样一个习惯也是很好的:把所有命名为clean的变量认为是你的已过滤数据数组。这一步骤合理地保证了$clean中只包括你有意保存进去的数据,你所要负责的只是不在$clean存在被污染数据。

    为了巩固这些概念,考虑下面的表单,它允许用户选择三种颜色中的一种:

    1 <form action="process.php" method="POST">
    2   Please select a color:
    3   <select name="color">
    4     <option value="red">red</option>
    5     <option value="green">green</option>
    6     <option value="blue">blue</option>
    7   </select>
    8   <input type="submit" />
    9 </form>

    在处理这个表单的编程逻辑中,非常容易犯的错误是认为只能提交三个选择中的一个。为了正确地过滤数据,你需要用一个switch语句来进行:

    01 <?php
    02   
    03   $clean = array();
    04   switch($_POST['color'])
    05   {
    06     case 'red':
    07     case 'green':
    08     case 'blue':
    09       $clean['color'] = $_POST['color'];
    10       break;
    11   }
    12   
    13 ?>

    本例中首先初始化了$clean为空数组以防止包含被污染的数据。一旦证明$_POST['color']是red, green, 或blue中的一个时,就会保存到$clean['color']变量中。因此,可以确信$clean['color']变量是合法的,从而在代码的其它 部分使用它。当然,你还可以在switch结构中加入一个default分支以处理非法数据的情况。一种可能是再次显示表单并提示错误。特别小心不要试图 为了友好而输出被污染的数据。

    上面的方法对于过滤有一组已知的合法值的数据很有效,但是对于过滤有一组已知合法字符组成的数据时就没有什么帮助。例如,你可能需要一个用户名只能由字母及数字组成:

    01 <?php
    02  
    03 $clean = array();
    04  
    05 if (ctype_alnum($_POST['username']))
    06 {
    07     $clean['username'] = $_POST['username'];
    08 }
    09  
    10 ?>

    尽管在这种情况下可以用正则表达式,但使用PHP内置函数是更完美的。这些函数包含错误的可能性要比你自已写的代码出错的可能性要低得多,而且在过滤逻辑中的一个错误几乎就意味着一个安全漏洞。

    学习转自:http://www.nowamagic.net/librarys/veda/detail/1989

  • 相关阅读:
    深度分析:SpringBoot异常捕获与封装处理,看完你学会了吗?
    去年去阿里面试,面试官居然问我Java类和对象,我是这样回答的!
    面试官:小伙子,你给我详细说一下线程的状态有哪些吧?
    新鲜出炉!JAVA线程池精华篇深度讲解,看完你还怕面试被问到吗?
    面试官:小伙子,你给我讲一下java类加载机制和内存模型吧
    深度分析:面试90%被问到的多线程、创建线程、线程状态、线程安全,一次性帮你全搞定!
    close与shutdown
    select模型(二 改进服务端)
    select模型(一 改进客户端)
    5种IO模型
  • 原文地址:https://www.cnblogs.com/jami918/p/3200973.html
Copyright © 2011-2022 走看看