记录一次localhost被劫持

本文记录了一位用户在Manjaro操作系统中遇到的localhost连接问题,该问题导致连接请求被重定向至一个新加坡的谷歌云IP。通过检查hosts文件、使用nslookup及清DNS缓存等步骤,发现问题出在resolv.conf文件被NetworkManager修改。通过修改resolv.conf并锁定文件,问题得到解决。但系统重启后文件又被还原,日志显示NetworkManager是改动文件的源头。

相关环境

操作系统: Manjaro

发现经过

某天安装的mariadb死活连接不上.
ping localhost 发现自动跳转到一个陌生的ip (74.125.68.121) ,对应一个新加坡的谷歌云
这个ip刚好被GWF墙掉了,所以没有造成任何其他后果,感谢GWF.

调查过程

hosts 文件正常(通过改hosts暂时可以正常使用localhost了)
使用nslookup查看

nslookup localhost 180.76.76.76
Server:		180.76.76.76
Address:	180.76.76.76#53

Non-authoritative answer:
Name:	localhost.my
Address: 74.125.68.121

尝试清dns缓存,重启 这个localhost.my仍然存在
尝试用以前用python做的dns服务脚本劫持本地请求,发现53端口始终被占用

sudo netstat -tnlp | grep 53 
tcp        0      0 127.0.0.1:53            0.0.0.0:*               LISTEN      905/dnsmasq

ArchWiki上查了下这个dnsmasq
找到配置文件位置

cat /etc/resolvconf.conf 
# Configuration for resolvconf(8)
# See resolvconf.conf(5) for details
resolv_conf=/etc/resolv.conf
# If you run a local name server, you should uncomment the below line and
# configure your subscribers configuration files below.
#name_servers=127.0.0.1

cat /etc/resolv.conf   
# Generated by NetworkManager
search my
nameserver 127.0.0.1
options edns0 trust-ad

resolv.conf这个文件里出现了一行search my ???
参考大佬的resolv.conf文件解读

nameserver //定义DNS服务器的IP地址
domain //定义本地域名
search //定义域名的搜索列表
sortlist //对返回的域名进行排序

注释掉头尾 只保留nameserver 127.0.0.1 一行并保存
ps -aux | grep dnsmasq
找到dnsmasq的pid并用root权限kill掉(它会自动重启)
再次nslookup

nslookup localhost 
Server:		127.0.0.1
Address:	127.0.0.1#53

** server can't find localhost: NXDOMAIN

破案了, 问题就出在这个 resolv.conf文件被修改

后续

重启后resolv.conf文件又变回原来的样子
再次修改后上个锁

sudo chattr +i /etc/resolv.conf

那么是啥玩意儿动了我的resolv.conf文件呢?
由于之前被加上了+i属性,修改没有成功生效 那么日志中应该会产生错误信息
使用journalctl 搜索日志
果然找到了这样一行

manjaro NetworkManager[346]: <warn>  [1617778086.7635] dns-mgr: could not commit DNS changes: 将文件“/etc/resolv.conf.ZAS700”重命名为“/etc/resolv.conf”失败:g_rename() 失败:不允许的操作

继续搜索NetworkManager 找到如下

manjaro NetworkManager[344]: <info>  [1617778109.4189] NetworkManager (version 1.30.0-1) is starting... (for the first time)
manjaro NetworkManager[344]: <info>  [1617778109.4190] Read config: /etc/NetworkManager/NetworkManager.conf (lib: 20-connectivity.conf)

待续未完…

