NianSir 发布的文章 - NianSir's BLOG
首页
关于 | About US
文章协议
友情站点
搜 索
1
【Minecraft | 我的世界】PC存档转移到服务器存档教程
9,566 阅读
2
记一次七日杀(7Days to die)游戏服务器搭建及联机问题和解决方案
1,475 阅读
3
【陌辞论坛】送一批邀请码,带惊喜大礼
1,039 阅读
4
【Minecraft | 我的世界】服务器搭建记录
902 阅读
5
【免费主机】进行时数据 - 免费1G主机
895 阅读
生活杂谈
好物分享
技术探索
代码杂烩
学习笔记
登录
/
注册
搜 索
标签搜索
学习笔记
免费
服务器搭建
Java
MySQL
WEB
网络
CDN
网络安防
Minecraft
我的世界
Windows
JSP
参赛
奖品
Python
实战
站点优化
PILOT
百乐
NianSir
累计撰写
27
篇文章
累计收到
13
条评论
首页
栏目
生活杂谈
好物分享
技术探索
代码杂烩
学习笔记
页面
关于 | About US
文章协议
友情站点
用户登录
登录
注册
找到
27
篇与
相关的结果
2025-03-20
JSP历险记:Hello Servlet!
上一篇JSP学习笔记我们已经学习了通过JDBC如何与数据库交互这一次我们就来初步了解一下JSP“大脑”:Servlet!📚 00:Hello Servlet0.1 Servlet是什么?Servlet是Java编写的服务器端程序,运行在Web服务器(如Tomcat)中它遵循"请求-响应"模型:接收客户端(浏览器)的请求,处理业务逻辑,返回响应相比CGI,Servlet更高效,因为Java虚拟机常驻内存0.2 Servlet生命周期加载:服务器启动时,或通过<load-on-startup>配置初始化:调用init()方法(只执行一次)处理请求:每次请求调用service()方法(根据HTTP方法分派到doGet()/doPost())销毁:服务器关闭时调用destroy()方法🎮 开篇:为什么我们要学Servlet?在JSP中,Servlet的作用是处理客户端的请求并生成动态的内容。需要使用Servlet是因为它能够帮助我们与客户端进行交互,处理表单数据、数据库操作等,使网页变得更加动态和交互性。简单来说,就好比Servlet是网页的大厨,负责把客人点的菜做好并上桌,让整个用餐体验更加丰富和美味。想象一下,你正在开发一个酷炫的网站,用户可以在上面注册账号、登录、发表动态……而这一切的背后,都离不开一个核心角色——Servlet!它就像网站的大脑,处理用户的请求,返回动态的内容。今天,就让我们踏上Servlet的探险之旅,用一个简单的登陆注册页面例子带你入门!🛠️ 第一步:搭建开发环境1.1 安装JDK打开浏览器,搜索"JDK 8 下载"(注意:Servlet对JDK版本有一定要求,Tomcat 10以下建议用JDK 8,当然你也可选择高版本Java但是必须同时选择高版本Tomcat)在Oracle官网下载JDK( https://www.oracle.com/cn/java/technologies/downloads/ )Windows x64 Installer安装路径建议保持默认(比如C:\Program Files\Java\jdk1.8.0_291)配置环境变量(参考之前的Minecraft开服教程里有提及,这里不再赘述)1.2 安装Tomcat浏览器搜索"Tomcat 9 下载"(注意:Tomcat 10+需要JDK 11+,且包名从javax.servlet改为jakarta.servlet,容易出错)官网下载Windows Service Installer(32-bit/64-bit)安装时选择默认端口8080,管理员账号自己设置关键步骤:安装完成后,找到conf/server.xml,检查<Connector>标签的端口是否被占用1.3 配置IDE(以IntelliJ IDEA为例)新建Java项目 → 选择"Java Enterprise" → 勾选"Web Application"在"Project Structure" → "Libraries" → 添加Tomcat依赖在"Deployment" → 添加"Artifact" → 选择你的项目🛡️ 第二步:创建第一个Servlet2.1 编写Servlet类继承HttpServlet类重写doGet()或doPost()方法使用@WebServlet注解配置URL映射(或配置web.xml)@WebServlet("/hello") public class HelloServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<h1>Hello Servlet!</h1>"); } }2.2 部署并运行将项目部署到Tomcat浏览器访问http://localhost:8080/你的项目名/hello如果看到"Hello Servlet!",恭喜你,第一个Servlet运行成功!🔑 第三步:实战案例——登录注册系统3.1 创建数据库(MySQL示例)新建数据库userdb创建表users:CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) UNIQUE NOT NULL, password VARCHAR(50) NOT NULL );3.2 编写注册Servlet处理表单提交的POST请求连接数据库,插入新用户注意密码加密(这里简单示例用明文,实际项目请用MD5/SHA等)@WebServlet("/register") public class RegisterServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("username"); String password = request.getParameter("password"); // 数据库连接(需添加JDBC驱动) try (Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/userdb", "root", "123456")) { String sql = "INSERT INTO users (username, password) VALUES (?, ?)"; PreparedStatement stmt = conn.prepareStatement(sql); stmt.setString(1, username); stmt.setString(2, password); stmt.executeUpdate(); response.sendRedirect("login.html"); } catch (SQLException e) { e.printStackTrace(); } } }3.3 编写登录Servlet验证用户名和密码使用RequestDispatcher跳转页面@WebServlet("/login") public class LoginServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("username"); String password = request.getParameter("password"); try (Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/userdb", "root", "123456")) { String sql = "SELECT * FROM users WHERE username=? AND password=?"; PreparedStatement stmt = conn.prepareStatement(sql); stmt.setString(1, username); stmt.setString(2, password); ResultSet rs = stmt.executeQuery(); if (rs.next()) { request.setAttribute("username", username); RequestDispatcher dispatcher = request.getRequestDispatcher("welcome.jsp"); dispatcher.forward(request, response); } else { response.sendRedirect("login.html?error=1"); } } catch (SQLException e) { e.printStackTrace(); } } }3.4 创建JSP页面login.html:登录表单register.html:注册表单welcome.jsp:登录成功页面<%-- welcome.jsp --%> <%@ page contentType="text/html;charset=UTF-8" %> <html> <head> <title>欢迎</title> </head> <body> <h1>欢迎,$!</h1> </body> </html>💡 第四步:解决版本兼容问题4.1 Tomcat 10+的坑如果你用了Tomcat 10+,可能会遇到java.lang.ClassNotFoundException: javax.servlet.Servlet错误原因:Tomcat 10+遵循Jakarta EE 9+,包名从javax.servlet改为jakarta.servlet解决方案:方法一:改用Tomcat 9(推荐新手)方法二:在pom.xml中添加依赖(Maven项目):<dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>5.0.0</version> <scope>provided</scope> </dependency>方法三:修改代码中的包名为jakarta.servlet(需要改所有相关类)4.2 JDBC驱动问题下载对应版本的MySQL Connector/J(比如8.0.x)将mysql-connector-java-8.0.x.jar放到Tomcat的lib目录下或在IDE中配置库依赖🔧 第五步:运行与调试启动Tomcat服务器访问http://localhost:8080/你的项目名/register.html注册账号访问http://localhost:8080/你的项目名/login.html登录测试检查数据库是否插入数据查看控制台输出,调试错误🎉 结语:Servlet的奇妙世界通过这个小案例,你已经掌握了Servlet的基本用法!当然,这只是一个简单的示例,实际项目中还需要考虑:密码加密存储防止SQL注入(使用PreparedStatement)会话管理(Cookie/Session)验证码功能记住我功能接下来,你可以尝试学习JSP标签库、EL表达式、JSTL等,让页面更动态!也可以研究Spring MVC等框架,简化Servlet的开发流程。记住,实践是检验真理的唯一标准,多动手写代码,你会越来越熟练!
2025年03月20日
30 阅读
0 评论
3 点赞
2025-03-18
JSP历险记:与数据库谈场"恋爱"——JDBC连接全攻略
序章:当Web程序遇上"数据焦虑"各位小伙伴好呀~今天咱们要聊的可是JavaWeb开发里的"灵魂伴侣"——JDBC数据库连接!想象一下这个场景:你兴冲冲地写了个网页程序,用户输入了姓名年龄,结果数据只能存在内存里,服务器一重启就"失忆"了。是不是像极了金鱼脑男友?这时候就需要给咱们的Web程序找个"持久化"的另一半啦!第一章:JDBC的前世今生在远古的Java 1.0时代,程序员们想要操作数据库可费劲了——每个数据库厂商都有自己的驱动API,写套MySQL代码换个Oracle就得全盘重构。直到Sun公司推出JDBC(Java Database Connectivity),就像给数据库世界制定了"普通话"标准。现在不管是MySQL、Oracle还是SQLite,统统都能用同一套API搞定,是不是突然感觉代码"兼容性"buff叠满了?📌 技术冷知识: JDBC其实是个"翻译官",它把Java代码翻译成数据库能听懂的SQL方言。不同数据库的JDBC驱动就像不同国家的翻译,虽然语言不同,但接口是统一的。第二章:搭建"相亲"环境工欲善其事必先利其器,咱们先来准备三件套:数据库:推荐新手村必备MySQL(毕竟免费又好用),记得装个图形化工具如Navicat(或者JetBrains家的DataGrip甚至IDEA已经内置了,学生可以去看我之前的免费JetBrains全家桶教育免费的申请教程: 【JetBrains正版激活】IDEA正版软件学生免费获取,申请指南 ),操作起来像在数据库里"逛街"驱动包:去MySQL官网下载最新JDBC驱动(现在叫Connector/J),就像给程序装个"翻译器": https://downloads.mysql.com/archives/c-j/ 在页面选择对应的驱动版本根据你的数据库版本而定,MySQL8.0后的数据库驱动程序请选择后缀带8.x的驱动,我这里用的是MySQL 5.7所以还是选择后缀5.x的驱动版本 😀 注意,这里下载下来的是一个独立的压缩包,解压后找到驱动对应名字的jar包,一般是有两个的,选带bin后缀的jar包复制进项目lib目录开发环境:Eclipse/IDEA任选,推荐IDEA(智能提示简直开挂)💡 安装小剧场: 把驱动jar包放进项目的WEB-INF/lib目录时,记得要"右键→Add as Library",不然就像给程序准备了满汉全席却忘了递筷子~第三章:JDBC连接五部曲(带弹幕解说版)Step1:加载驱动(破冰环节)Class.forName("com.mysql.jdbc.Driver"); // 新版驱动类名变了哦,别记错"身份证号",8.0以后的驱动是com.mysql.cj.jdbc.Driver // 弹幕:驱动类加载失败?检查MySQL版本是否匹配!这行代码就像给数据库寄了封介绍信,告诉它:"有个Java程序想认识你~"Step2:建立连接(初次约会)String url = "jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC"; String user = "root"; String password = "123456"; Connection conn = DriverManager.getConnection(url, user, password); // 弹幕:连接超时?检查防火墙是否放行3306端口! // 弹幕:时区报错?在url里明确指定serverTimezone=Asia/ShanghaiURL就像约会地点,记得把mydb改成你的数据库名。时区设置是常见坑点,就像跨国恋要倒时差~Step3:创建Statement(准备话题)Statement stmt = conn.createStatement(); // 弹幕:Statement有两种类型:TYPE_SCROLL_INSENSITIVE(可滚动)和TYPE_FORWARD_ONLY(默认)Statement就像聊天时的"开场白",接下来要说什么SQL语句由它传递。Step4:执行SQL(深入交流)// 查询示例(带分页) ResultSet rs = stmt.executeQuery("SELECT * FROM users LIMIT 10 OFFSET 20"); while(rs.next()) { String name = rs.getString("name"); int age = rs.getInt("age"); // 弹幕:列名不存在?检查数据库字段名是否匹配! // 弹幕:结果集遍历要用next()方法,不能用for循环! } // 更新示例(带事务) conn.setAutoCommit(false); try { stmt.executeUpdate("UPDATE users SET age=26 WHERE name='小王'"); stmt.executeUpdate("INSERT INTO logs VALUES('年龄更新')"); conn.commit(); } catch (SQLException e) { conn.rollback(); }ResultSet就像数据库返回的"情书",用next()方法逐行读取,是不是像极了拆盲盒?Step5:关闭资源(礼貌告别)// 传统写法(容易漏关) rs.close(); stmt.close(); conn.close(); // 现代写法(try-with-resources,自动关闭) try (Connection conn = DriverManager.getConnection(url, user, password); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql)) { // 操作代码 } // 自动关闭资源 // 弹幕:关闭顺序要反过来:ResultSet→Statement→Connection第四章:常见"翻车"现场(带解决方案)ClassNotFoundException:🔍 检查驱动包是否在WEB-INF/lib🔍 检查驱动类名是否正确(MySQL8+用com.mysql.cj.jdbc.Driver)🔍 是否执行了Class.forName()加载驱动?Access denied for user:🔑 检查用户名密码是否正确🔑 登录MySQL执行SELECT user,host FROM mysql.user,确认用户有远程访问权限🔑 尝试用GRANT ALL PRIVILEGES ON mydb.* TO 'root'@'%'授权SSL连接问题:🔒 在URL中添加useSSL=false🔒 或者配置MySQL的SSL证书(生产环境推荐)中文乱码:🌐 URL添加characterEncoding=UTF-8🌐 确保数据库、表、字段都设置为utf8mb4🌐 连接后执行SET NAMES utf8mb4ResultSet关闭异常:💡 使用try-with-resources自动关闭💡 单独关闭时检查是否为null第五章:进阶玩法(感情升温)PreparedStatement防SQL注入:String sql = "SELECT * FROM users WHERE name = ? AND age > ?"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1, userInput); // 索引从1开始! pstmt.setInt(2, 18); // 弹幕:参数化查询就像给SQL语句戴"安全套" // 弹幕:预编译语句还能提升性能(数据库会缓存执行计划)连接池优化(以HikariCP为例):# 配置文件:src/main/resources/hikari.properties dataSourceClassName=com.mysql.cj.jdbc.MysqlDataSource dataSource.url=jdbc:mysql://localhost:3306/mydb dataSource.user=root dataSource.password=123456 maximumPoolSize=10HikariConfig config = new HikariConfig("/hikari.properties"); HikariDataSource ds = new HikariDataSource(config); Connection conn = ds.getConnection(); // 弹幕:连接池就像给数据库"排班",避免频繁创建销毁连接 // 弹幕:HikariCP是目前最快的连接池,Spring Boot默认使用事务管理(实战版):conn.setAutoCommit(false); Savepoint svpt = conn.setSavepoint("updateStart"); try { // 转账操作 stmt.executeUpdate("UPDATE accounts SET balance=balance-100 WHERE id=1"); stmt.executeUpdate("UPDATE accounts SET balance=balance+100 WHERE id=2"); conn.commit(); } catch (SQLException e) { conn.rollback(svpt); // 回滚到保存点 // 处理异常... } // 弹幕:保存点就像游戏存档,可以部分回滚 // 弹幕:默认隔离级别是REPEATABLE_READ,可能需要根据业务调整第六章:实战演练(约会实战)任务:做个简单用户管理系统,包含增删改查功能步骤:建表SQL:CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL, age INT, create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;JSP页面(list.jsp):<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <table> <tr><th>ID</th><th>姓名</th><th>年龄</th><th>操作</th></tr> <c:forEach items="$" var="user"> <tr> <td>$</td> <td>$</td> <td>$</td> <td> <a href="edit.jsp?id=$">编辑</a> <a href="delete?id=$">删除</a> </td> </tr> </c:forEach> </table> <a href="add.jsp">新增用户</a>Servlet代码(UserServlet.java):@WebServlet("/user") public class UserServlet extends HttpServlet { private static final String URL = "jdbc:mysql://localhost:3306/mydb?useSSL=false"; private static final String USER = "root"; private static final String PASS = "123456"; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String action = request.getParameter("action"); Connection conn = null; try { conn = DriverManager.getConnection(URL, USER, PASS); if ("list".equals(action)) { listUsers(conn, request, response); } else if ("delete".equals(action)) { deleteUser(conn, request, response); } } catch (SQLException e) { throw new ServletException("数据库错误", e); } finally { if (conn != null) try catch (SQLException ignore) } } private void listUsers(Connection conn, HttpServletRequest request, HttpServletResponse response) throws SQLException, ServletException, IOException { Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM users"); List<User> userList = new ArrayList<>(); while (rs.next()) { userList.add(new User( rs.getInt("id"), rs.getString("name"), rs.getInt("age") )); } request.setAttribute("userList", userList); request.getRequestDispatcher("list.jsp").forward(request, response); } // 其他方法(add/edit/delete)类似... }🛠️ 调试技巧:在catch块里打印完整异常堆栈:e.printStackTrace()使用IDEA的Database工具直接查看数据库变化在SQL语句前加SELECT NOW()测试连接是否成功用Postman测试RESTful接口🎯 性能优化建议:查询时使用SELECT id,name FROM users代替SELECT *对频繁查询的字段(如name)加索引使用连接池管理数据库连接考虑使用缓存(如Redis)存储热点数据结语:与数据库的"长久之计"通过JDBC连接数据库就像谈场细水长流的恋爱:开始时要小心翼翼建立连接,过程中要妥善处理各种异常,最后还要优雅地关闭资源。随着技术深入,你会遇到ORM框架(如MyBatis、Hibernate),就像给这场恋爱找个"红娘",让数据操作变得更优雅高效。但无论如何,理解JDBC原理都是打好JavaWeb基础的关键一课。快去动手实践吧!遇到问题记得回来看看这篇笔记,咱们下期聊聊Servlet~ 🚀
2025年03月18日
15 阅读
0 评论
3 点赞
2024-10-25
【CTF WriteUp】2024年NSSCTF秋季招新赛(校外赛道)部分WEB题解题WriteUp
前言近期也是很幸运的接触到了网安领域,大一的时候就听说那时网安方向就业还比较不错,而且很有趣,但一直没有深入了解更别提学习了,正好前段时间九月底学校突然推了个网络安全技术大赛,一开始还以为就是那种写写选择题的,心想着去混混看,结果开赛前一周主办方发来文件的时候一看一个不吱声,30%理论考试70%靠CTF,直接就是一个懵逼 😭 但毕竟都报名了这不是打退堂鼓的时候,寻思着就硬着头皮上吧,从来没接触过这些东西的小小白也是比赛前两天开始跟着一众师傅的足迹摸爬滚打学了点基础功,发现其实还蛮有意思的。但网安学习可不是一两天的事情,太多基础功和基础中的基础需要补了,无奈还有主业在身,只能靠时间慢慢沉淀一些了。前些阵子正好瞥见NSSCTF平台开了个新生赛,难得碰上(NSSCTF真的很棒,不黑不吹,至少VIP真的很划算,工坊内容真的也很精细 😁 顺带一提我临时抱佛脚就是追着NSSCTF里的一众师傅的WP学习的)就参加了一下打了一天(师傅们别骂啦,我是菜鸡 😱 ),但是有一说一,我来写这个WP并不是因为我厉害,至是顺带记录一下我的 解题 摸鱼过程,一定还有很多优秀师傅的解题WP更加精细完美de! 😘概况介绍本篇WP记录的是一部分WEB题(较简单)的解题,还有很多我做不出来呜呜呜 😭 有一些题目甚至是“投机取巧”靠运气得来,另外杂项部分也有几题WP可能考虑后期再发一篇,总之各位师傅就当个乐子看就好啦,当然如果有师傅原意指导一下didi真的感激不尽!!! 😘部分WEB解题WriteUp接下来就是正片了,请各位师傅看乐子:题目1:The future开启环境后进入页面,直接就是看源代码了:一看一个不吱声,总感觉有诈,但是看代码确实没啥明显猫腻,而且分值不高所以直接传个flie参数试试?那就直接根目录下flag吧,结果直接就出来了,这运气哈哈哈哈,一般flag都会出现在根目录下,而且一般是“flag”、“f1ag”这样的命名,不过感觉实际思路应该不是这样的,但是运气嘛,就是这样,此题完结 😉题目2:ez_sql随便丢个参数提交看看结果,因为看题目名字是个sql相关的猜测是sql注入,但是参数提交的时候感觉有点不对味,变字符串了,而且没特殊符号,应该是加密了,分析一下,可以看到是16进制加密,本来想着用sqlmap梭哈但是玩不来(纯小丑了哈哈哈),还是人工尝试吧直接手动构造payload检查是否存在SQL注入:查询框输入2' order 2#虽然少输入了一个by但是弄巧成拙发现直接暴露了sql语句,那现在就好办了,直接手动构造确定四列,直接构造联合查询payload:99' union select version(),@@version_compile_os,database(),user()#为了让我们的联合查询值正确显示出来不被前面的正常数据覆盖,我们选择直接查询一个不存在的id,例如99,成功返回我们需要的目标:此方案可行,并且是root权限用户,先看看数据库还有哪些表,因此我们直接将其他参数改成需要的内容比如查询数据表等,构造联合查询查看ctf内的数据表:99' union select null,null,table_name,table_schema from information_schema.tables where table_schema= 'ctf'#发现flag表,猜解数据表: 成功拿到了数据表内的两个字段:直接查询id和data:99' union select 1,2,id,data from flag#拿下!:还算是很常规的SQL注入漏洞了,基础功打好就可以套公式做出来咯 😁题目3:PHP躲猫猫开启环境进入页面就看到一条提示语让我们传NSS参数值:开局就是让我们随便传NSS尝试使用GET传任意值NSS,发现还不够,再加上POST传NSS,这下可以了,让我们看geifile.php,直接打开发现是一部分源代码,根据源代码逻辑分别构造ATM和CTF参数真不愧是躲猫猫打开hello.php空页面既然都说在f1ag.php里面我们就直接打开看看,结果发现404页面,淦!被逗了!!!这里因为是直接include NSS值,所以不需要管下面那个if NSS=I love CTF了,还记得上面那个hello.php访问是空的吗?直接用PHP伪协议试试:NSS=php://filter/read=convert.base64-encode/resource=hello.php成功拿到一段Base64加密字符串表示的源码内容:PD9waHAgDQokZjFhZ2ZpbGU9J2YxYWflnKguL2YxYWcucGhw6YeM6Z2i77yM5b+r5Y67SW5jbHVkZeeci+eci+WQp++8jOWlh+aAqu+8jOS4uuS7gOS5iOi/mOimgeWGjeivtOS4gOmBje+8jOiOq+S4jeaYr+iXj+S6huS7gOS5iCc7DQovL0luIHRoZSBmdXR1cmUsQ1ZFLTIwMjQtMjk2MSBmaWxlX2dldF9jb250ZW50cygpOiBsZmkgdG8gUkNFLiBEb250IGtvbncgPyBZIHdpbGwga29udy5Hb29kIGx1Y2t5LCBzbWFydCBsaXR0bGUgaGFja2VyDQo=直接拿去解密看看是什么<?php $f1agfile='f1ag在./f1ag.php里面,快去Include看看吧,奇怪,为什么还要再说一遍,莫不是藏了什么'; //In the future,CVE-2024-2961 file_get_contents(): lfi to RCE. Dont konw ? Y will konw.Good lucky, smart little hacker 好像还是没有什么很特别的信息,就只告诉我们是文件包含漏洞,我们试着使用data协议执行ls命令:NSS=data://text/plain/;base64,PD9waHAgc3lzdGVtKCJscyIpPz4=无回显,这下是真gg,现在唯一的线索就是从hello.php中的注释:CVE-2024-2961,看起来还是个很新的漏洞,直接去查一下这个漏洞相关信息:以下内容来自【FreeBUF@知道创宇404实验室】原文地址:CVE-2024-2961 漏洞分析 - FreeBuf网络安全行业门户近期,Linux GLIBC的库函数iconv缓冲区溢出漏洞(CVE-2024-2961)的细节/PoC被公开,目前已知的利用方式是可以让PHP的任意文件读取漏洞升级的远程命令执行漏洞。本文将对公开的漏洞细节和PHP利用思路进行分析研究。1 ICONV漏洞详情CVE-2024-2961本质上是GLIBC中iconv库的漏洞,我认为该漏洞的发现巧合性很大。该漏洞的发现者是通过fuzz php发现该漏洞的,如果单纯的fuzz iconv库是无法导致crash,就算是fuzz php,一般情况下就算触发了该漏洞也很难导致crash。补充(PWN佬狂喜):缓冲区溢出是二进制安全研究领域里很常见的漏洞.所谓缓冲区溢出是指当一段程序尝试把更多的数据放入一个缓冲区,数据超出了缓冲区本身的容量,导致数据溢出到被分配空间之外的内存空间,使得溢出的数据覆盖了其他内存空间的数据.攻击者可以利用缓冲区溢出修改计算机的内存,破坏或控制程序的执行,导致数据损坏、程序崩溃,甚至是恶意代码的执行。缓冲区溢出攻击又分为栈溢出、堆溢出、格式字符串溢出、整数溢出、Unicode溢出.基本原理就是 iconv 在转换 ISO-2022-CN-EXT 时出现越界写入,iconv 是 php://filter/ 使用过滤器时会使用的函数.据原作者描述该漏洞影响PHP 7.0.0 (2015) 到 8.3.7 (2024)近十年php版本的任何php应用程序(Wordpress、Laravel 等)。PHP的所有标准文件读取操作都受到了影响:file_get_contents()、file()、readfile()、fgets()、getimagesize()、SplFileObject->read()等。文件写入操作同样受到影响(如file_put_contents()及其同类函数).关于该漏洞的其他利用场景:原作者提出了PHP-MySQL注入到RCE,XXE到RCE,phar的替代品,new $_GET'cls';,文件读取反序列化(unserialize())也可以利用CVE-2024-2961这个漏洞将其升级为远程代码执行。总之,只要能控制文件读取或写入端点的前缀,就可能实现远程代码执行(RCE),具体可以看原作者博客。国内师傅还提出了可以用来绕过disable_functions。不是哥们,这...是不是有点太变态了,140分的web题都这样玩是吧?直接摆烂做法,既然名字叫f1ag,那就直接伪协议碰碰运气,直接查根目录下的/f1ag.php,没有输出,再试试/f1ag,得到一串字符串:TlNTQ1RGezI1ZmJmODkzLWIxMWEtNDEyNi05YjM0LTRkMGU2NGRmM2MwMX0K Base64解码: NSSCTF行了,这辈子真是有了,咳咳,都说运气是实力的一部分,此题完结. 😆题目4:UploadBaby为数不多的即经典又简单的文件上传题:可恶的前端不让我传world马很经典的前端验证绕过上传题,直接无脑BP抓包修改就行,随便点个文件上传,发现限JPG文件:写好一句话🐎,这里用剑蚁经典一句话,写好后改名后缀jpg并在BP浏览器内开启拦截执行上传操作:拦截后改后缀为PHP放行:观察页面,很明显上传成功:直接拿到地址连接剑蚁或者直接post传参,接着就是经典ls+cat组合拳了:毫不费力拿下分数 😋题目5:怎么多了个没用的PHP文件描述:notion.php 是一个没啥用的php文件,不知道被设计出来是干什么的,出题人傻啦?(这个题目当时解题没截图,抱歉了只能暂时文字说明了)咋一看页面和上面一个前端验证一模一样,难道是出题人真傻了?显然不是,同样的套路不会出现两次,既然上一个是前端验证,那这一个很可能就是后端验证了,尝试上传一些常见/不常见php文件后缀,都被拦截了,很明显不是这样。出题人特意提醒了有个“没用的php文件”显然不是真的没用,我们访问一下这个页面发现是空白页,肯定也不是直接从这个文件上上手,这个时候我突然想到一个问题,就是所有上传文件都是直链,而且至是限制了一些可执行文件的上传,那么我们思考一下web服务器机制,当我们上传了一个站点的完整文件的时候这个upload目录岂不是就成了一个站点目录?再想想出题人虽然不让我们上传一个php文件但是允许我们上传其他文件,我们试试ini文件是否被ban,结果意料之中上传成功。那这个时候我们就可以利用站点配置文件的特性了 “当站点任意php被执行时都会检查当前站点的 .user.ini 内的配置并应用” ,那我们就可以通过在 .user.ini 里写入一项包含配置让所有php被执行时都会插入我们的目标内容:auto_prepend_file=abc.txt我们在abc.txt内写入PHP一句话木马,分别上传txt文件和这个ini文件,再访问notion.php,尝试使用ls指令:成功!!!直接cat flag!:此题完结!(说实话这题确实是考的有点刁了哈哈哈一开始差点没想出来 😂 )剩下几题要么是没做出来要么是没截图就没发啦!后期有机会再写wp吧。感谢各位师傅观看,不足之处还请批评指正呐 😜 祝各位师傅遇啥啥会,蒙都全对!
2024年10月25日
231 阅读
0 评论
12 点赞
2024-10-11
在Windows上的PHP+MySQL环境搭建与调试
前言近期由于需要完成一项数据库课程设计,无奈学校给出的大纲案例过于经典(图书馆借阅系统、学生信息管理系统...)对于这样过于经典和老套的项目完全提不起兴趣,那寻思就自己选一个项目吧;做高级的东西水平不够,即便现在是AI时代,选题AI应用是一个很不错的方向,如果只是制作一个壳子,那数据库依赖似乎不够高,似乎有点偏离初衷了;如果做大型数据分析处理那水平也就不够用了(毕竟短期还是要拿出成果的)于是思来想去,最终把目标定在了PHP+MySQL制作一个在线视频课程学习平台。 说到PHP+MySQL这套组合我可实在是太喜欢了,主打一个方便快捷,即便是在当今的2024年,这套技术栈依然广受欢迎,喜欢折腾建站的朋友们一定非常清楚这一点(当然未来就不好说了,毕竟现在Go、Node.js等越来越受欢迎了),我也一样,在早期接触建站时为了快捷大多数非专业玩家都会选择使用一些集成面板等平台来可视化管理服务器(大多数Linux上的)这就导致很多朋友在面对在Windows上开发与调试严重缺乏经验,还好这不算什么大问题,毕竟人都是在不断学习的,俺也一样,那么现在就讲讲在配置Windows上的PHP+MySQL上的步骤和经验吧~下载环境/依赖本套开发调试环境是WEB的PHP+MySQL,那么PHP和MySQL肯定是必须要下载的,除此之外还需要安装一个网页服务器,全球综合最受欢迎的是Apache,当然除此之外还可以选择NGINX等提供web服务,此处我们选择Apache作为web服务器来配置,相关链接如下: Apache下载(使用Apache Lounge):https://www.apachelounge.com/download/PHP7.2下载(windows专属php):https://windows.php.net/download/MySQL下载(分两种,社区版8.0以上可以使用安装器安装,但是低版本似乎只有二进制安装了):https://downloads.mysql.com/archives/community/VC环境下载(Apache依赖VC环境部分windows用户可能系统并没有安装,可以先装一下以便后期的测试):现在我们得到了除了VC之外的三个环境包zip文件,httpd是Apache、mysql、php,我们分别解压在不同的目录中,注意绝对路径中不要包含中文和空格以防其他的错误。接下来就是分别配置和启动啦!配置&启用MySQL我使用的版本是MySQL 5.7.44,解压压缩包后在根目录下创建一个 my.ini 文件:填入以下内容:[client] # 设置mysql客户端默认字符集 default-character-set=utf8 [mysqld] # 设置3306端口 port=3306 character_set_server=utf8 # 解压目录 basedir=D:\xxx\mysql-5.7.44-winx64 # 解压目录下data目录 datadir=D:\xxx\mysql-5.7.44-winx64\data default-storage-engine=INNODB sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES [WinMySQLAdmin] D:\xxx\mysql-5.7.44-winx64\bin\mysqld.exe 写好ini文件后保存,在系统环境变量中配置一下mysql的bin目录路径并保存(系统环境变量如何配置此处不赘述),接下来右键Windows徽标(开始按钮)开启一个Windows PowerShell(管理员),注意一定是要管理员权限的Shell!!!这里不用CMD管理员是因为部分Windows管理员CMD无法切换目录导致操作不便,而且powershell更贴近Linux操作风格,使用会更习惯。接下来我们使用管理员shell进行操作:我们使用cd进入mysql安装目录(注意powershell需要使用双引号包裹路径),使用 mysql -install 安装mysql,输出成功信息后,使用 mysql --initialize --console 初始化mysql,成功后会在最后输出root用户默认密码(注意最后一整串字符串都是密码包括“;”等特殊符号!!!)接着我们可以启动mysql服务了!,使用 net start mysql 启动服务,启动成功后通过 mysql -u root -p 登陆root用户可以看到登录成功:这里再提一嘴我在折腾时候遇到的问题吧,由于之前学java是时候使用过mysql,但已经过去一年多了早忘记了mysql密码了,按照网上的修改密码方法好像没折腾成功反而导致mysql服务异常了,后来干脆直接删掉重装,最后解决,所以如果你也曾经安装了mysql并且忘记了密码,并且没啥重要数据推荐也是直接重装就行。安装&配置Apache+PHP这里为什么会把Apache和PHP配置放一起,原因很简单,因为Apache的配置需要与PHP关联,所以就放一起说咯; 先进入PHP安装目录,复制一份 php.ini-development 文件,改名为 php.ini 保存在根目录,打开编辑:[PHP] engine = On # 启动引擎 short_open_tag = Off # 关闭短标签 max_input_time = 60 memory_limit = 128M error_reporting = E_ALL # 错误报告开启全部提示 post_max_size = 2048M # POST 最大文件大小 default_mimetype = "text/html" default_charset = "UTF-8" # 默认文件编码 extension_dir = "./" extension_dir = "D:/PHPEnv/PHP74/ext" # PHP 插件路径 enable_dl = Off upload_max_filesize = 2048M # 上传最大文件大小 max_file_uploads = 20 #启用常见扩展(包括项目需要是扩展记得也开启,一般默认ini已经有了但是默认是被注释的,删掉前面的“;”符号即可启用) extension=curl extension=fileinfo extension=gd2 extension=mbstring extension=mysqli extension=pdo_mysql extension=sockets [Date] date.timezone = Asia/Shanghai # 默认时区设置(中国上海) [mail function] SMTP = localhost smtp_port = 25 mail.add_x_header = Off [mbstring] mbstring.language = Chinese # 检查字数语言(中文) 这里只是列出了一些常用需要关注的地方,完整的INI文件有大量可配置数据,这些有需要时再去另外了解即可,php配置文件完成后进入Apache安装目录进行Apache配置,进入Apache安装目录下的conf目录下打开httpd.conf文件,同样我们只关注重点需要配置修改的项目:# Apache24.conf file # General Settings Define SRVROOT "D:/PHPEnv/Apache24" # 定义Apache 根目录 ServerRoot "$" ServerName localhost # 服务名 Define ENABLE_TLS13 "Yes" Listen 80 # 监听80端口,如果被占用可以使用 8080 端口 # PHP74 Config # PHP 8.0 修改为 php8apache2_4.dll LoadModule php_module "D:/PHPEnv/PHP74/php7apache2_4.dll" # 定义 PHP7 模块路径 AddType Application/x-httpd-php .php # 添加 PHP格式 PHPIniDir "D:/PHPEnv/PHP74" #定义 PHP 根目录 <Directory /> # 具体配置含义参考其他文章 AllowOverride all Options Indexes FollowSymLinks Require all granted </Directory> <Directory "H:/WWW"> # 定义网站根目录 AllowOverride all Options Indexes FollowSymLinks Require all granted </Directory> <IfModule dir_module> #默认解析执行的页面 DirectoryIndex index.html index.php index.htm </IfModule> <Files ".ht*"> Require all granted </Files> # Virtual hosts Include conf/extra/httpd-vhosts.conf # 启用虚拟主机文件,当然如果不是同时调试多站点其实也可以不需要这个 既然说到了虚拟主机配置,那就这里也贴一下虚拟主机配置吧(在Apache安装目录下的/extra/httpd-vhosts.conf):<VirtualHost *:80> ServerAdmin localhost DocumentRoot "H:/WWW" ServerName localhost <Directory "H:/WWW"> Options Indexes FollowSymLinks Includes ExecCGI </Directory> </VirtualHost> 配置完成后使用shell进入Apache的bin目录下,如果没有配置环境变量可以直接使用 ./httpd -t,显示 Syntax OK 说明配置无误,接着就可以安装启动Apache服务了,使用 ./httpd -k install -n Apache24 进行安 装,-n 后面跟服务名(可以自己定义),不填默认为 Apache2.4,成功后使用 net start Apache24 启动服务:接下来只需要在默认目录创建一个php文件内写入 <?php phpinfo(); ?> 后访问这个页面,出现phpinfo页面就大功告成啦!
2024年10月11日
270 阅读
0 评论
9 点赞
2024-09-24
宿舍夏日神器!不如自己动手DIY一台?THC1-12706a+Arduino制作mini小冷箱
近段时间持续的高温天气对于身处学校宿舍的大学牲们来说简直带来了诸多不便,众所周知许多学生宿舍因安全问题不允许使用大功率设备,冰箱这样的大型用电器更是如此,前段时间刷B站时偶然发现仙人指路(B站UP主:垃圾研究社)出了一期全站热门TOP100的视频——一个关于自制小冰箱的升级版视频,看着动人的数据NianSir也是自然跃跃欲试了,初步了解基础组件后也是火速下单了,至于原版的“小冰箱”具体数据和参数大伙可以去B站UP主那看看他的视频或者笔记,由于学生宿舍不让用冰箱,那咱们只好做做功率100W不到的mini“小冷箱”玩玩了~ 😜 在开始操作之前,还是要再重申一遍: 安全第一,本文章仅做参考,请在确保安全的前提下进行实验!!! 😇 首先贴一张完整成品图(泡沫箱除外):开始DIY!本实验采用半导体制冷片THC1-12706a作为制冷源(12V 6A优质款),电脑电源+转接板进行供电,相对于B站UP主“垃圾研究社”提供的方案根据实际情况进行了一个升级优化,主要体现在:冷端风扇改用更大转速的 防水 风扇(9000r 防水IP68),可以根据实际情况选择稍微低一些的转速和防水等级(我是为了省事哈哈哈哈 😂 )使用单片机(开发板)+温湿度传感器进行智能控制,明显优化了冷端结冰问题序号名称参数1电源长城网星600 400w2PC电源转接板选择带12v接出的转接板即可3制冷片THC1-12706A 12V 6A4热端散热6铜管散热架+风扇5冷端冷风40x40mm散热板+小风扇6T2紫铜板4~5cm宽 0.1mm7继电器3.3v单路直流电(3.3VDC)8开发板合宙Air0019传感器AHT20+BMP280温湿度模块10导热硅脂GD900 2-3小包即可11泡沫箱推荐小、中型泡沫箱,最好带一些保温内壁啥的📌 各个组件中的注意事项:电源 :极不推荐使用手机快充/笔记本快充电源,这些快充电源不适合长时间提供大功率,存在极大的安全隐患!慎用,推荐使用电脑/服务器电源,至于选择多大功率我的建议是整套设备的工作功率不超过电源额定功率的60%,这样电源工作也不会有很大压力(讲人话就是电源不怎么发热 😋 )电源转接板 :不会从PC电源接12V电的同学必备,或者为了省事推荐直接买一个,PC电源一般都是输出12V电,所以转接板只要买带12V的接出就行,当然为了日后深入学习也可以选用和我一样的3.3V~24V转接板,或者也可以去咸鱼或者其他平台找服务器电源,也有不少已经帮你接好取电板的电源卖,贴一张我的取电板,大概13元左右:制冷片 :12V方案推荐选用优质款也就是127006A,这款制冷片是目前12V供电里效果最好的制冷片,价格也不高,大概11元左右:热端散热 :根据“垃圾研究社”提供的数据使用6铜管散热器达到的制冷效果最好,但是在12V方案实际情况中似乎有点顶配了用不上这么多哈哈哈,不过为了深度学习改进还是推荐用6铜管散热塔吧,推荐买那种送风扇的,价格40元左右冷端冷风 :原版“垃圾研究社”方案采用的是4010小风扇,但是实际情况下这款风扇的转速太低,导致中性泡沫箱的制冷效果明显降低(风小,另外也是加剧冷端结冰的情况的原因之一)T2紫铜板 :进一步优化热端散热,置于热端散热架和制冷片热端之间,中间要有导热硅脂,略贵,大概2块1片:继电器 :选择3.3VDC的单路继电器即可(开发板控制电路是3.3V,如果你的开发板带其他电压也可以用其他电压的继电器)开发板 :由于使用Arduino开发,因此选用较低成本方案的国产合宙品牌的Air001单片机,其开发板大约10元。传感器 :考虑成本和品质问题,不选择DH11模块(这个模块真的心累,精度低,库还大)而选择更具性价比的AHT20+BMP280模块(直接可高精度测温湿度+大气压强,超爽的好吧 😚 ),仅仅只需大概4元导热硅脂 :这个其实没什么很特别的要求,普通的硅脂就可以上但是为了追求更极致的性能还是选择了GD900这款导热系数较高的硅脂,单价大概0.4元一小包泡沫箱 :泡沫箱就没什么好说的了,省钱可以跟水果店啥的要一个小的,不过还是推荐买个10来块的高密度泡沫箱,再买点保温内壁材料啥的具体用料可以根据实际情况酌情调整(前提是你明白这样做的后果 😎 )接线与组装这一部分其实感觉没什么必要单独拿出来介绍,但是为了记录完整性咱还是再多啰嗦几句吧~ 😉 先说说电源这边接线,怼上插口即可,接电板连接PC电源的PIN24(插主板的那个最长的排线)即可,具体可以翻到上面瞅一眼成品图就知道了。再说说制冷端这边,将热端散热架倒置在桌面上,撕掉塑料保护膜,按照以下步骤组装(注意电线一端最好都放在同一边,方便整理):涂抹导热硅脂放置T2紫铜板涂抹导热硅脂放置制冷片(注意热端和冷端,不要搞反了,有字的那面是冷端)涂抹导热硅脂放置冷端散热架(注意方向,有凹槽的一侧要用于固定)穿线固定(可以选择用尼龙扎带或者其他方案固定)最后就是智能控制电路这边了,单片机除了接控制继电器不需要加入工作电路所以就不介绍单片机接线了,在下一部分的控制程序设计部分会介绍如何接引脚;智能控制就是为了优化原版制冷工作一段时间后会结冰导致冷端风扇异响甚至损坏问题,通过继电器控制一定条件下暂停制冷片工作(但风扇不会停止工作),所以其实原理也很简单,就是给制冷片的工作电路接入继电器控制即可,在原版接线情况下在制冷片工作电路负极线上接入继电器,也就是剪断制冷片电路负极线,然后将两端连接在继电器的COM口和NO口上即可,建议在断口镀锡以保障线路更安全稳定:智能控制程序设计接下来就是最关键也是改进版最核心的特色了——智能控制好吧其实也没有说的那么高大上,就是通过单片机对制冷片的一个开关罢了哈哈哈 😂 上面也已经提到了我们采用的是合宙Air001开发板(真的不是广告QAQ 合宙快给我打¥ 😭 )当然有条件的同学也可以选择arduino r3之类的开发板,甚至是根据这个思路选择STM32开发等等,如果仅仅只是想跟着做一下这个小冷箱那就按部就班吧 😉 Arduino IDE怎么下载安装配置这里就不讲了,网上一堆教程,至于如果用合宙Air001开发板怎么配置IDE,请移步官方文档:https://wiki.luatos.com/chips/air001/Air001-Arduino.html这里就不赘述了,直接放代码(引入的两个库不是自带的,但是可以直接在IDE下载,编译方式要选择 Smallest -Os with LTO 因为同时监测温湿度和大气压的库写进开发板真的已经很极限了):#include <AHT20.h> #include <Adafruit_BMP280.h> AHT20 aht; Adafruit_BMP280 bmp; const byte relayPin = PA13; const short MaxRunTime = 600; const char hi_message[] PROGMEM = "Hi, IcyBox A1 use Air001 MUC."; short runC=0; void setup() { pinMode(PB_0, OUTPUT); pinMode(relayPin, OUTPUT); Serial.begin(9600); aht.begin(); bmp.begin(); Serial.println(hi_message); } void loop() { runC++; digitalWrite(PB_0, HIGH); // 读AHT20数据 byte temperature_aht = aht.getTemperature(); byte humidity_aht = aht.getHumidity(); if (!isnan(temperature_aht) && !isnan(humidity_aht)) { Serial.print("T: "); Serial.print(temperature_aht); Serial.println(" °C"); Serial.print("H: "); Serial.print(humidity_aht); Serial.println(" %"); } else { } if(runC > MaxRunTime || temperature_aht <= 5){ //关闭制冷片 Serial.println("LOW"); digitalWrite(relayPin, LOW); delay(80000);//延时80s runC=0; }else if(temperature_aht>6){ //启动制冷片 Serial.println("HIGH"); digitalWrite(relayPin, HIGH); } // 读BMP280数据 short pressure_bmp = bmp.readPressure() / 100; short altitude_bmp = bmp.readAltitude(1013.25); Serial.print("P: "); Serial.print(pressure_bmp); Serial.println(" hPa"); Serial.print("A: "); Serial.print(altitude_bmp); Serial.println(" meters"); digitalWrite(PB_0, LOW); delay(2000); }如果还是写不进去提示溢出那就把大气压的部分删了吧 😥 毕竟大气压的部分确实没用上,这个代码主要作用就是在运行600次后(大概3s一次)或者箱内温度小于等于5摄氏度时,让制冷片歇80s,这样可以有效解决冷端结冰现象,代码中的 relayPin 就是接到继电器控制线的引脚,我是接了PA13,可根据实际情况设定,传感器就使用默认的I2C引脚即可(在Air001上是PF00和PF01,分别接SDA和SCL,供电的VCC\VDD就接开发板的3.3V口即可GND接GND)当然如果对于这样的控制逻辑不满意/想实现更多高级功能就慢慢摸索吧 😀 比如说使用ESP8266作为开发板,再加入一些小OLED屏啥的还能做成可以远程监控和控制的Pro小冷箱 😍 好了,关于DIY mini小冷箱的制作就先写这么多了,如果有更有趣的方案/疑问欢迎博客/公众号私信留言 😋 感谢支持!
2024年09月24日
184 阅读
2 评论
17 点赞
2024-09-05
记一次Vue-CLI安装遇到的问题及解决方案
前言在前端开发中,Vue.js是一种流行的JavaScript框架,而Vue CLI是Vue.js的官方脚手架工具,用于快速搭建Vue.js项目。然而,在使用Vue CLI进行安装的过程中,有时会遇到各种问题,本篇文章将记录我在安装Vue CLI过程中遇到的问题以及解决方案,希望能够帮助到其他同志。 😀 为了更贴合生产环境(大多数是Linux系统)我选择了Git Bash作为操作终端,这样可以直接使用Linux指令进行操作,不过Windows自带的PowerShell同样可以执行大部分的Linux指令大家根据喜好自行选择就好; 😋 首先,我们确保电脑已经正确安装配置了Node.js(前置条件),如果没有下载安装可以直接前往官网下载:https://nodejs.org/zh-cn 选择TLS稳定版本即可,由于本篇文章主要解决Vue-CLI的安装问题,因此node.js具体安装中的选项等此处不赘述,有疑问可以在网上查阅其他优秀博主的文章。问题复现——终端使用npm指令安装无响应/失败确保安装好Node.js后我们可以在终端输入 node -v 检查是否成功返回node.js版本号,成功返回则表示安装配置成功。 接下来我们使用npm指令(npm在安装Node.js的时候就会默认安装)进行Vue-cli的全局安装,使用以下指令:npm install -g @vue/cli接下来发现Git Bash终端长时间无响应/进度变化,初步猜测npm官方源无法正常连通,果断切换到其他国内镜像,使用以下指令切换npm默认源:设置源: npm config set registry http://mirrors.cloud.tencent.com/npm/ 验证当前使用的源: npm config get registry 另外附常用优秀镜像地址: npm官方原始镜像:https://registry.npmjs.org 淘宝 NPM 镜像:https://registry.npmmirror.com 阿里云 NPM 镜像:https://npm.aliyun.com 腾讯云 NPM 镜像:https://mirrors.cloud.tencent.com/npm 华为云 NPM 镜像:https://mirrors.huaweicloud.com/repository/npm 网易 NPM 镜像:https://mirrors.163.com/npm 中科院大学开源镜像站:http://mirrors.ustc.edu.cn 清华大学开源镜像站:https://mirrors.tuna.tsinghua.edu.cn发现切换源后再次执行vue-cli安装指令报错,提示没找到这个目标,去浏览器检查了这几个源站发现镜像源基本都没有vue-cli,同时意外发现npm官方源其实可以访问,再次尝试使用npm安装指令,依然无效 😥 :$ npm install vue-cil@2.9.x -g npm ERR! code ECONNRESET npm ERR! syscall read npm ERR! errno ECONNRESET npm ERR! network request to https://registry.npmjs.org/vue-cil failed, reason: read ECONNRESET npm ERR! network This is a problem related to network connectivity. npm ERR! network In most cases you are behind a proxy or have bad network settings. npm ERR! network npm ERR! network If you are behind a proxy, please make sure that the npm ERR! network 'proxy' config is set properly. See: 'npm help config' npm ERR! A complete log of this run can be found in: C:\xxxxxx\npm-cache\_logs\2024-09-05T01_52_19_802Z-debug-0.log 猜测是npm官方源中的下载地址无法连通, 😂 果断放弃npm方案,之前偶然了解到cnpm是一个npm的替代方案,指令和npm一样但是更好用,尝试通过cnpm解决。使用CNPM替代NPM执行首先通过npm安装cnpm,这个各大镜像都有同步,大家选一个访问速度还行的就行,这里我使用了阿里源:npm install -g cnpm -registry=http://registry.npmmirror.com成功安装:added 1 package in 25s使用 cnpm -v 检查是否成功安装:$ cnpm -v cnpm@9.4.0 (D:\xxx\v21.7.0\node_modules\cnpm\lib\parse_argv.js) npm@9.9.2 (D:\xxx\v21.7.0\node_modules\cnpm\node_modules\npm\index.js) node@21.7.0 (C:\Program Files\nodejs\node.exe) npminstall@7.12.0 (D:\xxx\v21.7.0\node_modules\cnpm\node_modules\npminstall\lib\index.js) prefix=C:\Program Files\nodejs win32 x64 10.0.19045 registry=https://registry.npmmirror.com发现成功输出,说明cnpm安装成功,接下来就可以使用cnpm替代npm指令进行操作了,同样我们直接全局安装vue-cli,仅需将之前的指令中的npm替换成cnpm即可:cnpm install -g @vue/cli接下来会下载大约35个mod并完成安装,等待安装完成后我们进入我们的项目目录执行下面的命令构建一个新的Vue项目 😃 (注意项目名字母只能小写):vue create demo01过程中需要按几次yes/回车,最后成功创建:(node:43144) [DEP0040] DeprecationWarning: The `punycode` module is deprecated. Please use a userland alternative instead. (Use `node --trace-deprecation ...` to show where the warning was created) ? Your connection to the default yarn registry seems to be slow. ? Your connection to the default yarn registry seems to be slow. Use https://registry.npmmirror.com for faster installation? Yes ? Please pick a preset: (Use arrow keys) ? Please pick a preset: Default ([Vue 3] babel, eslint) ? Pick the package manager to use when installing dependencies: (Use arrow keys) ? Pick the package manager to use when installing dependencies: Yarn ✨ Creating project in E:\CodeProject\HTML\VueDemo\Test01\demo01. 🗃 Initializing git repository... ⚙️ Installing CLI plugins. This might take a while... yarn install v1.22.22 info No lockfile found. [1/4] Resolving packages... [2/4] Fetching packages... [3/4] Linking dependencies... [4/4] Building fresh packages... success Saved lockfile. Done in 28.14s. 🚀 Invoking generators... 📦 Installing additional dependencies... yarn install v1.22.22 [1/4] Resolving packages... [2/4] Fetching packages... [3/4] Linking dependencies... [4/4] Building fresh packages... success Saved lockfile. Done in 8.00s. ⚓ Running completion hooks... 📄 Generating README.md... 🎉 Successfully created project demo01. 👉 Get started with the following commands: $ cd demo01 $ yarn serve 使用指令进入项目目录并启动项目:#进入项目目录 cd demo01 #启动项目服务 cnpm run serve启动后即可通过本地8080端口访问(默认) 😊 :> demo01@0.1.0 serve > vue-cli-service serve INFO Starting development server... DONE Compiled successfully in 7089ms13:52:53 App running at: - Local: http://localhost:8080/ - Network: http://192.168.0.xxx:8080/ Note that the development build is not optimized. To create a production build, run yarn build. 使用浏览器打开地址:通过以上解决方法,我们成功解决了在安装Vue CLI时遇到的网络连接问题,顺利完成了安装过程。在前端开发中,遇到问题是很常见的,关键在于如何找到并解决问题。希望这篇博客能够帮助到其他朋友;以上就是我在安装Vue CLI过程中遇到的问题及解决方案的记录。如果你有类似问题或其他技术困惑,欢迎留言交流讨论。您还可以通过微信公众号“NianSir年先生”交流学习更多~感谢支持!
2024年09月05日
235 阅读
0 评论
10 点赞
1
2
...
5