iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >如何让PHP的代码更安全
  • 931
分享到

如何让PHP的代码更安全

2024-04-02 19:04:59 931人浏览 八月长安
摘要

目录概述越权漏洞1. 水平越权2. 垂直越权3. 上下文越权Jwt 的 Token 需要二次加密LFI (本地文件包含)XSSCSRF (跨站请求伪造)概述 攻击者通过构造恶意sql

概述

攻击者通过构造恶意sql命令发送到数据库,如果程序未对用户输入的 SQL命令执行判断过滤,那么生成的SQL语句可能会绕过安全性检查,插入其他用于修改后端数据库的语句,并可能执行系统命令,从而对系统造成危害

例如删除 id 为 1 的帖子,sql 如下:


$post_id = $_POST['post_id'];
$sql = "DELETE FROM posts WHERE user_id = 1 AND id = $post_id";
\DB::statement($sql);

如果有人在提交 post_id 时输入 1 OR 1 ,你的语句会组合成这样:


$sql = "DELETE FROM posts WHERE user_id = 1 AND id = 1 OR 1";

一般比较常出现在原生的 SQL 操作,框架一般会解决这方面的问题。通常采用参数控制或过滤特殊字符避免上述的问题。

越权漏洞

1. 水平越权

水平越权就是同等角色下的用户,不但能够访问和操作自己私有的数据,还能访问其他人私有的数据,其根本是基于数据的访问权限。

删除用户收款方式的场景如下:

graph LR

用户登录-->token

token-->获取收款方式列表

获取收款方式列表--token-->通过id删除

通过收款方式 {id} 执行 delete 请求的路由为:localhost/api/payments/{id}

假如用户A的收款方式有{1,2,3}    用户B的收款方式有{4,5}

如果没有做数据控制,A 登录后携带 A 的 token 执行删除的接口localhost/api/payments/4,则会删除 B 的,所以需要对destory方法做数据控制


# 1 删除前鉴权处理
public function destory($id){
    $payment = Payment::find($id);
    if ($payment->user_id != $this->currentUser->id) {
            return ...
    }
    $payment->delete();
}

# 2 参入id查询删除
public function destory($id){
    Payment::whereUserId($this->currentUser->id)->whereId($id)->delete();
}

# 3 模型关联查询
class User extends Model{
    public function payments()
    {
            return $this->hasMany('App\Payment');
    }
}

class PaymentController extends Controller{
    public function destory($id)
    {
            $this->currentUser->payments()->whereId($id)->delete();
    }
}

推荐使用第三种方式做数据控制,不然面向对象白学了。获取收款方式的列表同样需要数据权限控制,用户和收款方式存在一对多的关联关系,模型关联后,获取用户收款方式列表可以写成


class PaymentController extends Controller{
    public function index($id)
    {
        #带条件的查询
        $payments = $this->currentUser->payments()->where(function($query){
                ...
        })->get();

        #不带条件的查询
        $payments = $this->currentUser->payments;
    }
}

2. 垂直越权

低权限的角色通过一些途径,获得高权限的能力,就发生了越权访问。如普通用户 guest 修改 admin 用户的密码;guest 可直接进入后台取得域名管理、用户管理等所有权限

解决这个问题,需要把权限职责以最小颗粒细分,基于 RBAC 设计权限管理系统。分为以下关联模型

graph LR 

用户--多对多-->角色

用户--多对多-->权限

角色--多对多-->权限

每次执行请求时,在前置中间件判断这个用户是否永远该执行请求的权限,无权限则驳回。

3. 上下文越权

攻击者能够利用应用程序状态机中的漏洞获得关键资源的访问权限,这就存在上下文相关的越权。上下文相关的越权漏洞一般属于业务逻辑漏洞。 如在找回密码过程中,攻击者使用自己的账户信息通过验证,将他人的密码进行了修改。

graph LR

1.邮箱验证-->2.找回密码

在步骤1之后,执行找回密码,路由为 。如果此时没有校验当前找回密码的账户是否为进行邮箱校验后的账户,由可能产生越权漏洞.

路由 : 【PUT 】localhost/api/users/find-passWord,接收参数 email,new_password.

错误:校验和修改分成 2 步localhost/api/email/check->localhost/api/users/password


class UserController extends Controller{
    public function check($data)
    {
        if (checkEmail($data['email'], $data['code'])) {
                return true;
        }
        ...
    }

    public function findPassword()
    {
        $user = User::whereEmail($data['email'])->first();
        $user->password = bcrypt($data['new_password']);
        $user->save();
    }
}

正确:在 findPassword 里面再次验证完成邮箱校验的账户是否为当前找回密码的账号


class UserController extends Controller{