<think>嗯,用户想让我介绍一下如何写一个PHP后台登录界面。首先,我需要确定用户的需求是什么。他们可能是一个刚开始学习PHP的开发者,想要了解如何构建一个基本的登录系统。用户可能对PHP、HTML、CSS和MySQL有一定的了解,但需要具体的步骤指导。 接下来,我得考虑登录界面需要哪些基本元素。通常,一个登录界面包括用户名和密码的输入框,提交按钮,以及可能的前端验证。然后,后端需要处理表单数据,验证用户信息,防止SQL注入,以及会话管理。这些都是关键点,必须涵盖。 然后,我需要分步骤来组织回答。首先应该是前端部分,用HTML和CSS构建界面。然后是PHP处理表单的逻辑,包括连接数据库、查询用户、验证密码等。还要提到安全性,比如使用预处理语句防止SQL注入,密码哈希处理,以及使用HTTPS和验证码等增强措施。 可能会遇到的问题包括用户输入验证不严格,或者密码没有正确哈希处理。需要提醒用户避免使用md5这样的弱哈希,而是用password_hash。另外,会话管理也很重要,确保用户登录后能维持会话,同时防止会话劫持。 用户可能没有提到的深层需求是安全性,他们可能想要一个不仅能用,而且安全的登录系统。所以需要强调安全措施,比如预处理语句、密码哈希、HTTPS等。此外,可能需要扩展功能,比如记住我、密码重置等,但作为基础介绍,这些可以作为后续建议。 最后,确保结构清晰,逐步引导用户从前端到后端,再到安全增强,让整个流程容易理解。同时,代码示例要简洁,符合PHP的最佳实践,比如使用PDO连接数据库,避免旧的mysql扩展。</think>我将分步骤为您讲解如何开发一个安全的PHP后台登录界面: 一、基础HTML结构(前端界面) ```html <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>后台管理系统登录</title> <style> .login-box { width: 400px; margin: 100px auto; padding: 20px; border: 1px solid #ddd; border-radius: 5px; } .form-group { margin-bottom: 15px; } input { width: 100%; padding: 8px; } </style> </head> <body> <div class="login-box"> <h2>管理员登录</h2> <form method="POST"> <div class="form-group"> <label>用户名:</label> <input type="text" name="username" required> </div> <div class="form-group"> <label>密码:</label> <input type="password" name="password" required> </div> <button type="submit">登录</button> </form> </div> </body> </html> ``` 二、PHP登录处理逻辑(login.php) ```php <?php session_start(); // 数据库配置 $host = 'localhost'; $dbname = 'admin_db'; $user = 'root'; $pass = 'your_secure_password'; try { $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $user, $pass); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch(PDOException $e) { die("数据库连接失败: " . $e->getMessage()); } if ($_SERVER['REQUEST_METHOD'] === 'POST') { $username = trim($_POST['username']); $password = $_POST['password']; // 输入验证 if (empty($username) || empty($password)) { $error = "用户名和密码不能为空"; } else { // 查询用户 $stmt = $pdo->prepare("SELECT id, username, password FROM users WHERE username = ?"); $stmt->execute([$username]); $user = $stmt->fetch(PDO::FETCH_ASSOC); if ($user && password_verify($password, $user['password'])) { // 登录成功 $_SESSION['user_id'] = $user['id']; $_SESSION['username'] = $user['username']; header("Location: dashboard.php"); exit(); } else { $error = "用户名或密码错误"; } } } ?> ``` 三、安全增强措施 1. 密码存储:必须使用`password_hash()`加密 ```php // 注册时密码加密存储示例 $hashedPassword = password_hash($password, PASSWORD_DEFAULT); ``` 2. SQL注入防护:使用PDO预处理语句 3. 会话安全: ```php // 在session_start()后设置 ini_set('session.cookie_httponly', 1); ini_set('session.cookie_secure', 1); // 仅HTTPS session_regenerate_id(true); ``` 四、扩展建议 1. 添加验证码功能(Google reCAPTCHA) 2. 登录失败次数限制 3. 密码强度验证 4. 记住我功能(使用安全token) 5. 登录日志记录 五、部署注意事项 1. 使用HTTPS加密传输 2. 定期更换数据库密码 3. 设置文件权限(config文件设为644) 4. 错误日志记录(不要显示给用户) 完整开发流程建议: 1. 设计数据库表结构 2. 实现注册功能 3. 开发登录界面 4. 添加会话管理 5. 实现后台仪表盘 6. 添加权限管理系统 7. 编写注销功能 需要特别注意的安全规范: - 所有用户输入必须验证和过滤 - 密码必须加盐哈希存储 - 敏感操作需要二次验证 - 定期进行安全审计 - 使用CSP头防止XSS攻击 后续可扩展功能: - 双因素认证(2FA) - 密码重置功能 - 用户活动监控 - IP白名单限制 - 异常登录检测 是否需要我针对某个具体环节(如密码重置、权限管理)进行更详细的说明?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值