php验证旧密码,PHP最佳实践之过滤、验证、转义和密码

过滤、验证和转义

1).不要相信任何来自不受自己直接控制的数据源中的数据。包括但不限于:

$_GET

$_POST

$_REQUEST

$_COOKIE

$argv

file_get_contents()

远程数据库

远程API

来自客户端的数据

2).解决办法:过滤输入。删除不安全的字符,在数据到达应用的存储层之前,必须过滤数据。需要过滤的数据包括不限于:HTML、SQL查询和用户资料信息。

HTML:使用htmlentities()函数过滤HTML成对应的实体。这个函数会转义制定字符的HTML字符,以便在存储层安全的渲染。正确的使用方式是使用htmlentities($input, ENT_QUOTES, 'UTF-8')过滤输入。或者使用HTML Purifier。缺点是慢

SQL查询: 有时必须根据数据构建SQL查询。这时要要使用PDO预处理语句过滤外部数据。

用户资料信息:使用filter_var()和filter_input()过滤用户资料信息

3).验证数据:也可以使用filter_var(),验证成功返回要验证的值,失败返回false。但是这个函数无法验证所有数据,所以可以使用一些验证功能组件。例如aura/filter或者symfony/validator

4)转义输出:任然可以使用htmlentities这个函数,一些模板引擎也自带了转义功能。

密码

1).绝对不能知道用户的密码。

2).绝对不要约束用户的密码,要限制的话只限制最小长度。

3).绝对不能使用电子邮件发送用户的密码。你可以发送一个修改密码的链接,上面带一个token验证是用户本人就行了。

4).使用bcrypt计算用户密码的哈希值。加密和哈希不是一回事,加密是双向算法,加密的数据可以被解密。但是哈希是单项算法,哈希之后的数据无法被还原,想同的数据哈希之后得到的数据始终是相同的。使用数据库存储通过bcrypt哈希密码之后的值。

5).使用密码哈希API简化计算密码哈希和验证密码的操作。下面的注册用户的一般操作

POST /register.php HTTP/1.1

Content-Length: 43

Content-type: application/x-www-form-urlencoded

email=xiao@hello.world&password=nihao

下面是接受这个请求的PHP文件

try {

$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);

if (!$email) {

throw new Exception('Invalid email');

}

$password = filter_iput(INPUT_POST, 'password');

if (!$password || mb_strlen($password) < 8) {

throw new Exception('Password must contain 8+ characters');

}

//创建密码的哈希值

$passwordHash = password_hash(

$password,

PASSWORD_DEFAULT,

['cost' => 12]

);

if ($passwordHash === false) {

throw new Exception('Password hash failed');

}

//创建用户账户,这里是虚构的代码

$user = new User();

$user->email = $email;

$user->password_hash = $passwordHash;

$user->save();

header('HTTP/1.1 302 Redirect');

header('Location: /login.php');

} catch (Exception $e) {

header('HTTP1.1 400 Bad Request');

echo $e->getMessage();

}

6).根据机器的具体计算能力修改password_hash()的第三个值。计算哈希值一般需要0.1s-0.5s。

7).密码的哈希值存储在varchar(255)类型的数据库列中。

8).登录用户的一般流程

POST /login.php HTTP1.1

Content-length: 43

Content-Type: application/x-www-form-urlencoded

email=xiao@hello.wordl&pasword=nihao

session_start();

try {

$email = filter_input(INPUT_POST, 'email');

$password = filter_iinput(INPUT_POST, 'password');

$user = User::findByEmail($email);

if (password_verify($password, $user->password_hash) === false) {

throw new Exception(''Invalid password);

}

//如果需要的话,重新计算密码的哈希值

$currentHasAlgorithm = PASSWORD_DEFAULT;

$currentHashOptions = array('cost' => 15);

$passwordNeedsRehash = password_needs_rehash(

$user->password_hash,

$currentHasAlgorithm,

$currentHasOptions

);

if ($passwordNeedsRehash === true) {

$user->password_hash = password_hash(

$password,

$currentHasAlgorithm,

$currentHasOptions

);

$user->save();

}

$_SESSION['user_logged_in'] = 'yes';

$_SESSION['user_email'] = $email;

header('HTTP/1.1 302 Redirect');

header('Location: /user-profile.php');

} catch (Exception) {

header('HTTP/1.1 401 Unauthorized');

echo $e->getMessage();

}