    public function check($data)
    {
        if (checkEmail($data['email'], $data['code'])) {
                return true;
        }
        ...
    }

    public function findPassword($data)
    {
        if (checkEmail($data['email'], $data['code'])) {
                $user = User::whereEmail($data['email'])->first();
                $user->password = $data['new_password'];
                $user->save();
        }
        ...
    }
}

限制分页条目范围,防止恶意请求

如获文章列表的接口localhost/api/articles


public function index($params){
    $pageId = $params['pageid'] ?? PAGE_ID;    //页码
    $pageSize = $params['pagesize'] ?? 15;  //条码

    $articles = Article::where(function ($query) use ($params) {
            ...
    })->take($pageSize)->skip($pageId * $pageSize)->orderby('id', 'desc')->get();
    ...
    ...
}

以上代码如果没有限制 pagesize 的范围,恶意请求者请求把 pagesize 输入 5000,10000 等甚至更大的数,会给数据库带来一定的压力,localhost/api/articles?pageid=0&pagesize=10000


//用框架自带的分页方法
public function index(){
    $builder = Article::with('cateGory:id,name')->orderBy('id', 'desc')->paginate(8);
    return response()->JSON(['status' => true, 'count' => $builder->total(), 'articles' => $builder->items()]);
}

JWT 的 Token 需要二次加密

许多拓展包加密出的token并不十分安全,用base64_decode可以解密获取 加密主键、载荷等重要信息,所以通常需要对JWT的token进行二次加密

限制上传文件的类型

对于一个图片上传的接口,如果没有对上传文件的格式做限制,攻击者很有可能把 .PHP后缀的文件上传到public/images目录下,然后通过根目录执行这个文件。

需要设计安全的文件上传功能避免上述问题

1.文件上传的目录设置为不可执行

2.判断文件类型

3.使用随机数改写文件名和文件路径

4.单独设置文件服务器的域名

禁止或者避免写自动解压.zip 等压缩文件的代码

单纯地限制文件或压缩包大小并没有用,一个ZIP炸弹的.zip文件仅有 42 KB,但在解压后会占用 4718592 GB

避免登录密码被暴力破解

1.设定严格的速率限制,如登录次数限制,登录错误次数达 x 次时暂停登录 n 分钟

2.密码加上随机盐


public function reg(){
    $user = new User;
    $salt = radom(6);
    $user->password = bcrypt($data['password'] . $salt);
    ...
}

做好异常处理,避免在生产环境中不正确的错误报告暴露敏感数据

如果你不小心,可能会在生产环境中因为不正确的错误报告泄露了敏感信息,例如:文件夹结构、数据库结构、连接信息与用户信息。

1.在.env 文件中关闭调试模式

APP_DEBUG=true

2.php 错误控制 error_reporting、display_errors


<?php
// 关闭错误报告
error_reporting(0);

// 报告 runtime 错误
error_reporting(E_ERROR | E_WARNING | E_PARSE);

// 报告所有错误
error_reporting(E_ALL);

// 等同 error_reporting(E_ALL);
ini_set("error_reporting", E_ALL);

// 报告 E_NOTICE 之外的所有错误
error_reporting(E_ALL & ~E_NOTICE);
?>

display_errors = Off

php 弱语言的设计缺陷如:in_array


$array=[0,1,2,'3'];

var_dump(in_array('abc', $array)); //true

var_dump(in_array('1bc', $array)); //true

# 上面的情况返回的都是 true, 因为'abc'会转换为 0,'1bc'转换为 1

$a = null;
$b = false;
echo $a==$b;  //true

$c = "";
$d = 0;
echo $c==$d   //true

在一些重要的地方需要使用===来作数据判断。

LFI (本地文件包含)

LFI (本地文件包含) 是一个用户未经验证从磁盘读取文件的漏洞。

不验证过滤用户的输入 将它要渲染的模板文件用 GET 请求加载。


<body>
    <?php
      $page = $_GET['page'];
      if(!$page) {
        $page = 'main.php';
      }
      include($page);
    ?></body>

由于 Include 可以加载任何文件,不仅仅是 PHP,攻击者可以将系统上的任何文件作为包含目标传递。

index.php?page=../../etc/passwd

这将导致 /etc/passwd 文件被读取并展示在浏览器上。

要防御此类攻击,你必须仔细考虑允许用户输入的类型,并删除可能有害的字符,如输入字符中的 “.” “/” “\”。

XSS

XSS 又叫 CSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往 WEB 页面里插入恶意 html 代码,当用户浏览该页之时,嵌入其中 Web 里面的 html 代码会被执行,从而达到恶意攻击用户的特殊目的。


