当前位置: 首页 > 后端技术 > PHP

PHP最佳实践中的过滤、验证、转义和密码

时间:2023-03-29 17:44:03 PHP

过滤、验证和转义1).不要信任来自不受您直接控制的数据源的任何数据。包括但不限于:$_GET$_POST$_REQUEST$_COOKIE$argvphp://stdinphp://inputfile_get_contents()remotedatabaseremoteAPIdatafromtheclient2).解决方案:过滤输入。不安全的字符被删除,数据在到达应用程序的存储层之前必须被过滤。过滤的数据包括但不限于:HTML、SQL查询、用户资料信息。HTML:使用htmlentities()函数将HTML过滤成相应的实体。此函数对指定的HTML字符进行转义,以便在存储层上安全呈现。正确的使用方法是使用htmlentities($input,ENT_QUOTES,'UTF-8')来过滤输入。或者使用HTML净化器。缺点是SQL查询速度慢:有时SQL查询必须从数据构建。这时候就需要使用PDOpreparedstatements来过滤外部数据。用户资料信息:使用filter_var()和filter_input()过滤用户资料信息3)。校验数据:也可以使用filter_var(),校验成功则返回要校验的值,失败则返回false。但是这个函数不能验证所有的数据,所以可以使用一些验证函数组件。例如aura/filter或symfony/validator4)转义输出:你仍然可以使用htmlentities功能,一些模板引擎也有自己的转义功能。密码1).永远不知道用户的密码。2).绝对不要限制用户的密码,如果要限制的话,只限制最小长度即可。3).切勿使用电子邮件发送用户密码。您可以发送一个更改密码的链接,并使用令牌来验证它是用户本人。4).使用bcrypt计算用户密码的哈希值。加密和散列不是一回事,加密是双向算法,加密的数据可以解密。但是散列是单项算法,散列后的数据无法还原。同一个数据散列后得到的数据总是相同的。使用数据库通过bcrypt存储密码散列值。5).使用密码哈希API,简化计算密码哈希和验证密码的操作。下面注册用户的一般操作POST/register.phpHTTP/1.1Content-Length:43Content-type:application/x-www-form-urlencodedemail=xiao@hello.world&password=nihao下面是接受这个请求的PHP文件12]);if($passwordHash===false){thrownewException('密码哈希失败');}//创建用户账号,这里是虚构的代码$user=newUser();$用户->电子邮件=$电子邮件;$user->password_hash=$passwordHash;$用户->保存();header('HTTP/1.1302重定向');header('Location:/login.php');}catch(Exception$e){header('HTTP1.1400Bad请求');echo$e->getMessage();}6).根据机器的具体计算能力修改password_hash()的第三个值。计算哈希值一般需要0.1s-0.5s。7).密码的散列值存储在varchar(255)类型的数据库列中。8).登录用户的一般流程POST/login.phpHTTP1.1Content-length:43Content-Type:application/x-www-form-urlencodedemail=xiao@hello.wordl&pasword=nihaosession_start();try{$email=filter_input(INPUT_POST,'电子邮件');$password=filter_iinput(INPUT_POST,'密码');$user=User::findByEmail($email);if(password_verify($password,$user->password_hash)===false){thrownewException(''无效密码);}//如有必要,重新计算密码的哈希$currentHasAlgorithm=PASSWORD_DEFAULT;$currentHashOptions=array('cost'=>15);$passwordNeedsRehash=password_needs_rehash($user->password_hash,$currentHasAlgorithm,$currentHasOptions);如果($passwordNeedsRehash===true){$user->password_hash=password_hash($password,$currentHasAlgorithm,$currentHasOptions);$用户->保存();}$_SESSION['user_logged_in']='是';$_SESSION['user_email']=$电子邮件;header('HTTP/1.1302重定向');header('Location:/user-profile.php');}catch(Exception){header('HTTP/1.1401Unauthorized');echo$e->getMessage();}9).PHP5.5.0之前的passwordhashAPI无法使用。推荐使用ircmaxell/password-compat组件专集PHP专集目录地址:https://github.com/xx19941215/webBlogPHP专集预计写20篇左右,主要总结了中容易被忽视的基础知识我们日常的PHP开发和现代PHP开发规范、部署和优化的一些实用建议,以及对Javascript语言特性的深入研究。