PHP 字符过滤和日期类

今天看了三块内容,字符的过滤,密码的 hash,还有就是 PHP 内的日期类。本来今天还打算把数据库这块看掉,但这块实在太重要了,以后面试的时候也肯定会问到,所以明天重点看一下数据库。(😂主要今天下午还去了图书馆,就没有完整的一块时间了)。

字符的过滤

字符过滤有三个基本要求:

  1. 过滤 (Sanitize)
  2. 验证 (Validate)
  3. 跳脱 (Escape) (是这样翻译吗??)

过滤

首先是过滤,这个还蛮重要的,要不然一不小心别人就把sql执行语句或者 html 插入进来了。
php 自带有一个 html 过滤函数和 sql 语句过滤函数。

1
2
3
4
5
<?php
$input = '<p>123234</p>';
// echo $input;
echo htmlentities($input, ENT_QUOTES, 'UTF-8');
?>

使用 htmlentities 这个 php 内置函数之后输出就没有了<p>这些 html 代码了。

过滤 sql 语句的话,使用 PDO 的前置检查就行(PDO 的话还是很安全的,mysql_query()这种不要用了,php7都废弃了,而且很不安全)

验证

主要是验证拿到的数据是否符合自己的要求,这个前端限制一个,后端也限制一下比较好。
比方说限制邮箱格式

1
2
3
4
<?php
$email = 'john@example.com';
$emailSafe = filter_var($email, FILTER_SANITIZE_EMAIL);
?>

filter_var 函数,在配上 php 内置的FILTER_SANITIZE_EMAIL常量可以做到邮箱的验证。搭配其他的常量,比方说搭配FILTER_SANITIZE_STRING就可以实现其他类型的验证。

还有一些就是要自己去数据库里查找对应数据来进行验证。

跳脱


这篇看的不是很懂,大意应该是,最终展现在前端的时候还要再过滤一下语句。

密码

储存密码的几个原则:

  1. 从不要知道用户的密码
  2. 从不要限制用户的密码
  3. 从不要明文发送密码给用户
  4. 使用hash而不是加密

因为 php 有内置密码函数,所以非常方便,哈希用 password_hash(), 验证用 password_verify(),就可以了,已经非常安全了,php 会自己加盐的。以前我也知道php 会自动加盐,但我一直好奇他加的盐储存在哪里,后来我知道了,在hash过后的那串字符中就有储存盐值,所以直接用 password_verify() 他就会自己去校验,都封装好了。

日期

日期这个比较麻烦(主要是格式转来转去,还有计算一些差值),但有时候一定要用它,所以还是有必要看下的。
date_default_timezone_set('Asia/Shanghai');
这句可以设置时区,国内一般设置为上海,东八区。

DateTime

1
2
3
4
5
6
7
<?php
date_default_timezone_set('Asia/Shanghai');
$datetime = new DateTime();

$datetime2 = new DateTime('2014-04-27 5:03 AM');
var_dump($datetime2);
?>

然后就是一些普通的用法,不过下面我还是要展示一下 DateInterval 这个类,以前还真没用过,这个主要是设定时间区间的。

DateInterval

1
2
3
4
5
6
<?php
$interval = new DateInterval('P2W');

$datetime->add($interval);
echo $datetime->format('Y-m-d H:i:s');
?>

比方说我设置了区间两周(P2W就是两周的意思),然后将它加到 datetime 上,这样datetime的日期就会增加两周。

DatePeriod

这个 DatePeriod 类我也是第一次见,这个搭配上上面两个,可以指定初始时间,然后间隔,再加上一个次数,可以很好的实现一些循环任务。

1
2
3
4
5
6
7
<?php
$period = new DatePeriod($datetime, $interval, 3);

foreach ($period as $nextDateTime) {
echo $nextDateTime->format('Y-m-d'), PHP_EOL;
}
?>

最后

明天要好好看下数据库了。