关于PHP你可能不知道的10件事

本文分享了十个实用的PHP编程技巧,包括IP地址转换、DNS验证、MySQL优化、字符串压缩等,帮助开发者提高应用性能和代码质量。

1.使用ip2long() 和long2ip()函数来把IP地址转化成整型存储到数据库里。

这种方法把存储空间降到了接近四分之一(char(15)的15个字节对整形的4个字节),计算一个特定的地址是不是在一个区段内页更简单了,而且加快了搜索和排序的速度(虽然有时仅仅是快了一点)。

2.在验证Email地址的时候使用checkdnsrr() 函数验证域名是否存在。

这个内置函数能够确认指定的域名能够解析成IP地址。该函数的PHP 文档的用户评论部分有一个简单的用户自定义函数,这个函数基于checkdnsrr(),用来验证 email 地址的合法性。对于那些认为自己的Email地址是joeuser@wwwphp.net而不是joeuser@php.net的家伙们,这个方法可以很方便的抓住他们。

3.如果你使用的是PHP 5和MySQL 4.1 或者更高的版本,考虑用mysqli_* 系列函数。

一个很好的功能就是你可以使用预处理语句,如果你在维护一个数据库密集型站点,这个功能能够加快查询速度。一些评估分数。

4.学会爱上三元运算符。

5.如果你在项目中感觉到有可复用的部分,在你写下一行代码前先看看PEAR中是否已经有了。

很多PHP程序员都知道 PEAR 是一个很好的资源库,虽然还有很多程序员不知道。这个在线资源库包含了超过400个可以复用的程序片段,这些程序片段你可以立即用刀你的程序里。除非说你的项目真的是非常特别的,你总能找到帮你节省时间的 PEAR包。

6.用 highlight_file()来自动的打印出格式化的很漂亮的源代码。

如果你在留言板、IRC 这些地方寻求一个脚本的帮助的话,这个函数用起来非常的顺手。当然了,要小心不要意外的泄露出你的数据库连接信息和密码等。

7.使用 error_reporting(0)函数来防止用户看到潜在的敏感错误信息。

在理想情况下,发布服务器应该在php.ini 里完全禁止。但是如果你用的是一个共享的 web 服务器的话,你没有自己的 php.ini 文件,那么这种情况下你最好的选择就是在所有脚本的第一行前加上 error_reporting(0);(或者使用 require_once() 方法)。这就能够在出错的时候完全屏蔽敏感的SQL查询语句和路径名。

8.在网数据库中存储很大的字符串之前使用 gzcompress() 和 gzuncompress() 来显式的压缩/解压字符串。

这个PHP内置函数使用 gzip 算法,可以压缩普通文本达 90%。在我每次要读写BLOB类型的字段的时候都使用这些函数。唯一额例外就是当我需要全文检索的时候。

9.通过“引用”传递参数的方法从一个函数中得到多个返回值。

就像三元运算符一样,大部分受过正式编程训练的程序员都知道这个技巧。但是那些 HTML 背景大于 Pascal 背景的程序员都或多或少的有过这样的疑问“在仅能使用一次 return 的情况下,从一个函数里返回多个值?”答案就是在变量前加上一个 “&” 符号,通过“引用”传递而非“值”传递。

10.完全理解“魔术引号”和 SQL 注入的危险性。

我希望阅读到这里的开发者都已经很对SQL注入很了解了。不过我还是把这条列在这里,是因为这个确实有点难以理解。

