gitlab对/api/v4/可泄露敏感信息处理

文章介绍了如何通过编辑Nginx服务器配置文件,使用vim命令来限制特定IP对GitLabAPI的访问,包括deny和allow规则,并展示了重新加载GitLab服务的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

vim /etc/gitlab

在最末尾添加
nginx['custom_gitlab_server_config'] = "location /api/v4 {
                deny all;}\n"

重新加载gitlab

gitlab-ctl reconfigure

附:限制ip访问操作


nginx['custom_gitlab_server_config'] = "location ~* (.*) {
                deny 192.168.2.109;
                allow 192.168.2.0/24;
                deny all;
                proxy_cache off;
                proxy_pass  http://gitlab-workhorse;
                root   html;
                index  index.html index.htm;}\n"

const express = require('express'); const session = require('express-session'); const bodyParser = require('body-parser'); const db = require('./db'); const path = require('path'); const http = require('http'); const https = require('https'); const app = express(); const PORT = 4000; // 静态资源目录(前端页面、js、css等放这里) // 这里如果你有静态资源放在 static 或者 public 目录,请根据实际调整 app.use('/static', express.static(path.join(__dirname, 'static'))); // 如果 styles.css 也在当前目录,可以改成这样暴露: app.use(express.static(__dirname)); // 使用 session 中间件 app.use(session({ secret: 'your-secret-key', resave: false, saveUninitialized: true, cookie: { maxAge: 24 * 60 * 60 * 1000 } // 一天过期 })); app.use(bodyParser.urlencoded({ extended: false })); // 登录验证中间件 const requireLogin = (req, res, next) => { if (req.session.loggedIn) { next(); } else { // 未登录,重定向回登录页 res.redirect('/'); } }; // 根路径,根据登录状态发送不同页面 app.get('/', (req, res) => { if (req.session.loggedIn) { res.sendFile(path.join(__dirname, 'home.html')); // 修改这里 } else { res.sendFile(path.join(__dirname, 'login.html')); // 修改这里 } }); // 登录处理 app.post('/login', (req, res) => { const { username, password } = req.body; const sql = 'SELECT * FROM users WHERE username = ? AND password = ?'; db.query(sql, [username, password], (err, results) => { if (err) { console.error(err); return res.status(500).send('服务器错误'); } if (results.length > 0) { req.session.loggedIn = true; req.session.username = results[0].username; // 拼音用户名 req.session.name = results[0].name; // 中文真实姓名 res.redirect('/'); } else { res.send(`<script>alert("用户名或密码错误"); window.location = "/";</script>`); } }); }); // 获取当前登录用户信息接口 app.get('/api/username', requireLogin, (req, res) => { const sql = 'SELECT username, name FROM users WHERE username = ?'; db.query(sql, [req.session.username], (err, results) => { if (err || results.length === 0) { return res.status(500).json({ error: '查询失败' }); } const user = results[0]; res.json({ username: user.username, name: user.name }); }); }); // 退出登录 app.get('/logout', (req, res) => { req.session.destroy(() => { res.redirect('/'); }); }); // 内置 HTTP GET 请求封装函数 function httpGet(url, headers = {}) { return new Promise((resolve, reject) => { const lib = url.startsWith('https') ? https : http; const options = new URL(url); options.headers = headers; lib.get(options, (res) => { res.setEncoding('utf8'); let data = ''; res.on('data', chunk => { data += chunk; }); res.on('end', () => { if (res.statusCode >= 200 && res.statusCode < 300) { try { const json = JSON.parse(data); resolve(json); } catch (err) { reject(new Error('响应解析失败:' + err.message)); } } else { reject(new Error(`请求失败,状态码:${res.statusCode},信息:${res.statusMessage}`)); } }); }).on('error', err => { reject(err); }); }); } // 代理GitLab合并请求数据接口,必须登录 app.get('/api/gitlab/merge_requests', requireLogin, async (req, res) => { try { const state = req.query.state || 'merged'; const scope = req.query.scope || 'all'; // 默认获取所有范围 const gitlabUrl = 'http://10.20.24.40/api/v4'; const projectId = 'qh/qh'; const privateToken = 'glpat-MyrEkJTz7yEPKheyNds4'; let allMergeRequests = []; let page = 1; const perPage = 100; let hasMore = true; while (hasMore) { const encodedProjectId = encodeURIComponent(projectId); const url = `${gitlabUrl}/projects/${encodedProjectId}/merge_requests?scope=${scope}&state=${state}&page=${page}&per_page=${perPage}`; const mergeRequests = await httpGet(url, { 'PRIVATE-TOKEN': privateToken }); allMergeRequests = allMergeRequests.concat(mergeRequests); if (mergeRequests.length < perPage) { hasMore = false; } else { page++; } } res.json(allMergeRequests); } catch (error) { console.error('GitLab数据获取失败:', error); res.status(500).json({ error: '服务器内部错误,获取GitLab数据失败' }); } }); // 启动服务器 app.listen(PORT, '0.0.0.0', () => { console.log(`✅ Server running at http://0.0.0.0:${PORT}`); }); 后端代码
06-15
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

javachen__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值