9).PHP5.5.0版本之前的密码哈希API无法使用,推荐使用ircmaxell/password-compat组件。

专题系列

PHP专题系列目录地址:https://github.com/xx19941215/webBlog

PHP专题系列预计写二十篇左右,主要总结我们日常PHP开发中容易忽略的基础知识和现代PHP开发中关于规范、部署、优化的一些实战性建议,同时还有对Javascript语言特点的深入研究。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/560084.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java pc端软件抓包,如何通过抓包工具fiddler获取java程序的http请求

抓包工具fidder是一个很轻巧的可以获取浏览器&#xff0c;程序的http&#xff0c;https请求的软件。百科地址&#xff1a;http://baike.baidu.com/view/868685.htm官网地址&#xff1a;http://fiddler2.com而java程序需要设置proxy才能生效&#xff1a;Proxy proxy new Proxy(…

linux php c 扩展,linux下编写php5.6的C扩展模块(双向链表)

cd /usr/local/src/php-5.6.7/ext/./ext_skel --extnamephp_listcd php_listvim config.m4PHP_ARG_ENABLE(php_list, whether to enable php_list support,dnl Make sure that the comment is aligned:[ --enable-php_list Enable php_list support])(dnl是注释标签…

java根据uml图写出实现代码,根据java代码生成UML图

根据java代码生成UML图根据java代码生成UML图这里介绍一个简单易用的eclipse插件ModelGoon&#xff0c;用来对已有代码生成UML图&#xff0c;下面以之前文章中的spring mvc工程为例如何安装和使用这个插件&#xff1b;这个spring mvc工程的代码在githbu上&#xff0c;地址是&am…

php递归 返回数组,php 递归 无限级分类并返回数组的例子

/*** 递归 无限级分类 返回数组* link&#xff1a;www.jquerycn.cn* date&#xff1a;2013/2/21*/$conn mysql_connect(localhost,root,123456);mysql_select_db(test);mysql_query("set names utf8");function getCate($pid 0){$sql "select * from cate wh…

php电商网站开发流程图,php网上购物平台设计+ER图+流程图.doc

php网上购物平台设计ER图流程图php网上购物平台设计ER图流程图摘要&#xff1a;广义来说&#xff0c;电子商务是指电子工具在商务活动中的应用。狭义来说&#xff0c;电子商务是在技术、经济高度发达的现代社会里&#xff0c;掌握信息技术和商务规则的人&#xff0c;系统化运用…

常见php面试题,常见的 PHP 面试题和答案分享

搜索热词如何直接将输出显示给浏览器&#xff1f;将输出直接显示给浏览器&#xff0c;我们必须使用特殊标记 。PHP 是否支持多重继承&#xff1f;PHP 只支持单继承。PHP 的类使用关键字 extends 继承另一个类获取图片属性(size,width,和 height)的函数是什么&#xff1f;获取图…

php 查找数组相同元素,查找数组中重复的元素

本文收集整理关于查找数组中重复的元素的相关议题&#xff0c;使用内容导航快速到达。内容导航&#xff1a;Q1&#xff1a;在c语言中输入数组两个数组&#xff0c;查找重复元素并输出怎么写啊可以一次读入N个数据。可以考虑以回车结束读入的一组。参考如下写法&#xff1a;#inc…

highcharts php 动态数据,php动态传数据到highcharts的方法

本文主要介绍了通过php动态传数据到highcharts的相关知识。具有很好的参考价值。1&#xff1a;在平时工作中&#xff0c;在对数据进行展示的时候&#xff0c;是直接通过后台提供的接口来获取json串&#xff0c;用来展示。今天别人问怎么在本地演示一下请求的动态数据。2&#x…

asm 5 java,java – 使用ASM(5.x)在字节代码中检测运行时的递归方法调用:howto?

问题如下;Java代码中的方法是&#xff1a;Rule foo(){return sequence(foo(), x());}这将引发解析循环,当然应该避免;但是,这是合法的&#xff1a;Rule foo(){return sequence(x(), foo());}现在,代码中的其他地方我可以访问RuleMethod,这是一个扩展MethodNode的类,因此我可以访…

mysql外键设置sql语句,SQL Server 2008之SQL语句外键

xin3721网络学院为广大学员&#xff0c;准备了丰富了教学视频。为了更好的让大学配合视频进行学习&#xff0c;拓展学员的知识面&#xff0c;我站特整理了大量的&#xff0c;技术文章&#xff0c;供学员参考。因此本教案需配合视频教程学习&#xff0c;视频教程地址为&#xff…

nginx index.php 端口,请教下 nginx 配置域名反代到本地端口这里面应该怎么加。

域名 1.31.tw 怎么添加反代可以正常访问 127.0.0.1:5000 端口? 我自己加的反代在域名开启 ssl 下 css 不正常&#xff0c;错位。弄一天了没弄明白&#xff0c;求大佬。谢谢下面是配置文件&#xff1a;server {listen 80;listen 443 ssl http2;ssl_certificate /usr/local/ngin…

php tar.gz文件,PHP解压tar.gz格式文件的方法,_PHP教程

PHP解压tar.gz格式文件的方法&#xff0c;本文实例讲述了PHP解压tar.gz格式文件的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;1、运用php自带压缩与归档扩展(phar)$phar new PharData(song.tar.gz);//路径 要解压的文件 是否覆盖$phar->extractTo(c:/tmp,…

java 像素级碰撞检测,» 像素级碰撞检测类

//像素级碰撞检测package{import flash.display.BitmapData;import flash.display.BlendMode;import flash.display.DisplayObject;import flash.display.Sprite;import flash.geom.ColorTransform;import flash.geom.Matrix;import flash.geom.Point;import flash.geom.Rectan…

matlab暂态信号,MATLAB6在电力暂态波形仿真实现中的应用

1概述现代继电保护不但要测量电力系统稳态情况下的特性,还要测量电子系统暂态情况下的特性。对绝大多数保护装置来说,不可能利用实际电力系统的人工短路试验来检验其性能。继电保护试验设备应具有仿真能力,能模拟电力系统发生各种故障和不正常状态时的暂态过程,特别是严重畸变的…

创建数组表格PHP苹果价格,如何从PHP数组创建HTML表?

Cats萌萌这是我的&#xff1a;<?php function build_table($array){ // start table $html . htmlspecialchars($key) . . htmlspecialchars($value2) .

python打包exe报错编码问题,使用Python打包含有pymssql成exe所躺的坑

一、如何打包Python打包exe文件简单运用pyinstaller库就行了1)安装pyinstaller库(自行安装)2)winR打开运行窗口输入“powershell”3)输入pyinstaller -F 路径\文件名.py(打包py文件的路径&#xff0c;py不能省略)看到successfully即为打包成功&#xff0c;但不一定能运用的&…

centos 6.5装mysql 5.7,centos 6.5装mysql5.7

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼报错er-5.7.17-1.el7.i686 需要--> 处理依赖关系 libc.so.6(GLIBC_2.17)&#xff0c;它被软件包 mysql-community-server-5.7.17-1.el7.i686 需要--> 完成依赖关系计算错误&#xff1a;Package: mysql-community-client-5.7.…

php超大树形分页,PHP+MySql千万级数据limit分页优化方案

PHPMySql千万级数据limit分页优化方案1年前阅读 2750评论 0喜欢 0### 原因徒弟突然有个需求&#xff0c;就是他发现limit分页&#xff0c;页数越大之后&#xff0c;mysql的消耗越大&#xff0c;查询时间越长&#xff0c;当突破百万级数据之后&#xff0c;一个简单的翻页都需要5…

oracle数据库连接满了,ORACLE数据库连接数满的分析及优化

最近在使用Oracle的过程中&#xff0c;出现了数据库连接数满的情况&#xff0c;导致程序及数据库连接工具连接不上。主要从两个方面来考虑这件事&#xff0c;从程序方面来看&#xff1a;1.进行数据库连接操作后未释放连接&#xff1b;2.若使用了数据库连接池&#xff0c;则考虑…

oracle移动硬盘盒,oracle-linux下挂载移动硬盘 NTFS类型

环境&#xff1a;ORACLE-LINUX 5.7全新移动硬盘(未使用过)移动硬盘空间3T在默认情况下&#xff0c;Linux系统不支持NTFS分区挂载1、服务器&#xff1a;A服务器和B服务器为一套ORACLE-RAC&#xff0c;移动硬盘插在A服务器上&#xff1b;2、下载ntfs-3g包&#xff0c;在A服务器上…