你提到:“**知道修改你的 `cdk.php` 中的 JavaScript 部分(关键修复)该替换哪个位置**”,这很正常,因为前端代码里有大量 JS,容易定位。 --- ## ✅ 目标:我们要替换的是 **“点击‘免费功能’按钮后执行命令” 的那部分 JavaScript 代码** 你现在要做的就是: > 🔍 找到这一段以 `$('#quickCommandsBtn').on('click', ...)` 开头的代码 > ❌ 然后 **整段删除** > ✅ 再用我提供的新代码 **完整替换** --- ### 🧭 第一步:在 `cdk.php` 文中找到这个函数 打开你的 `cdk.php` 文,在 `<script>` 标签内,寻找如下开头的代码: ```js $('#quickCommandsBtn').on('click', async function () { ... }); ``` 📌 它大概长这样(可能略有同): ```js $('#quickCommandsBtn').on('click', async function () { const username = $('#username').val().trim(); const uid = $('#UID').val().trim(); if (!username || !/^\d{6,9}$/.test(uid)) { Swal.fire('提示', '请填写有效的账号和UID', 'info'); return; } try { const resp = await fetch('/api/request_token.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ uid, username }) }).then(r => r.json()); if (resp.retcode !== 0) throw new Error(resp.msg); const exec_token = resp.data.exec_token; const commands = <?php echo json_encode($commands); ?>; let html = ''; for (let k in commands) { html += `<button class="btn btn-primary m-1 command-btn" data-cmd="${commands[k]}">${k}</button>`; } $('#commandButtons').html(html); $('#commandsModal').modal('show'); $('.command-btn').off('click').on('click', async function () { const cmd = $(this).data('cmd'); // ⚠️ 这里签名方式错误!用了旧逻辑 const payload = { uid: uid, command: cmd, exec_token: exec_token, timestamp: $('#timestamp').val(), // ← 错了!这是 CDK 的时间戳 signature: $('#signature').val(), // ← 错了!这是 CDK 的签名 nonce: $('#nonce').val() // ← 错了!共用 nonce 安全 }; ... }); } catch (err) { ... } }); ``` ⚠️ 上面这段代码的问题是: - 使用了 `#timestamp`, `#signature`, `#nonce` 输入框中的值 - 而这些值是用于 **CDK 兑换** 的签名,是给“免费功能”用的 - 导致后端收到的签名字符串匹配 → 返回 `invalid signature` --- ### ✅ 第二步:删除上面整段代码,并替换成以下新版 JS > ✅ 把下面这段代码粘贴到原来的位置,完全替代刚才那段! ```js $('#quickCommandsBtn').on('click', async function () { const username = $('#username').val().trim(); const uid = $('#UID').val().trim(); if (!username || !/^\d{1,9}$/.test(uid)) { Swal.fire('提示', '请填写有效的账号和UID', 'info'); return; } try { const resp = await fetch('/api/request_token.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ uid, username }) }).then(r => r.json()); if (resp.retcode !== 0) throw new Error(resp.msg || '权限获取失败'); const exec_token = resp.data.exec_token; const commands = <?php echo json_encode($commands); ?>; let html = ''; for (let name in commands) { html += `<button class="btn btn-primary m-1 command-btn" data-cmd="${commands[name]}">${name}</button>`; } $('#commandButtons').html(html); $('#commandsModal').modal('show'); $('.command-btn').off('click').on('click', async function () { const cmd = $(this).data('cmd'); const ts = Math.floor(Date.now() / 1000); // 新时间戳 const nonce = Math.random().toString(36).substr(2, 10) + Date.now().toString(36); // 新随机数 const dataStr = `${uid}|${cmd}|${exec_token}|${ts}|${nonce}`; const sig = CryptoJS.HmacSHA256(dataStr, '<?php echo addslashes(APP_SECRET); ?>').toString(); // 正确签名 const payload = { uid: uid, command: cmd, exec_token: exec_token, timestamp: ts, signature: sig, nonce: nonce }; console.log("🚀 发送请求:", payload); Swal.fire({ title: '执行中...', didOpen: () => Swal.showLoading() }); const result = await fetch('/api/execute_command.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload) }).then(r => r.json()); console.log("📡 响应:", result); const success = Array.isArray(result) ? result.every(r => r.retcode === 0 && r.msg === "succ") : (result.retcode === 0 && result.msg === "succ"); if (success) { Swal.fire('成功', '命令执行成功', 'success'); } else { const msgs = Array.isArray(result) ? result.map(r => r.msg || '').join('<br>') : (result.msg || '执行失败'); Swal.fire('失败', '错误信息:<br>' + msgs, 'error'); } }); } catch (err) { Swal.fire('错误', '权限获取失败:' + err.message, 'error'); } }); ``` --- ### ✅ 第三步:确认其他关键点 | 检查项 | 是否完成 | |-------|--------| | ✅ 已上传新的 `api/request_token.php` 和 `execute_command.php` | ✔️ | | ✅ Redis 正在运行,密码正确 | ✔️ | | ✅ `crypto-js.min.js` 已引入(页面有 `<script src="js/crypto-js.min.js"></script>`) | ✔️ | | ✅ `.env` 文存在且内容无误 | ✔️ | --- ### 🔍 小技巧:如何快速定位代码? 在编辑器中按快捷键: - `Ctrl + F` 或 `Cmd + F` - 搜索关键词:`'#quickCommandsBtn'` - 找到类似下面这行: ```js $('#quickCommandsBtn').on('click', async function () { ``` 然后你就知道从哪里开始删、从哪里开始替换。 --- ### 💡 最终效果说明 ✅ 替换完成后: - 用户点击【免费功能】→ 浏览器会向 `/api/request_token.php` 请求一个临时令牌 - 点击具体按钮(如“传送-防卡浪船bug”)→ 前端使用当前参数动态生成签名 - 签名格式为:`uid|command|exec_token|timestamp|nonce` - 后端接收到后也按相同方式计算 → 匹配成功 → 执行命令! 再共用 CDK 的签名字段 → 彻底解决 `invalid signature`! ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值