过滤、验证和转义数据

过滤数据

  • 不要相信任何外部数据!
  • 常见的有以下几种数据需要过滤:HTML,SQL查询,用户提交的信息(邮件地址、电话号码、身份证)

HTML

  • htmlentities()
  • HTML Purifier library (https://github.com/ezyang/htmlpurifier)

SQL queries

  • PDO

User profile

  • filter_var(), filter_input()

验证数据

  • filter_var() FILTER_VALIDATE_*
  • aura/filter
  • respect/validation
  • symfony/validator
  • 然后看一下 Laravel、Zend 和 CI 框架所使用的验证组件,学习一下它们的源码。

  • 过滤是为了安全,验证是为了数据正确性。

转义输出

  • htmlentities() ENT_QUOTES UTF-8
  • twig/twig 或 smarty/smarty 等模板引擎默认输出转义

密码

  • bcrypt
  • Password Hashing API: password_hash(), password_verify(), password_needs_rehash()

时间和日期

不建议自己手动处理时间和日期,因为里面有太多要考虑的东西:时间格式,时区,夏令时,闰年,闰秒,以及不同天数的月份。

而是,应当使用 DateTime, DateInterval, DateTimeZone 类来处理时间

设置默认时区

  1. php.ini 中设置 date.timezone = 'PRC'
  2. date_default_timezone_set('PRC')

    DateTime类

  3. new DateTime('2014-04-27 5:03 AM'), 传入一个PHP能够理解的时间字符串
  4. DateTime::createFromFormat('Y-m-d H:i:s', '2019-04-02 18:08:00'),从指定的时间格式创建时间

    DateInterval

  5. DateInterval 表示一段长度的时间,在 DateTime 类的 add() 或 sub() 方法中,可以传入一个人 DateInterval 实例,来修改时间
  6. new DateInterval('P2W2DT5H'),实例化需要传入一个字符串,这个字符串第一个字符是"P",第二个字符表示数量,第三个字符表示单位,合法的单位有:Y(年),M(月),D(天),W(周),H(小时),M(分钟),S(秒)。日期和时间之间使用“T”分隔。比如 “P2W2DT5H” 表示 2周2天5小时

    DateTimeZone

  7. 表示时区,new DateTimeZone('PRC')
  8. 用途:作为 new DateTime() 的第二个参数。如果不指定,则使用默认的时区设置(上面提到)
  9. setTimezone() 可以用来修改 DateTime() 的时区
  10. 在数据库和代码中使用UTC来处理时间很方便,只有当显示给用户看时,再转换为对应的时区。

    DatePeriod

  11. 用于遍历时间(以给定的间隔),用途:日历中重复的事件
  12. new DatePeriod($datetime, $dateinterval, $number)
  13. DatePeriod 是一个迭代器,每次迭代输出一个 DateTime 对象

  • 推荐使用:nesbot/carbon 库来处理时间

数据库

使用PDO来连接数据库,针对不同的底层数据库,提供了统一的访问方式。但缺点在于不同的数据库有自己的方言,这是PDO所不能支持的。建议是写标准的SQL。

数据库连接和DSN

  • new PDO($dsn, $username, $password),会抛出 PDOException
  • DSN 示例:"mysql:host=127.0.0.1;dbname=books;port=3306;charset=utf8",其中 mysql 是驱动名表示 MySQL 数据库驱动
  • 安全:(1)不要直接在代码中写用户和密码,应当在web目录之外增加一个配置文件,通过配置获取(2)不要把用户和密码加到版本控制系统中

预处理语句

  • 通常我们使用请求参数来构造SQL语句,这样很危险,幸而 PDO 使用预处理语句和参数绑定帮我们处理了参数的过滤。
  • 预处理语句就是 PDOStatement 实例,但是我们很少直接实例化它,而是通过 PDO 实例的 prepare() 方法来获取。这个方法第一个参数为一个SQL字符串
  • 命名占位符:$sql = "SELECT id FROM users WHERE email = :email";
  • 绑定参数:$statement->bindValue(':email', $email),预处理语句会自动过滤 email 参数,从而防止 SQL 注入。

查询结果

  • 调用 PDOStatement::execute() 执行语句查询。
  • 调用 PDOStetement::fetch(),fetchAll(),fetchColumn(),fetchObject()来获取结果集
  • fetch() 方法返回结果集中的下一行,可以用它来遍历比较大的结果集。
  • fetch() 和 fetchAll() 接受一个常量来设置获取结果集的形式,有以下:PDO::FETCH_ASSOC, PDO::FETCH_NUM, PDO::FETCH_BOTH, PDO::FETCH_OBJ
  • fetchColumn() 获取一行,可以指定一个参数来获取某列

事务

  • 添加事务很简单,在执行查询之前,调用 PDO::beginTransaction(),在执行查询结束后 调用 PDO::commit() 即可。

多字节字符串

  • 多字节字符是指ASCII范围之外的字符,PHP默认提供的字符串函数只支持8位的ASCII字符,如果用来处理Unicode字符就会产生错误,为此,可以使用 mbstring 扩展。大部分的PHP字符串处理函数都提供了对应的 mb_* 版本。

    字符编码

  • 使用 UTF-8,所有现代浏览器都支持
  • mbstring 还可以转换字符编码:mb_detect_encoding(),mb_convert_encoding()

    输出UTF-8数据

  • 在 php.ini 中:default_charset = "UTF-8",这个设置会被许多PHP函数使用以及作为PHP默认输出编码
  • 推荐HTML代码中增加:<meta charset="UTF-8"/>

  • 流是现代PHP中最神奇的、也是使用得最少的一个的功能。
  • 流是什么?流是数据在起点和终点之间的传输。也就是说起点和终点,可能是一个文件、也可能是一个命令行进程,一个网络连接,或者一个ZIP压缩包,临时内存,标准输入输出,或者其他资源。
  • 流提供了许多PHP IO函数的底层实现,比如:file_get_contents(),fopen(),fgets(),fwrite()

    流包装器

  • 不同种类的流式数据需要各自的协议来读写数据,这些协议就是流包装器。
  • 标识流数据:<scheme>://<target>
  • HTTP流:http://www.baidu.com
  • 文件流:file:///etc/hosts,由于它是PHP默认流包装器,所以我们在使用文件函数时直接输入路径就可以了,因而感受不到底层其实使用了 file:// 来获取数据的
  • php:// 流:命令行脚本会用到,php://stdin, php://stdout, php://memory, php://tmp
  • ZIP或TAR流:直接读取写入压缩文件
  • FTP或FTPS流:ftp://user:pass@ftp.example.com/foo.txt

    流上下文

  • 流可以接受一个上下文参数,来自定义流的行为。
  • stream_context_create() 创建上下文参数,返回的流上下文对象,可以被传入大多数的文件函数和流函数。

    流过滤器

  • 之前使用流来打开、读取、写入数据,但是PHP流的真正用武之处是在数据传输过程中进行过滤、添加、转换或删除操作。比如:打开一个markdown文件流,当读取到内存中时,自动转换为HTML。
  • php提供了几个默认的流过滤器,没什么用,应当使用自己自定义的流过滤器。
  • stream_filter_append($stream, 'filter.name') 添加过滤器到流中

    创建自定义流过滤器

  • 创建一个继承自 php_user_filer 的类,实现 filter(), onCreate(), onClose() 方法,然后使用 stream_filter_register() 注册该过滤器。

错误和异常

PS - 个人博客链接 《modern-php》-阅读笔记-最佳实践

《modern-php》 - 阅读笔记 - 最佳实践的更多相关文章

  1. javaScript高程笔记--最佳实践

    1.可维护性 <1>什么是可维护的代码 (1)可理解性 (2)直观性 (3)可适应性 (4)可扩展性 (5)可调试性 <2>代码约定 (1)可读性---适当的进行注释[函数和方 ...

  2. QCon 2015 阅读笔记 - 移动开发最佳实践

    所有ppt下载地址:http://pan.baidu.com/s/1mg9o4TM 下面是移动开发实践部分的阅读笔记. 移动开发网络性能优化实践 - 陈浩然 (携程) 携程是非常标准的移动App架构, ...

  3. RESTful接口设计原则/最佳实践(学习笔记)

    RESTful接口设计原则/最佳实践(学习笔记) 原文地址:http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api 1 ...

  4. Spring Boot学习笔记2——基本使用之最佳实践[z]

    前言 在上一篇文章Spring Boot 学习笔记1——初体验之3分钟启动你的Web应用已经对Spring Boot的基本体系与基本使用进行了学习,本文主要目的是更加进一步的来说明对于Spring B ...

  5. Docker笔记(十一):Dockerfile详解与最佳实践

    Dockerfile是一个文本文件,包含了一条条指令,每条指令对应构建一层镜像,Docker基于它来构建一个完整镜像.本文介绍Dockerfile的常用指令及相应的最佳实践建议. 1. 理解构建上下文 ...

  6. 《DevOps故障排除:Linux服务器运维最佳实践》读书笔记

    首先,这本书是Linux.CN赠送的,多谢啦~ http://linux.cn/thread-12733-1-1.html http://linux.cn/thread-12754-1-1.html ...

  7. 《深入理解OSGi:Equinox原理、应用与最佳实践》笔记_1_运行最简单的bundlehelloworld

    <深入理解OSGi:Equinox原理.应用与最佳实践>笔记_1_运行最简单的bundlehelloworld 买了周大大的OSGI的书看 先前完全没有基础 就靠这本书看看学学 顺便记一些 ...

  8. 《深入实践Spring Boot》阅读笔记之三:核心技术源代码分析

    刚关注的朋友,可以回顾前两篇文章: 基础应用开发 分布式应用开发 上篇文章总结了<深入实践Spring Boot>的第二部分,本篇文章总结第三部分,也是最后一部分.这部分主要讲解核心技术的 ...

  9. Python 最佳实践指南 2018 学习笔记

    基础信息 版本 Python 2.7 Python 3.x Python2.7 版本在 2020 年后不再提供支持,建议新手使用 3.x 版本进行学习 实现 CPython:Python的标准实现: ...

随机推荐

  1. 几个实用的sublime text 2的快捷键

    Sublime text快捷键 Sublime text 2是一款轻量.简洁.高效.跨平台的编辑器,他适合编写javascript,html,css,php,paython等等, 作为程序员,编码效率 ...

  2. pom.xml 配置maven私服

    1.pom.xml 配置maven私服 <repositories>       <repository>        <id>caf_repositories& ...

  3. python 导入模块的坑。为什么整个项目能运行,单独运行某个文件模块就报错?多层目录不同文件夹怎么导入?

    一些文章介绍了python不同目录怎么导入问题,但py文件运行起点却从来没有文章说过!这是相当重要的!! 这个连接是网上99%的所讲的导入 https://www.cnblogs.com/luoye0 ...

  4. fstream 和 iostream

    fstream 是对文件输入输出iostream是对屏幕上输入输出你想往文件里保存内容,或者从文件里读取内容就用fstream向屏幕输出或者从屏幕上输入,用iostream “>>”运算符 ...

  5. sharepoint权限操作(记录以备忘)

    using Microsoft.SharePoint; using System; using System.Collections.Generic; using System.Linq; using ...

  6. 重新生成RF的测试库API文档

    在dos窗口下执行如下命令: 命令:python -m robot.libdoc 库名称  生成的API文件名.html 例如:python -m robot.libdoc MongoDBLibrar ...

  7. 汉字按首字母排序(javascript,php,mysql实现)

    1.javascript实现 var a = ["啊","得啊_123","得啊_0124","波啊","婆& ...

  8. 【2014年12月6日】HR交流会

    今天的交流会感觉还是不错,体会到了一些东西,把它记下来. 想到什么写什么,可能没什么条理. 1.先选行业,再选职业,再选公司 根据自己的兴趣以及个人特长,能力等方面,需要定一个大概的方向,然后根据方向 ...

  9. python基础---->python的使用(四)

    这里记录一下python关于网络的一些基础知识.不知为何,恰如其分的话总是姗姗来迟,错过最恰当的时机. python中的网络编程 一.socket模板创建一个 TCP 服务器 import socke ...

  10. c++ 友元类 与 友元类派生类

    定义: 当一个类B成为了另外一个类A的“朋友”时,那么类A的私有和保护的数据成员就可以被类B访问.我们就把类B叫做类A的友元. 用法: 在A类中加入: friend class B; 下面这个程序说明 ...