<body>
    <?php
        $searchQuery = $_GET['q'];
        
    ?><h1>You searched for: <?php echo $searchQuery; ?></h1></body>

因为我们把用户的内容直接打印出来,不经过任何过滤,非法用户可以拼接 URL: search.php?q=%3Cscript%3Ealert(1)%3B%3C%2Fscript%3E

PHP 渲染出来的内容如下,可以看到 javascript 代码会被直接执行:


<body>
<h1>You searched for: <script>alert(1);</script></h1>
<p>We found: Absolutely nothing because this is a demo</p>
</body>

Javascript 可以:

  • 偷走你用户浏览器里的 Cookie;
  • 通过浏览器的记住密码功能获取到你的站点登录账号和密码;
  • 盗取用户的机密信息;
  • 你的用户在站点上能做到的事情,有了 js 权限执行权限就都能做,也就是说 A 用户可以模拟成为任何用户;
  • 在你的网页中嵌入恶意代码;

使用htmlentities()过滤特殊字符,防止大部分的 xss 攻击

CSRF (跨站请求伪造)

例如网站上有用户可以用来注销账户的链接。


<a href="Http://your-website.com/delete-account" rel="external nofollow" >销毁账户</a>

如果某个用户评论:


<img src=”http://your-website.com/delete-account”> wow

用户将在查看此评论的时候删除他们的账号。

laravel 的 web 路由默认开启了 csrf 验证,原理是在客户端产生一个随机的 token,在表单校验时判断这个 token 是否是这个页面上的请求

以上就是如何让PHP的代码更安全的详细内容,更多关于让PHP的代码更安全的资料请关注编程网其它相关文章!

--结束END--

本文标题: 如何让PHP的代码更安全

