PHPCMS V9 登錄加密改造

要改造 phpcms 的后臺登錄,使其前端使用加密方式提交,后端解密,你可以采用 RSA 非對稱加密AES 對稱加密 方式來增強安全性。?

方案設計

  1. 前端加密

    • 生成公私鑰對(推薦使用 RSA)。
    • 前端使用公鑰加密密碼,然后提交給后端。
    • 避免明文密碼在網絡中傳輸。
  2. 后端解密

    • 后端使用私鑰解密前端傳輸的密碼。
    • 然后繼續使用原有的用戶驗證邏輯

目錄

改造前

改造好后

改造方法?


改造前

改造好后

改造方法?

# 生成私鑰
openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:2048# 生成公鑰
openssl rsa -pubout -in private_key.pem -out public_key.pem

?

?前端phpcms\modules\admin\templates\login.tpl.php

<?php defined('IN_ADMIN') or exit('No permission resources.'); ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=<?php echo CHARSET;?>" />
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
<title><?php echo L('phpcms_logon')?></title>
<style type="text/css">div{overflow:hidden; *display:inline-block;}div{*display:block;}.login_box{background:url(<?php echo IMG_PATH?>admin_img/login_bg.jpg) no-repeat; width:602px; height:416px; overflow:hidden; position:absolute; left:50%; top:50%; margin-left:-301px; margin-top:-208px;}.login_iptbox{bottom:90px;_bottom:72px;color:#FFFFFF;font-size:12px;height:30px;left:50%;
margin-left:-280px;position:absolute;width:560px; overflow:visible;}.login_iptbox .ipt{height:24px; width:110px; margin-right:22px; color:#fff; background:url(<?php echo IMG_PATH?>admin_img/ipt_bg.jpg) repeat-x; *line-height:24px; border:none; color:#000; overflow:hidden;}<?php if(SYS_STYLE=='en'){ ?>.login_iptbox .ipt{width:100px; margin-right:12px;}<?php }?>.login_iptbox label{ *position:relative; *top:-6px;}.login_iptbox .ipt_reg{margin-left:12px;width:46px; margin-right:16px; background:url(<?php echo IMG_PATH?>admin_img/ipt_bg.jpg) repeat-x; *overflow:hidden;text-align:left;padding:2px 0 2px 5px;font-size:16px;font-weight:bold;}.login_tj_btn{ background:url(<?php echo IMG_PATH?>admin_img/login_dl_btn.jpg) no-repeat 0px 0px; width:52px; height:24px; margin-left:16px; border:none; cursor:pointer; padding:0px; float:right;}.yzm{position:absolute; background:url(<?php echo IMG_PATH?>admin_img/login_ts140x89.gif) no-repeat; width:140px; height:89px;right:56px;top:-96px; text-align:center; font-size:12px; display:none;}.yzm a:link,.yzm a:visited{color:#036;text-decoration:none;}.yzm a:hover{color:#C30;}.yzm img{cursor:pointer; margin:4px auto 7px; width:130px; height:50px; border:1px solid #fff;}.cr{font-size:12px;font-style:inherit;text-align:center;color:#ccc;width:100%; position:absolute; bottom:58px;}.cr a{color:#ccc;text-decoration:none;}
</style><script src="http://zxjw.gov:800/statics/js/jsencrypt.min.js"></script><script>
document.addEventListener("DOMContentLoaded", function () {document.getElementById("loginForm").addEventListener("submit", function (event) {event.preventDefault(); // 阻止默認提交行為var username = document.getElementById("username").value;var password = document.getElementById("password").value;// 這里替換成你的 RSA 公鑰var publicKey = `-----BEGIN PUBLIC KEY----------END PUBLIC KEY-----
`;var encrypt = new JSEncrypt();encrypt.setPublicKey(publicKey);var encryptedPassword = encrypt.encrypt(password);// 通過 AJAX 提交加密后的密碼var formData = new FormData();formData.append("username", username);formData.append("password", encryptedPassword);formData.append("code", document.getElementById("code").value);formData.append("dosubmit", "1");fetch("index.php?m=admin&c=index&a=login&dosubmit=1", {method: "POST",body: formData}).then(response => response.text()).then(data => console.log(data));});
});
</script>
</head><body>
<div id="login_bg" class="login_box"><div class="login_iptbox"><form id="loginForm"><label><?php echo L('username')?>:</label><input id="username" name="username" type="text" class="ipt" value="" /><label><?php echo L('password')?>:</label><input id="password" name="password" type="text" class="ipt" value="" /><label><?php echo L('security_code')?>:</label><input id="code" name="code" type="text" class="ipt ipt_reg" onfocus="document.getElementById('yzm').style.display='block'" /><div id="yzm" class="yzm"><?php echo form::checkcode('code_img')?><br /><a href="javascript:document.getElementById('code_img').src='<?php echo SITE_PROTOCOL.SITE_URL.WEB_PATH;?>api.php?op=checkcode&m=admin&c=index&a=checkcode&time='+Math.random();void(0);"><?php echo L('click_change_validate')?></a></div><input type="submit" class="login_tj_btn" value=""/></form></div><div class="cr"><?php echo L("copyright")?></div>
</div>
</body>
</html>

后端phpcms\modules\admin\index.php

public function login() {if(isset($_GET['dosubmit'])) {// 不是口令卡驗證if (!isset($_GET['card'])) {$username = isset($_POST['username']) ? trim($_POST['username']) : showmessage(L('nameerror'), HTTP_REFERER);$code = isset($_POST['code']) && trim($_POST['code']) ? trim($_POST['code']) : showmessage(L('input_code'), HTTP_REFERER);if ($_SESSION['code'] != strtolower($code)) {$_SESSION['code'] = '';showmessage(L('code_error'), HTTP_REFERER);}$_SESSION['code'] = '';} else { // 口令卡驗證if (!isset($_SESSION['card_verif']) || $_SESSION['card_verif'] != 1) {showmessage(L('your_password_card_is_not_validate'), '?m=admin&c=index&a=public_card');}$username = $_SESSION['card_username'] ? $_SESSION['card_username'] : showmessage(L('nameerror'), HTTP_REFERER);}if (!is_username($username)) {showmessage(L('username_illegal'), HTTP_REFERER);}// 檢查密碼錯誤次數$this->times_db = pc_base::load_model('times_model');$rtime = $this->times_db->get_one(array('username' => $username, 'isadmin' => 1));$maxloginfailedtimes = getcache('common', 'commons');$maxloginfailedtimes = (int)$maxloginfailedtimes['maxloginfailedtimes'];if ($rtime['times'] >= $maxloginfailedtimes) {$minute = 60 - floor((SYS_TIME - $rtime['logintime']) / 60);if ($minute > 0) showmessage(L('wait_1_hour', array('minute' => $minute)));}// 查詢帳號$r = $this->db->get_one(array('username' => $username));if (!$r) showmessage(L('user_not_exist'), '?m=admin&c=index&a=login');// **RSA 解密密碼**$privateKey = file_get_contents("D:/phpstudy_pro/WWW/private_key.pem");$encryptedPassword = $_POST['password'];openssl_private_decrypt(base64_decode($encryptedPassword), $decryptedPassword, $privateKey);if (!$decryptedPassword) {showmessage(L('password_decrypt_error'), '?m=admin&c=index&a=login');}// 進行密碼匹配$password = md5(md5(trim($decryptedPassword)) . $r['encrypt']);if ($r['password'] != $password) {$ip = ip();if ($rtime && $rtime['times'] < $maxloginfailedtimes) {$times = $maxloginfailedtimes - intval($rtime['times']);$this->times_db->update(array('ip' => $ip, 'isadmin' => 1, 'times' => '+=1'), array('username' => $username));} else {$this->times_db->delete(array('username' => $username, 'isadmin' => 1));$this->times_db->insert(array('username' => $username, 'ip' => $ip, 'isadmin' => 1, 'logintime' => SYS_TIME, 'times' => 1));$times = $maxloginfailedtimes;}showmessage(L('password_error', array('times' => $times)), '?m=admin&c=index&a=login', 1000);}// 登錄成功,清空錯誤次數記錄$this->times_db->delete(array('username' => $username));// 口令卡驗證if (!isset($_GET['card']) && $r['card'] && pc_base::load_config('system', 'safe_card') == 1) {$_SESSION['card_username'] = $username;$_SESSION['card_password'] = $_POST['password'];header("location:?m=admin&c=index&a=public_card");exit;} elseif (isset($_GET['card']) && pc_base::load_config('system', 'safe_card') == 1 && $r['card']) {$_SESSION['card_username'] = '';$_SESSION['card_password'] = '';$_SESSION['card_verif'] = '';}// 更新最后登錄信息$this->db->update(array('lastloginip' => ip(), 'lastlogintime' => SYS_TIME), array('userid' => $r['userid']));$_SESSION['userid'] = $r['userid'];$_SESSION['roleid'] = $r['roleid'];$_SESSION['pc_hash'] = random(6, 'abcdefghigklmnopqrstuvwxwyABCDEFGHIGKLMNOPQRSTUVWXWY0123456789');$_SESSION['lock_screen'] = 0;// 設置 Cookie$default_siteid = self::return_siteid();$cookie_time = SYS_TIME + 86400 * 30;if (!$r['lang']) $r['lang'] = 'zh-cn';param::set_cookie('admin_username', $username, $cookie_time);param::set_cookie('siteid', $default_siteid, $cookie_time);param::set_cookie('userid', $r['userid'], $cookie_time);param::set_cookie('admin_email', $r['email'], $cookie_time);param::set_cookie('sys_lang', $r['lang'], $cookie_time);echo showmessage(L('login_success'), '?m=admin&c=index');// 檢查是否啟用 vms$video_setting = getcache('video', 'video');if ($video_setting['sn'] && $video_setting['skey']) {$vmsapi = pc_base::load_app_class('ku6api', 'video');$vmsapi->member_login_vms();}} else {pc_base::load_sys_class('form', '', 0);include $this->admin_tpl('login');}}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/897749.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/897749.shtml
英文地址,請注明出處:http://en.pswp.cn/news/897749.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LeetCode 滑動數組統計+至少 2962. 統計最大元素出現至少 K 次的子數組

2962. 統計最大元素出現至少 K 次的子數組 給你一個整數數組 nums 和一個 正整數 k 。 請你統計有多少滿足 「 nums 中的 最大 元素」至少出現 k 次的子數組&#xff0c;并返回滿足這一條件的子數組的數目。 子數組是數組中的一個連續元素序列。 示例 1&#xff1a; 輸入&#…

FANUC機器人幾種常用的通訊網絡及接口

FANUC機器人幾種常用的通訊網絡及接口 Devicenet 網絡通訊接口&#xff0c;接口為5針線 (規定用的機架為 81-84&#xff09; PROFIBUS 網絡通訊接口&#xff0c;針腳為2針&#xff08;規定用的機架為 67&#xff09; Intemet 網絡通訊接口&#xff08;常用的網線接口&#xf…

CentOS8+Zabbix7.2.4解決中文顯示問題

#cd /usr/share/zabbix/ui/include/ #grep graphfont defines.inc.php define(‘ZBX_GRAPH_FONT_NAME’, ‘graphfont’); // font file name define(‘ZBX_FONT_NAME’, ‘graphfont’); #ll /usr/share/zabbix/ui/assets/fonts/graphfont.ttf lrwxrwxrwx. 1 root root 36 3…

AI自動化編程初探

先說vscodeclinemodelscope方案&#xff0c;后面體驗trae或者cursor再寫寫其它的。vscode和trae方案目前來說是免費的&#xff0c;cursor要用claud需要付費&#xff0c;而且不便宜&#xff0c;當然效果可能是最好的。 vscode方案&#xff0c;我的經驗是最好在ubuntu上&#xff…

101.在 Vue 3 + OpenLayers 使用 declutter 避免文字標簽重疊

1. 前言 在使用 OpenLayers 進行地圖開發時&#xff0c;我們經常需要在地圖上添加點、線、區域等圖形&#xff0c;并給它們附加文字標簽。但當地圖上的標注較多時&#xff0c;文字標簽可能會發生重疊&#xff0c;導致用戶無法清晰地查看地圖信息。 幸運的是&#xff0c;OpenL…

18天 - 常見的 HTTP 狀態碼有哪些?HTTP 請求包含哪些內容,請求頭和請求體有哪些類型?HTTP 中 GET 和 POST 的區別是什么?

常見的 HTTP 狀態碼有哪些&#xff1f; HTTP 狀態碼用于指示服務器對客戶端請求的響應結果&#xff0c;常見的 HTTP 狀態碼可以分為以下幾類&#xff1a; 1. 信息類&#xff08;1xx&#xff09; 100 Continue&#xff1a;客戶端應繼續發送請求。101 Switching Protocols&…

IXTUR氣控永磁鐵:以高精度氣控和穩定磁場,為機器人應用提供穩定抓取力

在現代工業生產和物流領域&#xff0c;物料的抓取與搬運是影響生產效率和成本控制的重要環節。傳統夾爪在面對不同材質、形狀和重量的物體時&#xff0c;常常存在適應性差、抓取不穩定、操作復雜等問題&#xff0c;導致生產流程中頻繁出現停機調整&#xff0c;增加了人工干預成…

江科大51單片機筆記【16】AD/DA轉換(下)

寫在前言 此為博主自學江科大51單片機&#xff08;B站&#xff09;的筆記&#xff0c;方便后續重溫知識 在后面的章節中&#xff0c;為了防止篇幅過長和易于查找&#xff0c;我把一個小節分成兩部分來發&#xff0c;上章節主要是關于本節課的硬件介紹、電路圖、原理圖等理論知識…

【C++】 —— 筆試刷題day_4

刷題day_4 繼續加油&#xff01;&#xff01;&#xff01; 一、Fibonacci數列 題目鏈接&#xff1a;Fibonacci數列 題目解析 題目要求&#xff0c;輸入一個數N&#xff0c;我們可以對N進行1/-1操作&#xff1b;題目讓我們輸出對N進行至少多少步可以變成Fibonacci數。 這里題目…

IP層之分片包的整合處理---BUG修復

在之前章節中&#xff0c;筆者就IP層之分片包的整合處理進行了概念介紹&#xff0c;以及代碼編寫和仿真&#xff0c;在整體代碼調試環節&#xff0c;筆者發現了一個問題&#xff0c;在本文中&#xff0c;筆者將就這個BUG進行說明&#xff0c;以及進行修復&#xff0c;講解代碼實…

修復Electron項目Insecure Content-Security-Policy(內容安全策略CSP)警告的問題

將以下代碼粘貼進html的<header>標簽內 <metahttp-equiv"Content-Security-Policy"content"default-src self; style-src self unsafe-inline; img-src self data:; "> 解釋一下上面代碼中的屬性含義 default-src self&#xff1a;配置加載策…

linux 的免密切換用戶PAM配置

/etc/pam.d/su是Linux系統中與用戶切換&#xff08;su命令&#xff09;相關的PAM&#xff08;Pluggable Authentication Modules&#xff0c;可插拔認證模塊&#xff09;配置文件。以下是對它的詳細介紹&#xff1a; 簡介 作用 PAM是一種用于管理系統認證的機制&#xff0c;…

pyspark 數據處理的三種方式RDD、DataFrame、Spark SQL案例

目錄 一、淺語二、三種數據處理方式比較2.1 RDD2.2 DataFrame2.3 Spark SQL 三、三種方法的創建方式3.1 創建RDD3.2 創建DataFrame3.2.1 創建sqlContext3.2.2 定義Schema3.2.3 創建DataFrame 3.3 創建SparkSQL3.3.1 登錄臨時表3.3.2 使用sparkSQL 四、三種方法顯示部分字段4.1 …

文件解析漏洞靶機---- 練習通關攻略

1.安裝靶機 點擊 hackme.ova 文件&#xff0c;直接導入虛擬機&#xff0c;選擇存儲位置 2. 開啟靶機 3. kali掃描同C段的ip&#xff0c;找到靶機ip nmap 192.168.182.1/24 經判斷&#xff0c;靶機ip為&#xff1a;192.168.182.157 開啟端口 http 80 、ssh 遠程連接 22 4…

信號處理抽取多項濾波的數學推導與仿真

昨天的《信號處理之插值、抽取與多項濾波》&#xff0c;已經介紹了插值抽取的多項濾率&#xff0c;今天詳細介紹多項濾波的數學推導&#xff0c;并附上實戰仿真代碼。 一、數學變換推導 1. 多相分解的核心思想 將FIR濾波器的系數 h ( n ) h(n) h(n)按相位分組&#xff0c;每…

【大模型基礎_毛玉仁】2.3 基于 Encoder-only 架構的大語言模型

更多內容&#xff1a;XiaoJ的知識星球 目錄 2.3 基于Encoder-only 架構的大語言模型2.3.1 Encoder-only 架構2.3.2 BERT 語言模型1&#xff09;BERT 模型結構2&#xff09;BERT 預訓練方式3&#xff09;BERT 下游任務 2.3.3 BERT 衍生語言模型1&#xff09;RoBERTa 語言模型2&a…

AIP-165 按條件刪除

編號165原文鏈接https://google.aip.dev/165狀態批準創建日期2019-12-18更新日期2019-12-18 有時API需要提供一種機制&#xff0c;按照一些過濾參數刪除大量資源&#xff0c;而非提供待刪除的各資源名字。 這是一個稀有的場景&#xff0c;用于用戶一次性刪除數千或更多資源的…

【Maven教程與實戰案例】

文章目錄 前言一、Maven是什么&#xff1f;二、Maven的安裝與配置1. 安裝前置條件2. 下載與配置 Maven3. 驗證安裝 三、Maven的核心概念1. POM.xml 文件2. 構建生命周期與插件機制 四、實戰項目示例1. 項目目錄結構2. 編寫代碼App.javaAppTest.java 3. 構建項目4. 運行項目 前言…

20250310:OpenCV mat對象與base64互轉

代碼: https://github.com/ReneNyffenegger/cpp-base64 指南:https://renenyffenegger.ch/notes/development/Base64/Encoding-and-decoding-base-64-with-cpp/ 實操:

概率論的基本知識

逆概率還不懂&#xff0c;改天再想想。 聯合概率 聯合概率&#xff08;Joint Probability&#xff09; 是概率論中的一個重要概念&#xff0c;用于描述多個隨機變量同時取某些值的概率。聯合概率可以幫助我們理解多個變量之間的關系。