openssl_error_string() 不要依赖错误信息作为逻辑判断
不应该将 OpenSSL 错误信息直接用于程序的逻辑控制,而是应该将其作为调试和记录的辅助手段。这是因为 OpenSSL 错误信息的格式和内容可能会因 OpenSSL 版本、操作系统环境等因素而发生变化,直接依赖这些信息可能会导致代码的不稳定和难以维护。
为什么不能依赖错误信息作为逻辑判断?
1. 错误信息的不稳定性
- 版本差异:不同版本的 OpenSSL 库可能会返回不同的错误信息。例如,某些错误代码或描述在新版本中可能被修改或替换。
- 环境差异:在不同的操作系统或配置下,错误信息的格式或内容可能略有不同。
2. 错误信息的可读性
- 错误信息通常是面向开发者的,而不是面向最终用户的。它们可能包含技术细节,不适合直接展示给用户。
- 错误信息的格式和内容可能难以直接用于逻辑判断,因为它们通常是为了描述问题的细节,而不是为了提供明确的错误类型。
3. 代码的可维护性
- 如果直接依赖错误信息进行逻辑判断,代码的可维护性会降低。当 OpenSSL 版本升级或环境发生变化时,可能需要重新调整错误处理逻辑。
- 更好的做法是使用返回值(如函数的返回码)来判断操作是否成功,而不是依赖错误信息。
正确的做法
1. 使用返回值进行逻辑判断
OpenSSL 函数通常会返回一个明确的返回值,表示操作是否成功。例如:
openssl_verify()
返回1
表示验证成功,0
表示验证失败,-1
表示出现错误。openssl_pkey_get_public()
返回一个资源表示成功,返回false
表示失败。
$res = openssl_pkey_get_public("file://path/to/public/key.pem");
if ($res === false) {// 处理失败逻辑while ($msg = openssl_error_string()) {error_log("OpenSSL Error: " . $msg);}
} else {// 处理成功逻辑openssl_free_key($res);
}
2. 记录错误信息用于调试
错误信息可以记录到日志文件中,用于调试和问题排查。这样可以保留错误的详细信息,而不依赖它们进行逻辑判断。
$result = openssl_verify($data, base64_decode($sign), $res, OPENSSL_ALGO_SHA256);
if ($result !== 1) {// 记录错误信息while ($msg = openssl_error_string()) {error_log("OpenSSL Error: " . $msg);}// 返回失败逻辑return false;
}
3. 提供用户友好的错误提示
如果需要向用户显示错误信息,应该提供一个用户友好的错误提示,而不是直接显示 OpenSSL 的错误信息。
if ($result !== 1) {// 记录错误信息到日志while ($msg = openssl_error_string()) {error_log("OpenSSL Error: " . $msg);}// 向用户显示友好的错误提示echo "验证失败,请稍后再试。";
}
总结
- 不要依赖错误信息作为逻辑判断:错误信息主要用于调试和记录,而不是用于控制程序逻辑。
- 使用返回值进行逻辑判断:依赖函数的返回值来判断操作是否成功。
- 记录错误信息:将错误信息记录到日志文件中,便于后续排查问题。
- 提供用户友好的错误提示:向用户显示友好的错误提示,而不是直接显示技术性的错误信息。
php对接支付宝网关的时候,被他的错误提示折磨了好久,痛苦面具。
error:0D0680A8:asn1 encoding routines:asn1_check_tlen:wrong tag
error:0D06C03A:asn1 encoding routines:asn1_d2i_ex_primitive:nested asn1 error
error:0D08303A:asn1 encoding routines:asn1_template_noexp_d2i:nested asn1 error
error:04093004:rsa routines:old_rsa_priv_decode:RSA lib
error:0909006C:PEM routines:get_name:no start line
相关文章:
openssl_error_string() 不要依赖错误信息作为逻辑判断
不应该将 OpenSSL 错误信息直接用于程序的逻辑控制,而是应该将其作为调试和记录的辅助手段。这是因为 OpenSSL 错误信息的格式和内容可能会因 OpenSSL 版本、操作系统环境等因素而发生变化,直接依赖这些信息可能会导致代码的不稳定和难以维护。 为什么不…...
AbortController 取消请求
AbortController是JavaScript中的一个全局类,主要用于中止各种异步操作,包括网络请求、事件监听器、可写流和数据库事务等。通过提供一个AbortSignal对象,AbortController允许开发者在需要时自由地终止这些操作,避免不必要的开…...
【论文阅读】PEEKABOO: Interactive Video Generation via Masked-Diffusion
PEEKABOO: Interactive Video Generation via Masked-Diffusion 原文摘要 研究背景与问题 现状:现代视频生成模型(如 Sora)已能生成高质量视频,但缺乏用户交互控制能力。 问题:交互控制是未来应用和创意表达的关键功能…...
Java 多线程基础:Thread 类详解
在 Java 中,多线程编程离不开 Thread 类。本文将介绍 Thread 的常用属性和方法,并结合实际使用场景进行讲解。 一、线程的创建与基本操作 Java 提供了两种主要方式来创建线程: 继承 Thread 类 class MyThread extends Thread {public void r…...
论文阅读:2024 arxiv FlipAttack: Jailbreak LLMs via Flipping
总目录 大模型安全相关研究:https://blog.csdn.net/WhiffeYF/article/details/142132328 https://www.doubao.com/chat/4001481281518594 FlipAttack: Jailbreak LLMs via Flipping https://arxiv.org/pdf/2410.02832 速览 这篇论文主要介绍了一种针对大语言模…...
《数据结构之美--二叉树oj题练习》
引言: 上次我们学习了二叉树这一数据结构,这次我们就针对二叉树来做一些oj题来巩固一下 1. 单值二叉树 题目: 思路分析: 代码实现: 题目传送门: 力扣–965.单值二叉树 2. 相同的树 题目: 思路分析&am…...
大模型——使用coze搭建基于DeepSeek大模型的智能体实现智能客服问答
大模型——使用coze搭建基于DeepSeek大模型的智能体实现智能客服问答 本章实验完全依托于coze在线平台,不需要本地部署任何应用。 实验介绍 1.coze介绍 扣子(coze)是新一代 AI 应用开发平台。无论你是否有编程基础,都可以在扣子上快速搭建基于大模型的各类 AI 应用,并…...
React Navigation 使用指南
React Navigation 使用指南 React Navigation 介绍 React Navigation 是 React Native 中推荐的路由管理方案。 1. 开箱即用,快速上手(Easy to Use) 提供 内置导航器(Built-in Navigators),如栈导航&…...
双系统,bios默认设置启动ubuntu+ubuntu改启动grub设置
设置默认启动ubuntu 装windows后就默认启动windows了 按f6上移动 -------------底下不用看 设了没用 sudo update-grub...
Vue 中的过渡效果与响应式数据:transition、transitiongroup、reactive 和 ref 详解
在 Vue 开发过程中,为应用添加过渡效果和处理响应式数据是提升用户体验和实现动态交互的关键。 一、transition:元素的单元素过渡效果 transition是 Vue 提供的内置组件,专门用于为单个元素或组件添加过渡动画。它会在元素插入、更新或移除…...
Gitea windows服务注册,服务启动、停止、重启脚本
修改配置文件 查看COMPUTERNAME echo %COMPUTERNAME%进入配置文件D:\gitea\custom\conf\app.ini,将 Gitea 设置为以本地系统用户运行 如果结果是 USER-PC,那么 RUN_USER USER-PC$ RUN_USER COMPUTERNAME$SQLite3 PATH配置,更改为包含完整…...
SpringBoot、微服务与AI场景题深度解析
SpringBoot、微服务与AI场景题深度解析 在互联网大厂Java求职者的面试中,经常会被问到关于SpringBoot、微服务以及AI技术的应用场景和解决方案。本文通过一个故事场景来展示这些问题的实际解决方案。 第一轮提问 面试官:马架构,欢迎来到我…...
实验六 文件操作实验
一、实验目的 1、了解文件系统功能及实现原理。 2、掌握LINUX下文件操作的有关系统调用。 3、熟悉main函数带参数运行的有关操作过程。 4、通过模拟程序实现简单的一级文件系统或二级文件系统。 二、实验内容 1、编程显示文件自身。(1分) #includ…...
scratch代码——游戏开发 【弹簧与反弹】
添加角色——绘制 1,level 平台 2, ball 球 3,terk 坦克 开始编程——ball 函数 其余代码 开始编程——terk 代码 完结撒花 ——————————————————THE—END————————————————————...
C++入门(缺省参数/函数/引用)
C入门 一.前言二.缺省参数什么是缺省参数? 三.函数重载一.传参类型不同2. 传参个数不同3.传参顺序不同注意点 四.引用1.引⽤的概念和定义2.引⽤的特性3.引⽤的使⽤4. const引⽤5.指针和引⽤的关系 五.inline(内联)一、什么是inline函数&#…...
ACTF2025 - WEB Excellent-Site
#flask框架 #互联网 #利用CRLF进行头控制 #通过CRLF注入伪造 #利用sql注入进行回显控制 #Jinja2模板 #注意sql语句的相关转义可以控制查询结果 [[IMAP协议简介]] [[SMTP协议简介]] app.py import smtplib import imaplib import email import sqlite3 from urllib.pa…...
通过 Node.js 搭配 Nodemailer 实现邮箱验证码发送
目录 一、整体思路 二、环境准备 三、代码详细步骤 1. 引入模块并初始化 2. 配置 Nodemailer 邮件服务 3. 定义发送验证码接口 4. 定义校验验证码接口 5. 启动服务器 四、补充说明 一、整体思路 接收邮箱地址请求 → 用户在前端填写邮箱,发送到后端接口&…...
Java后端程序员学习前端之html
什么是html Hyper Text Markup Language(超文本标记语言) 超文本包括:文字、图片、音频、视频、动画等 组织:W3C World Wide Web Consortium(万维网联盟)。 成立子1994年,Web技术领域最权威和具影响力的国际中立性技术标准机构 http://www.w3.org! …...
[密码学实战]SDF之非对称运算类函数(三)
[密码学实战]SDF之非对称运算类函数(三) 一、标准解读:GM/T 0018-2023核心要求 1.1 SDF接口定位 安全边界:硬件密码设备与应用系统间的标准交互层 功能范畴: #mermaid-svg-4fs0ed6OYQs5fXlc {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:…...
MCP 架构全解析:Host、Client 与 Server 的协同机制
目录 🏗️ MCP 架构全解析:Host、Client 与 Server 的协同机制 📌 引言 🧩 核心架构组件 1. Host(主机) 2. Client(客户端) 3. Server(服务器) &#…...
第三部分:赋予网页灵魂 —— JavaScript(下)
目录 7 DOM 操作:控制网页的"智能面板7.1 小例子:点击按钮时改变段落文字,根据用户输入改变图片7.2 练习:实现一个简单的 Tab 切换效果 8 事件处理:响应用户的"指令"8.1 小例子:实现点击按钮…...
(02)Redis 的订阅发布Pub/Sub
我们为了自己实现一个MQ功能,就要深入底层挖掘现有开源产品的实现过程。 Redis 发布订阅底层结构解析 Redis 不存储消息,仅作为“实时中转”;只有订阅者在线时才能收到消息;消息是广播给所有订阅此频道的客户端。 1. 核心数据结…...
JavaScript性能优化实战:从基础到高级的全面指南
作为前端开发者,掌握JavaScript性能优化是提升用户体验和职业竞争力的关键。本文将系统性地介绍JavaScript性能优化的各个方面,从基础概念到高级技巧,帮助你编写更高效的代码。 一、JavaScript性能优化基础概念 1.1 什么是JavaScript性能优…...
CertiK创始人顾荣辉出席Unchained Summit,探讨Web3.0安全与合规路径
4月28日,CertiK联合创始人、哥伦比亚大学教授顾荣辉出席迪拜Unchained Summit峰会并发表主题演讲,探讨Web3.0在创新与安全间的平衡,引发网易科技、中国财经时报、腾讯网、新浪财经等多家知名媒体的关注和报道。 作为迪拜最重要的峰会之一&am…...
企业出海降本:如何将应用从 AWS EC2 快速无缝迁移至DigitalOcean Droplet
企业出海已经成为目前最热门的趋势。然而不论你是做跨境电商,还是短剧出海,或处于最热门的AI 赛道,你都需要使用海外的云主机或GPU云服务。海外一线的云服务平台尽管覆盖区域广泛,但是往往费用成本较高。所以降本始终是企业出海关…...
java练习2
package a01_第一次练习.a02_计算输入天数;import java.text.ParseException; import java.time.Duration; import java.time.LocalDateTime; import java.util.Scanner;public class Test {public static void main(String[] args) throws ParseException {//当前时间LocalDat…...
PDM是什么?PDM有什么用?怎么选PDM?2025制造PDM/PLM系统盘点(4000字)
(文章来自CRDE PDM研究中心) 摘要 PDM是制造企业产品数据管理的核心工具,并逐渐发展出了PLM、云PLM等新形态,在功能增加的同时成本也有大幅降低,已经成为企业研发管理的最优选择,并逐渐被有产品创新需求的…...
TiDB 可观测性最佳实践
TiDB 介绍 TiDB,由 PingCAP 公司自主研发的开源分布式关系型数据库,是一款创新的 HTAP 数据库产品,它融合了在线事务处理(OLTP)和在线分析处理(OLAP)的能力,支持水平扩容和缩容&…...
8.idea创建maven项目(使用Log4j日志记录框架+Log4j 介绍)
8.idea创建maven项目(使用Log4j日志记录框架Log4j 介绍) 在 IntelliJ IDEA 的 Maven 项目中引入了 Log4j,并配置了日志同时输出到控制台和文件。 Log4j 提供了灵活的日志配置选项,可以根据项目需求调整日志级别、输出目标和格式。 1. 创建 Maven 项目 …...
Linux 命名管道+日志
一、命名管道 1.1 进程通信的前提:先让不同进程看到同一份资源; 1.2 如何确保两个进程打开的是同一个文件:同路径下同一文件名; 1.3 命名管道:通过路径文件名确保这个份资源的唯一性; 1.4 接口…...
c/c++之信号处理<signal.h>
该库提供了一组用于处理信号的函数和宏。信号是由操作系统或程序本身生成的一种异步事件,用于通知某些事件的发生,例如非法操作、用户中断等。 信号 信号是进程之间通信的重要方式。信号是一种异步通知机制,由操作系统或其他进程发送给当前进…...
基于PyTorch的图像分类特征提取与模型训练文档
概述 本代码实现了一个基于PyTorch的图像特征提取与分类模型训练流程。核心功能包括: 使用预训练ResNet18模型进行图像特征提取 将提取的特征保存为标准化格式 基于提取的特征训练分类模型 代码结构详解 1. 库导入 import torch import torch.nn as nn import…...
DDoS vs CC攻击:哪种对服务器威胁更大?
引言 DDoS(分布式拒绝服务)与CC(Challenge Collapsar)攻击是两种常见的网络攻击手段,均会导致服务器资源耗尽、服务中断。但它们的攻击原理、防御难度及危害程度存在显著差异。本文将从技术原理、攻击效果、防御成本等…...
Weiss Robotics的WPG与WSG系列紧凑型机器人夹爪,精准、灵活、高效
在自动化和智能制造领域,Weiss Robotics 以其创新的智能抓取系统而受到广泛认可。本文将重点介绍 Weiss Robotics 的两大产品系列:WPG 系列和 WSG 系列。这些产品系列凭借其先进的技术特性,为各行各业的自动化需求提供了高效、灵活的解决方案…...
引力透镜效应添加光线弯曲程度可视化层的MATLAB代码
物理实现要点: 雅可比矩阵计算 通过数值梯度计算偏转场的空间导数: 放大率μ反映像的亮度增强倍数 动态范围处理 使用对数压缩μ值范围:μ_vis log10(1μ),避免高放大率区域饱和 多物理量联合显示 红圈标注爱因…...
OpenCV 图形API(71)图像与通道拼接函数-----从图像(GMat)中裁剪出一个矩形区域的操作函数 crop()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 裁剪一个2D矩阵。 该函数根据给定的 cv::Rect 裁剪矩阵。 输出矩阵必须与输入矩阵具有相同的深度,大小由给定的矩形大小指定。 注意…...
tarjan缩点+强联通分量
【模板】缩点https://www.luogu.com.cn/problem/P3387 首先我们要理解这道题为什么要用缩点 题目说的是有向图,如果无环的话就可以用DP来解决了 由于可以走重复的点,所以一个环上的点可以看成是一个点,它的点权就等于该环上所有点的点权之…...
tornado_登录页面(案例)
目录 1.基础知识编辑 2.脚手架(模版) 3.登录流程图(processon) 4.登录表单 4.1后(返回值)任何值:username/password (4.1.1)app.py (4.1.2ÿ…...
Educational Codeforces Round 178 (Rated for Div. 2)
ABC 略 D n个数互质,即n个数都是质数,预处理前4e5个质数,原排列从大到小排序求前缀和,质数求前缀和,从后往前循环第一个前者前缀和能大于等于后者就是留下的i个数。 #include<bits/stdc.h> #define int long …...
从Transformer原理角度来看,prompt设置输出字数限制会生效的原因
从Transformer原理角度来看,prompt设置输出字数限制会生效的原因 1. 生成过程的控制 Transformer在生成文本时是一个自回归的过程,它从起始标记开始,逐个生成下一个单词或标记。在这个过程中,模型会根据已经生成的文本和自身的参数来预测下一个可能的标记的概率分布。当设…...
WEB漏洞--CSRF及SSRF案例
CSRF案例 原理 检测是否存在CSRF(跨站请求伪造)漏洞 1. 手动测试 构造恶意请求:创建一个恶意网页或电子邮件,包含指向目标网站的恶意请求(如更改密码或发送消息的URL)。诱使用户访问该恶意请求,…...
Android开发——实现一个计算器
目录 代码讲解 activity_calculator.xmld代码讲解 1. 根布局(LinearLayout) 2. 显示区域(TextView) 3. 按钮区域(GridLayout) 4. 清除和删除按钮 5. 数字和操作符按钮 6. 其他行的按钮 7. 最后一行…...
23G显存可以跑多大尺寸的Qwen3?
随着阿里Qwen3系列大模型的发布,开发者们对如何在有限显存下部署不同尺寸的模型尤为关注。本文基于Qwen3的技术特性和实际测试数据,探讨在23G显存环境下可运行的模型选择及优化策略。 不过由于咱财力有限,只有一张A100,还不是空的,目前只有23G的显存。 那么这23G显存能跑…...
网络通讯【QTcpServer、QTcpSocket、QAbstractSocket】
目录 QTcpServer class简单描述成员函数和信号 QTcpSocket Class详细描述成员函数和信号 QAbstractSocket Class详细描述成员函数和信号成员函数说明文档 QT实现服务器和客户端通讯服务器端:通讯流程原代码 客户端通信流程原代码 QTcpServer class header: #includ…...
std::functional 类是干什么用的?
author: hjjdebug date: 2025年 04月 29日 星期二 15:54:53 CST description: std::functional 类是干什么用的? 文章目录 1.functional 对象的概念2.functional 对象存在的意义2.1 为什么要把接口再封一层?2.2 c中函数参数可以不用回调函数, 而改用func…...
人事管理系统6
模糊查询 DepartmentMapper.xml : <select id"findDepartmentListByName" resultMap"BaseResultMap"> select <include refid"Base_Column_List"/> from department where dname like %${dname}% /*where dname like con…...
链表的中间节点
这题需要用到快慢指针的思想,快指针叫fast,慢指针是slow,快指针每次往后移两个节点,slow只移动一个节点,这样子fast的速度是slow的两遍,当fast遍历完链表,slow才遍历一半,正好就在中…...
【学习学学】城市群与都市圈是什么?怎么
城市群与都市圈是什么?怎么发展 这些年城市群,都市圈的概念被逐渐提了出来,也是未来我国即将重点发展的对象之一。 因此,身边有一些朋友在问,城市群与都市圈有什么区别?哪个对城市发展影响更大?…...
【深度学习与大模型基础】第14章-分类任务与经典分类算法
Part 1:什么是分类任务? 1.1 分类就是“贴标签” 想象你有一堆水果,有苹果🍎、橘子🍊、香蕉🍌,你的任务是让机器学会自动判断一个新水果属于哪一类——这就是分类(Classification&…...
第十五章:预训练大语言模型
目录 15.1 数据准备 15.1.1 数据预处理 15.1.2 数据调度 15.2 模型架构 15.2.1 主流架构 一、编码器架构(Encoder-only,以 BERT 为代表) 核心特点: 代表模型:BERT、RoBERTa、ALBERT 典型应用: 二…...