编码安全指南

编程本身就应该是一门艺术,而安全编程更是一种在刀尖上舞蹈的艺术,不仅要小心脚下的锋利寒刃,更要小心来自网络黑客或攻击者的狂轰乱炸。

- by code artist

  • 1.hash比较的缺陷

    经过试验发现,当Hash值以"0e"开头且后面都为数字,当和数字进行比较的时候总会被判断和0相等

例如:

var_dump('0e1327544' == 0); // bool(true)

当密码被md5计算后,可能会以"0e"开头,下面这个例子可以绕过密码验证。

经过我的验证PHP 7.1.x后没有这种问题。

<?php
$password_from_db = "0e23434";
$password = "2323"; // 随意的一个密码。来自$_POST,即表单提交
if ($password_from_db == md5($password)) {
echo "login success!";
} else {
echo "login fails";
}

更安全的hash比较:

可以使用内置函数hash_equals()来比较hash值。(PHP版本必须是5.6及其以上)

 if (hash_equals($password_from_db, md5($password)) {
.....// other logic
}
  • 2.bool比较的缺陷

json_decode和unserialize函数可能将部分结构解析成bool值,造成一些比较上的缺陷。

先举例json_decode的案例:

<?php
$str = '{"user":true, "pass": true}'; $data = json_decode($str, true); if ($data['user'] == 'root' && $data['pass'] == 'pass') {
echo "login success\r\n";
} else {
echo "login fails\r\n";
}

执行结果为:login success

这样利用bool比较的漏洞就绕过了登录或者授权验证。

unserialize过程相逆,结果类似,也会出现安全问题。

正确的做法还是使用"==="来进行比较,这不光是php,包括一些其他脚本语言或者静态语言,都请严谨地使用全等于符号进行比较。

  • 3.数值比较

PHP虽然是弱类型语言,但是数据类型也有数值范围。对于整型而言,最大值为PHP_INT_MAX(即9223372036854775807)

攻击者可以利用最大值越界,绕过一些验证,如登录、账号充值等等。

举例:

$a = 9223372036854775807;
$b = 9223372036854775827;
var_dump($a === $b); // bool(true)
var_dump($a % 100); // int(0)

由此,可见全等号(===)也不是万能的,具体场景下要更小心。经验证,PHP7.1.x后不会出现该问题,5.x的可能出现。

在实际业务逻辑里面一定要注意判断最大值问题,避免越界带来的问题。

当使用超长浮点数变量的时候,PHP也会出错。

<?php
$uid = 0.999999999999999999;
if ($uid == "1") {
echo "search uid is 1 for data\r\n"; // 这里PHP将$uid约等于1了,进入该判断条件里的逻辑
}

同理,2.999999999999也会被当成3,这就是超越浮点数精度造成的偏差。

解决办法有很多,最简单的就是用is_int()函数进行判断,如果不是整型,则报错或做错误处理。

  • 4.switch缺陷

当用case判断数字的时候,switch会把参数转换成int类型进行计算,代码如下:

<?php
$num = "1FreePHP";
switch ($num) {
case 0: echo "nothing";
break;
case 1: echo "1 hacker here!";
break;
case 2: echo "2 hackers here";
break;
default:
echo "confused";
}

最后输出:1 hacker here!

所以,请使用is_numeric()函数进行判断,保证数据类型如预期的一致。

  • 5.数组缺陷。

    in_array()和array_search()函数在没有使用严格模式的情况下会用松散比较,可能造成一些错误。

    例如:
<?php
$arr = [0, 2, 3, "4"];
var_dump(in_array('freephp', $arr)); // true
var_dump(array_search('freephp', $arr)); // 0: 下标
var_dump(in_array('2freephp', $arr)); // true
var_dump(array_search('3freephp', $arr)); // 2: 下标

总的来说,PHP工程师对于这种弱类型语言的使用上要更加小心,虽然平时写起业务来“短平快”,但安全编程也不要忘记,能用上hint的高版本PHP就进行标注清楚入参、出参,让PHP代码更加健壮。

PHP安全之道学习笔记2:编码安全指南的更多相关文章

  1. MySQL学习笔记5——编码

    MySQL学习笔记5之编码 编码 1.查看MySQL数据库编码 *SHOW VARIABLES LIK 'char%'; 2.编码解释 *character_set_client:MySQL使用该编码 ...

  2. 树莓派学习笔记——USB wifi配置指南

    0 前言     树莓派既能够使用有线网络又能够无线网络,假设使用有线网络不方便的话能够借助USB wifi无线网卡让树莓派也插上无线"翅膀". 可是和使用有线网络即插即用的方式不 ...

  3. postgresql修炼之道学习笔记(1)

    好好学习吧. 本笔记 仅作为摘要记录 前两章,主要是数据库对比和安装等. 对比,就比多说了,总是和别人比较,会显得自己身价低,呵呵. 安装也有很多文章,不多说. 第二章提到了一些简单的配置, 其在 d ...

  4. postgresql修炼之道学习笔记(2)

    随后的章节  介绍了基础的sql,这个我略过了,我喜欢在开发的时候,慢慢的研究,毕竟有oracle的基础. 现在,学习psql工具 使用create database创建数据库的时候,出现如下问题: ...

  5. python学习笔记09-python编码与解码

    二进制编码: --->ASCII:只能存英文和拉丁字符 一个字符占一个字节:8位 ------>gb2312:只能存6700多个中文: 1980年发表 ----------->gbk ...

  6. Swift学习笔记 - URL编码encode与解码decode

    使用swift有一段时间了,api的变换造成了很多困扰,下面是关于url编码和解码问题的解决方案 在Swift中URL编码 在Swift中URL编码用到的是String的方法 func addingP ...

  7. IntelliJ IDEA 学习笔记 - 修改编码

    感谢原文作者:codeke 原文链接:https://blog.csdn.net/cgl125167016/article/details/78666432 仓库:https://github.com ...

  8. 学习笔记_Java_day14—编码实战___一个注册页面的完整流程

  9. PHP安全之道学习笔记1:PHP项目安全设置

    在全球范围来看,超过了80%的网站是使用php进行搭建的,由于脚本语言和早期版本设计的诸多原因,php项目存在不少安全隐患.从配置选项来看,可以做如下的优化. 1.屏蔽PHP错误输出. 在/etc/p ...

随机推荐

  1. Graylog源码分析

    上文主要介绍了Graylog的功能与架构,本篇我们来看看Graylog的源码 一. 项目启动(CmdLineTool) 启动基本做了这几件事:初始化logger,插件加载(这里用到了Java SPI机 ...

  2. podman初试-和docker对比

    podman初试-和docker对比 1,什么是docker? Docker 是一个开源的应用容器引擎,属于 Linux 容器的一种封装,Docker 提供简单易用的容器使用接口,让开发者可以打包他们 ...

  3. Flask:数据库的建模

    学习完模板系统,接下来要研究的就是框架对数据库的操作,不论python的那个框架,直接使用数据库API(redis.pymysql等)都可以进行操作,但是这些操作不够方便,于是就有了ORM 1.Fla ...

  4. 微信小程序的canvas和遮盖布颜色设置问题

    canvas绘画出并显示小程序的逻辑首先是将网络图片转化为本地图片,其次再将进行绘画.将本地图片和二维码显示在画布上,最后将整个画布截图用api显示在屏幕上.真正的画图让他飞去屏幕外. 有时候会需要用 ...

  5. 转:如何让phpmyadmin输入密码再进入

    对于很多不熟悉PHP环境安装的朋友来说,用集成环境可以更快的上手,更方便的搭建PHP的运行环境,但是,WAMP的集成环境仅仅是将底层基础工作做好了,有些个别关键的配置操作并没有集成到环境安装中,所以给 ...

  6. [Java]Java类和对象内存分配详解

    描述 代码说明: 一.当Person p1 = new Person();第一次被调用时需要做两件事: 1.先判断类加载器是否加载过Person类,如果没有则加载到Person类型到方法区 2.在堆中 ...

  7. spring session源码解析

    模块划分 core部分代码 存储实现部分部分: jdbc实现 具体存储的实现类 例如:org.springframework.session.jdbc.JdbcOperationsSessionRep ...

  8. AndroidOS体系结构

    首先上图一张 对照着图,我们再来看Android 系统的体系结构就爽多了.我们从底层向上进行分析. 一.Linux 内核层 Linux Kernel 基于linux2.6.其核心系统服务如安全性.内存 ...

  9. 建议收藏备用:.net core使用QRCoder生成普通二维码和带Logo的二维码详细使用教程,源码已更新至开源模板

    随着互联网越来越生活化,二维码的使用越来越普遍,不论是扫码支付还是扫码关注引流,似乎我们总是离不开二维码,那么很多需要推广的文章或社区想要自己的二维码,那么你是不是需要在网站直接提供给用户呢?很多开发 ...

  10. P4873 [USACO14DEC] Cow Jog_Gold 牛慢跑(乱搞?二分?)

    (话说最近写的这类题不少啊...) 化简:给定数轴上一系列点,向正方向移动,点不能撞在一起,如果碰到一起就需要放到另外一行,求要多少行才能满足所有点不相撞的条件. (被标签误解,老是想到二分答案... ...