本文链接: https://www.lsjlt.com/news/127035.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何让PHP的代码更安全
    目录概述越权漏洞1. 水平越权2. 垂直越权3. 上下文越权JWT 的 Token 需要二次加密LFI (本地文件包含)XSSCSRF (跨站请求伪造)概述 攻击者通过构造恶意SQL...
    99+
    2024-04-02
  • 打包PHP Shell框架:如何让你的代码更加安全?
    在开发Web应用程序时,安全一直是一个重要的考虑因素。为了保护应用程序免受攻击,开发人员需要采取措施来确保他们的代码是安全的。其中一项重要的措施是使用PHP Shell框架。 PHP Shell框架是一个轻量级的PHP框架,它旨在帮助开发...
    99+
    2023-08-14
    打包 shell 框架
  • PHP IDE和Git:如何让你的代码更加高效和安全?
    PHP作为一种广泛使用的编程语言,已经成为许多网站和应用程序的基础。但是,开发PHP应用程序并不总是容易的事情。为了提高效率和代码质量,开发人员通常需要使用集成开发环境(IDE)和版本控制系统(如Git)。 本文将介绍如何使用PHP ID...
    99+
    2023-10-25
    ide git 文件
  • 如何让python代码更Pythonic
    今天就跟大家聊聊有关如何让python代码更Pythonic,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。这篇文章,主要介绍几个简单技巧,让你在写Python代码,更Pythonic...
    99+
    2023-06-17
  • PHP编程算法:如何让你的代码更易读?
    PHP是一种流行的编程语言,它在Web开发中得到广泛应用。尽管PHP已经存在了很长时间,但有些程序员在编写PHP代码时仍然会遇到一些困难。其中一个问题是代码的可读性。 在这篇文章中,我们将探讨如何使用一些简单的编程算法来提高你的PHP代码...
    99+
    2023-08-12
    git 编程算法 javascript
  • 如何让 PHP 数据库连接更安全高效?
    非常抱歉,由于您没有提供文章标题,我无法为您生成一篇高质量的文章。请您提供文章标题,我将尽快为您生成一篇优质的文章。...
    99+
    2024-05-21
  • 如何保障 PHP 函数的代码安全?
    为了保障 php 函数代码安全,建议遵循以下最佳实践:验证用户输入、对输出数据进行编码、限制函数执行、禁用不必要的功能、使用参数化查询、使用安全框架。实战案例中,验证用户提交的姓名时,需...
    99+
    2024-04-30
    php 代码安全 mysql 表单提交 lsp
  • PHP 代码安全:保持应用程序安全的最新更新
    在当今数字化时代,确保 php 代码安全至关重要。最新的安全最佳实践包括:使用最新 php 版本启用错误报告使用参数化查询验证用户输入使用密码哈希通过实施这些最佳实践并定期更新代码,您可...
    99+
    2024-05-10
    php 代码安全 mysql lsp
  • CMS的安全性大揭秘:如何让网站更安全
    随着互联网的发展,网站已经成为企业和个人必不可少的工具。而网站的安全性也日益受到重视。CMS(内容管理系统)作为一种网站管理工具,其安全性对于网站来说至关重要。本文将揭秘CMS的安全性问题,并提供如何让网站更安全的建议。 一、CMS的安全...
    99+
    2024-02-12
    CMS 安全性 漏洞修复 代码安全 备份
  • 如何让JavaScript代码更加精简
    这篇文章主要介绍“如何让JavaScript代码更加精简”,在日常操作中,相信很多人在如何让JavaScript代码更加精简问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何让JavaScript代码更加精简...
    99+
    2023-06-30
  • PHP 缓存和 numpy 打包:如何让你的代码更快、更高效?
    在现代软件开发中,性能是一个关键问题。随着软件规模的不断扩大,代码的性能问题往往会成为一个瓶颈。在这种情况下,缓存和打包技术是两个非常重要的工具,可以大大提高代码的性能和效率。 在本文中,我们将探讨两种不同的技术:PHP 缓存和 nump...
    99+
    2023-06-03
    缓存 numpy 打包
  • JavaScript 安全编码技巧:编写更安全的代码
    1. 使用严格模式 严格模式是 JavaScript 的一种语法,它可以帮助你编写更安全的代码。严格模式下,JavaScript 引擎会更加严格地执行代码,并会抛出一些在非严格模式下不会抛出的错误。例如,在严格模式下,你不能使用未声明的...
    99+
    2024-02-04
    JavaScript 安全编码 安全编码技巧 安全代码 Web 安全
  • 如何让VPS主机使用更安全
    让VPS主机使用更安全的方法:1、选择好的VPS主机商,以保证自身的利益;2、选择自行搭建系统,不用使用可视化管理面板;3、关注一键安装包或第三方组件的更新,及时进行系统的安全管理;4、定期检查网站的程序文件,看是否有漏洞和是否有可疑的文件...
    99+
    2024-04-02
  • 如何让美国vps使用更安全
    让美国vps使用更安全的方法:1、选择好的VPS主机商,以保证自身的利益;2、选择自行搭建系统,不用使用可视化管理面板;3、关注一键安装包或第三方组件的更新,及时进行系统的安全管理;4、定期检查网站的程序文件,看是否有漏洞和是否有可疑的文件...
    99+
    2024-04-02
  • JavaScript 代码优化秘籍:如何让你的代码更简洁、更高效
    作为一名 JavaScript 开发人员,优化代码是至关重要的。优化代码可以提高性能、可读性和可维护性。本文将分享一些常用的 JavaScript 代码优化技巧,帮助您写出更优质的代码。 1. 使用严格模式 严格模式可以帮助您发现代码中...
    99+
    2024-02-27
    JavaScript 代码优化、性能、可读性、可维护性、代码质量
  • JavaScript 代码优化秘籍:如何让你的代码更健壮、更可靠
    1. 使用严格模式 严格模式是 JavaScript 中的一种语法模式,它可以帮助您更早地发现错误并确保您的代码更安全。要使用严格模式,您可以在脚本的顶部添加"use strict";语句。例如: "use strict"; // 你...
    99+
    2024-02-27
    JavaScript 优化、代码质量、性能优化、可靠性
  • ES6中如何让代码更简短,更整洁,更易读
    这篇文章给大家分享的是有关ES6中如何让代码更简短,更整洁,更易读的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。template literals 模板字符串模板字符串使字符串的...
    99+
    2024-04-02
  • PHP 代码安全:云计算的安全隐患
    php 代码安全的云计算安全隐患包括:sql 注入攻击、xss 攻击、缓冲区溢出攻击和 rce 攻击,最佳实践包括验证用户输入、使用哈希密码、更新软件、配置安全的 web 服务器和使用安...
    99+
    2024-05-10
    安全 php 敏感数据
  • ASP 和 npm 如何让你的 JavaScript 代码更高效?
    JavaScript 是前端开发中最常用的语言之一,而 ASP 和 npm 是许多开发者喜欢使用的工具。它们能够帮助开发者更高效地编写 JavaScript 代码,提高代码的质量和可维护性。本文将介绍 ASP 和 npm 如何帮助你提高 ...
    99+
    2023-06-21
    npm javascript linux
  • 编程算法:如何让你的代码更高效?
    编程算法是计算机科学的重要分支之一,它研究如何设计和分析高效的算法来解决各种问题。在编写代码时,选择正确的算法可以使代码更加高效,减少时间和空间的浪费。本文将介绍一些常见的编程算法,以及如何在代码中使用它们来提高代码的效率。 一、排序算法...
    99+
    2023-08-12
    git 编程算法 javascript
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作