首页
直播
壁纸
免责声明
更多
统计
关于
Search
1
一款自动化渗透工具包 TscanPlus
225 阅读
2
获取一张美国虚拟信用卡
223 阅读
3
JS Document.evaluate()的使用
199 阅读
4
Git冲突:Please commit your changes or stash them before you merge
176 阅读
5
Python 31条 pip 命令全解析
164 阅读
默认分类
操作系统
Linux
管理面板
实用工具
开发语言
PHP
Web
python
typecho
ThinkPHP
layui
爬虫
文章分享
登录
Search
标签搜索
python
php
web
linux
Git
js
requests
自动化
宝塔
thinkphp
Centos
adb
html
typecho
layui
jquery
ubuntu
multipass
虚拟机
thikphp
YiYun
累计撰写
54
篇文章
累计收到
21
条评论
首页
栏目
默认分类
操作系统
Linux
管理面板
实用工具
开发语言
PHP
Web
python
typecho
ThinkPHP
layui
爬虫
文章分享
页面
直播
壁纸
免责声明
统计
关于
搜索到
54
篇与
的结果
2024-05-10
git-stash用法小结
缘起今天在看一个bug,之前一个分支的版本是正常的,在新的分支上上加了很多日志没找到原因,希望回溯到之前的版本,确定下从哪个提交引入的问题,但是还不想把现在的修改提交,也不希望在Git上看到当前修改的版本(带有大量日志和调试信息)。因此呢,查查Git有没有提供类似功能,就找到了git stash的命令。综合下网上的介绍和资料,git stash(git储藏)可用于以下情形:发现有一个类是多余的,想删掉它又担心以后需要查看它的代码,想保存它但又不想增加一个脏的提交。这时就可以考虑git stash。使用git的时候,我们往往使用分支(branch)解决任务切换问题,例如,我们往往会建一个自己的分支去修改和调试代码, 如果别人或者自己发现原有的分支上有个不得不修改的bug,我们往往会把完成一半的代码commit提交到本地仓库,然后切换分支去修改bug,改好之后再切换回来。这样的话往往log上会有大量不必要的记录。其实如果我们不想提交完成一半或者不完善的代码,但是却不得不去修改一个紧急Bug,那么使用git stash就可以将你当前未提交到本地(和服务器)的代码推入到Git的栈中,这时候你的工作区间和上一次提交的内容是完全一样的,所以你可以放心的修Bug,等到修完Bug,提交到服务器上后,再使用git stash apply将以前一半的工作应用回来。经常有这样的事情发生,当你正在进行项目中某一部分的工作,里面的东西处于一个比较杂乱的状态,而你想转到其他分支上进行一些工作。问题是,你不想提交进行了一半的工作,否则以后你无法回到这个工作点。解决这个问题的办法就是git stash命令。储藏(stash)可以获取你工作目录的中间状态——也就是你修改过的被追踪的文件和暂存的变更——并将它保存到一个未完结变更的堆栈中,随时可以重新应用。git stash用法1. stash当前修改git stash会把所有未提交的修改(包括暂存的和非暂存的)都保存起来,用于后续恢复当前工作目录。比如下面的中间状态,通过git stash命令推送一个新的储藏,当前的工作目录就干净了。$ git status On branch master Changes to be committed: new file: style.css Changes not staged for commit: modified: index.html $ git stash Saved working directory and index state WIP on master: 5002d47 our new homepage HEAD is now at 5002d47 our new homepage $ git status On branch master nothing to commit, working tree clean 需要说明一点,stash是本地的,不会通过git push命令上传到git server上。实际应用中推荐给每个stash加一个message,用于记录版本,使用git stash save取代git stash命令。示例如下:$ git stash save "test-cmd-stash" Saved working directory and index state On autoswitch: test-cmd-stash HEAD 现在位于 296e8d4 remove unnecessary postion reset in onResume function $ git stash list stash@{0}: On autoswitch: test-cmd-stash2. 重新应用缓存的stash可以通过git stash pop命令恢复之前缓存的工作目录,输出如下:$ git status On branch master nothing to commit, working tree clean $ git stash pop On branch master Changes to be committed: new file: style.css Changes not staged for commit: modified: index.html Dropped refs/stash@{0} (32b3aa1d185dfe6d57b3c3cc3b32cbf3e380cc6a)这个指令将缓存堆栈中的第一个stash删除,并将对应修改应用到当前的工作目录下。你也可以使用git stash apply命令,将缓存堆栈中的stash多次应用到工作目录中,但并不删除stash拷贝。命令输出如下:$ git stash apply On branch master Changes to be committed: new file: style.css Changes not staged for commit: modified: index.html3. 查看现有stash可以使用git stash list命令,一个典型的输出如下:$ git stash list stash@{0}: WIP on master: 049d078 added the index file stash@{1}: WIP on master: c264051 Revert "added file_size" stash@{2}: WIP on master: 21d80a5 added number to log在使用git stash apply命令时可以通过名字指定使用哪个stash,默认使用最近的stash(即stash@{0})。4. 移除stash可以使用git stash drop命令,后面可以跟着stash名字。下面是一个示例:$ git stash list stash@{0}: WIP on master: 049d078 added the index file stash@{1}: WIP on master: c264051 Revert "added file_size" stash@{2}: WIP on master: 21d80a5 added number to log $ git stash drop stash@{0} Dropped stash@{0} (364e91f3f268f0900bc3ee613f9f733e82aaed43)或者使用git stash clear命令,删除所有缓存的stash。5. 查看指定stash的diff可以使用git stash show命令,后面可以跟着stash名字。示例如下:$ git stash show index.html | 1 + style.css | 3 +++ 2 files changed, 4 insertions(+)在该命令后面添加-p或--patch可以查看特定stash的全部diff,如下:$ git stash show -p diff --git a/style.css b/style.css new file mode 100644 index 0000000..d92368b --- /dev/null +++ b/style.css @@ -0,0 +1,3 @@ +* { + text-decoration: blink; +} diff --git a/index.html b/index.html index 9daeafb..ebdcbd2 100644 --- a/index.html +++ b/index.html @@ -1 +1,2 @@ +<link rel="stylesheet" href="style.css"/>6. 从stash创建分支如果你储藏了一些工作,暂时不去理会,然后继续在你储藏工作的分支上工作,你在重新应用工作时可能会碰到一些问题。如果尝试应用的变更是针对一个你那之后修改过的文件,你会碰到一个归并冲突并且必须去化解它。如果你想用更方便的方法来重新检验你储藏的变更,你可以运行 git stash branch,这会创建一个新的分支,检出你储藏工作时的所处的提交,重新应用你的工作,如果成功,将会丢弃储藏。$ git stash branch testchanges Switched to a new branch "testchanges" # On branch testchanges # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: index.html # # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # # modified: lib/simplegit.rb # Dropped refs/stash@{0} (f0dfc4d5dc332d1cee34a634182e168c4efc3359)这是一个很棒的捷径来恢复储藏的工作然后在新的分支上继续当时的工作。7. 暂存未跟踪或忽略的文件默认情况下,git stash会缓存下列文件:添加到暂存区的修改(staged changes)Git跟踪的但并未添加到暂存区的修改(unstaged changes)但不会缓存一下文件:在工作目录中新的文件(untracked files)被忽略的文件(ignored files)git stash命令提供了参数用于缓存上面两种类型的文件。使用-u或者--include-untracked可以stash untracked文件。使用-a或者--all命令可以stash当前目录下的所有修改。至于git stash的其他命令建议参考Git manual。小结git提供的工具很多,恰好用到就可以深入了解下。更方便的开发与工作的。原文出处:https://www.cnblogs.com/tocy/p/git-stash-reference.html
2024年05月10日
88 阅读
0 评论
0 点赞
2024-05-10
git stash Documentation
名称git-stash - 将变化藏在一个脏工作区中概述git stash list [<日志选项>] git stash show [-u | --include-untracked | --only-untracked] [<差异选项>] [<暂存>] git stash drop [-q | --quiet] [<暂存>] git stash pop [--index] [-q | --quiet] [<暂存>] git stash apply [--index] [-q | --quiet] [<暂存>] git stash branch <分支名> [<暂存>] git stash [push [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q | --quiet] [-u | --include-untracked] [-a | --all] [(-m | --message) <信息>] [--pathspec-from-file=<文件> [--pathspec-file-nul]] [--] [<路径规范>…]] git stash save [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q | --quiet] [-u | --include-untracked] [-a | --all] [<信息>] git stash clear git stash create [<信息>] git stash store [(-m | --message) <信息>] [-q | --quiet] <提交>描述当你想记录工作目录和索引的当前状态,但又想回到一个干净的工作目录时,请使用git stash。 该命令将你的本地修改保存起来,并将工作目录还原为与HEAD提交相匹配。这个命令所存储的修改可以用git stash list列出,用git stash show检查,用git stash apply恢复(可能是在不同的提交之上)。 在没有任何参数的情况下调用git stash等同于git stash push。 默认情况下,储藏库被列为 "WIP on branchname …",但你可以在创建储藏库时在命令行中给出更多描述性信息。你最近创建的储藏库被保存在refs/stash中;旧的储藏库可以在这个引用的引用日志中找到,并且可以使用通常的引用日志语法来命名(例如,stash@{0}是最近创建的储藏库,stash@{1}是它之前的储藏库,stash@{2.hours.ago}也是可以的)。也可以通过指定储藏库的索引来引用储藏库(例如,整数n等同于stash@{n})。命令push [-p|--patch] [-S|--staged] [-k|--[no-]keep-index] [-u|--include-untracked] [-a|--all] [-q|--quiet] [(-m|--message) <信息>] [--pathspec-from-file=<文件> [--pathspec-file-nul]] [--] [<路径规范>…]将你的本地修改保存到一个新的 "存储条目 "中,并将它们回滚到 HEAD(在工作区和索引中)。 <信息>部分是可选的,它给出了描述和储藏的状态。为了快速制作快照,你可以省略 "push"。 在这种模式下,非选项参数是不允许的,以防止拼写错误的子命令产生不需要的储藏条目。 这方面的两个例外是stash -p,它作为stash push -p的别名,以及为消除歧义允许在双连字符--之后的路径规范元素。save [-p|--patch] [-S|--staged] [-k|--[no-]keep-index] [-u|--include-untracked] [-a|--all] [-q|--quiet] [<信息>]该选项已被弃用,改为 "git stash push"。 它与 "stash push "的不同之处在于,它不能接受路径规范。 取而代之的是,所有非选项的参数都被串联起来,形成储藏消息。list [<日志选项>]列出你目前拥有的储藏目录。 每个 "储藏目录 "都列出了它的名字(例如,stash@{0}是最新的条目,stash@{1}是之前的条目,等等),条目产生时的分支名称,以及该条目所基于的提交的简短描述。stash@{0}: WIP on submit: 6ebd0e2...更新 git-stash 文档 stash@{1}: On master: 9cc0589... 添加 git-stash该命令采用适用于 git log 命令的选项来控制显示的内容和方式。参见 [git-log[1]](https://git-scm.com/docs/git-log/zh_HANS-CN) 。show [-u|--include-untracked|--only-untracked] [<diff选项>] [<储藏目录>]显示贮藏中记录的修改,作为贮藏内容与贮藏库条目首次创建时的提交之间的差异。 默认情况下,该命令显示diff统计,但它会接受 "git diff "已知的任何格式(例如,git stash show -p stash@{1}以补丁形式查看第二条最新条目)。 如果没有提供<diff选项>,默认行为将由stash.showStat和stash.showPatch配置变量给出。你也可以使用stash.showIncludeUntracked来设置是否默认启用--include-untracked`。pop [--index] [-q|--quiet] [<暂存>]从贮藏库列表中移除一个单一的贮藏状态,并将其应用于当前工作区状态之上,也就是做git stash push的逆向操作。工作目录必须与索引匹配。应用状态可能会因为冲突而失败;在这种情况下,它不会被从贮藏库列表中删除。你需要手动解决冲突,并在之后调用 git stash drop。apply [--index] [-q|--quiet] [<暂存>]和 pop 一样,但不从贮藏库列表中删除该状态。与pop不同,<贮藏项>可以是任何看起来像由stash push或stash create创建的提交。branch <分支名> [<贮藏项>]创建并检查一个名为 <分支名> 的新分支,从最初创建 <贮藏项> 的提交开始,将 <贮藏项> 中记录的修改应用到新的工作树和索引。 如果成功了,并且<贮藏项>是stash@{<版本>}形式的引用,那么它将删除<贮藏项>。如果你运行 git stash push 的分支发生了足够的变化,以至于 git stash apply 因冲突而失败,那么这就很有用。由于贮藏条目是在运行 git stash 时的 HEAD 提交之上应用的,它没有冲突地恢复了最初的贮藏状态。清除删除所有的贮藏条目。直接切断任何联系,而且可能无法恢复(可能的策略见下面的 "例子")。Drop [-q|--quiet] [<贮藏项>]从贮藏条目列表中删除一个单一的贮藏条目。create创建一个贮藏条目(这是一个普通的提交对象),并返回其对象名称,而不将其存储在引用命名空间的任何地方。 这是为了对脚本有用。 你可能不想用这个命令;可以看看前面的 "push"。保存将通过’git stash create'(这是一个悬空的合并提交)创建的特定贮藏库存储在贮藏库引用中,更新贮藏库参考文件。 这是为了对脚本有用。 这条命令可能不是你想要的;见上文"push"。选项-a--all这个选项只对push和save命令有效。所有被忽略的和未被追踪的文件也被贮藏起来,然后用git clean来清理。-u--include-untracked--no-include-untracked当与push和save命令一起使用时,所有未被追踪的文件也被贮藏起来,然后用git clean来清理。当与show命令一起使用时,显示贮藏库条目中未被追踪的文件作为差异的一部分。--only-untracked这个选项只对show命令有效。只显示贮藏库条目中未被追踪的文件作为差异的一部分。--index这个选项只对pop和apply命令有效。不仅试图恢复工作区的变化,而且恢复索引的变化。然而,这可能会在出现冲突时失败(这些冲突被存储在索引中,因此你不能再按原来的方式应用这些变化)。-k--keep-index--no-keep-index这个选项只对push和save命令有效。所有已经添加到索引中的变化都保持原样。-p--patch这个选项只对push和save命令有效。交互式地从 HEAD 和工作区之间的差异中选择要存储的内容。 藏匿条目的构造是这样的:它的索引状态与你仓库的索引状态相同,它的工作区只包含你交互选择的变化。 被选中的修改会从你的工作区中回滚。参见 [git-add[1]](https://git-scm.com/docs/git-add/zh_HANS-CN) 中的 '互动模式' 一节,了解如何操作--patch模式。选项 --patch 意味着 --keep-index。 你可以使用 --no-keep-index 来覆盖它。-S--staged这个选项只对push和save命令有效。只存放当前分阶段的修改。这类似于基本的git commit,只不过是将状态提交到贮藏室而不是当前分支。--patch选项要优先于这个选项。--pathspec-from-file=这个选项只对push命令有效。Pathspec在 <文件> 中传递,而不是在命令行参数中传递。如果 <文件> 正好是 -,则使用标准输入。路径规范元素由 LF 或 CR/LF 分隔。可以引用配置变量 core.quotePath 的路径规范元素(请参见 git-config[1])。另请参见 --pathspec-file-nul 和全局 --literal-pathspecs。--pathspec-file-nul这个选项只对push命令有效。只有在使用 --pathspec-from-file 选项时才有意义。指定路径元素用 NUL 字符分隔,所有其他字符都按字面意思(包括换行符和引号)表示。-q--quiet这个选项只对apply、drop、pop、push、save、store命令有效。静默,压制反馈信息。--这个选项只对push命令有效。为了消除歧义,将路径规范与选项分开。…这个选项只对push命令有效。新的贮藏条目只记录了符合路径规范文件的修改状态。 然后索引条目和工作区文件也被回滚到 HEAD 中的状态,只留下不符合路径规范的文件。更多细节请参见 [gitglossary[7]](https://git-scm.com/docs/gitglossary/zh_HANS-CN) 中的 路径规范 条目。这个选项只对apply、branch、drop、pop、show命令有效。一个形式为stash@{<版本>}的引用。如果没有给出<贮藏项>,则假定是最新的储藏库(即stash@{0})。讨论一个贮藏库条目被表示为一个提交,它的目录树记录了工作目录的状态,它的第一个父节点是创建该条目时在HEAD的提交。 第二个父节点的树记录了条目生成时索引的状态,它是HEAD提交的一个子节点。 祖先图看起来像这样: .----W / / -----H----I其中H是HEAD提交,I是记录索引状态的提交,W是记录工作区状态的提交。实例拉进一个脏目录树当你在做某件事的时候,你得知上游有一些变化可能与你正在做的事情有关。 当你的本地修改与上游的修改不冲突时,一个简单的`git pull’就可以让你继续前进。然而,在有些情况下,你的本地修改确实与上游修改有冲突,而git pull拒绝覆盖你的修改。 在这种情况下,你可以把你的进度保存起来,执行一次拉取,然后再解开,像这样:$ git pull ... 文件 foobar 不是最新的,无法合并。 $ git stash $ git pull $ git stash pop中断的工作流程当你正在做某件事的时候,你的老板来了,要求你立即修复某件事。 传统上,你会向一个临时分支提交,以储存你的修改,然后返回到你的原始分支进行紧急修复,就像这样:# ... 嗨骇害 ... $ git switch -c my_wip $ git commit -a -m "我待会还得写点东西" $ git switch master $ edit emergency fix $ git commit -a -m "速速修复BUG" $ git switch my_wip $ git reset --soft HEAD^ # ... 继续骇入 ...你可以用’git stash’来简化上述工作,像这样:# ... 嗨骇害 ... $ git stash $ edit emergency fix $ git commit -a -m "紧急修复" $ git stash pop # ... 继续骇入 ...部分测试提交当你想把工作区上的改动做两个或更多的提交,并且想在提交前测试每个改动时,你可以使用git stash push --keep-index:# ... 嗨骇害 ... $ git add --patch foo # 仅将第一部分添加到索引中 $ git stash push --keep-index # 将所有其他改动保存到储藏室中 $ edit/build/test first part $ git commit -m '第一个部分' # 提交完全测试过的改动 $ git stash pop # 准备处理所有其他改动 # ... 重复以上五个步骤,直到剩下一个提交... $ 编辑/构建/测试剩余部分 $ git commit foo -m '剩余部分'。保存不相关的变化供将来使用当你在进行大规模修改时,发现一些不相关的问题,你不想忘记修复,你可以进行修改,将其分阶段,然后使用 git stash push --staged 将其存放起来,以便将来使用。这类似于提交阶段性修改,只是提交的结果是在贮藏库而不是在当前分支。# ... 嗨骇害 ... $ git add --patch foo # 将不相关的改动添加到索引中 $ git stash push --staged # 将这些改动保存到储藏库中 # ... 嗨骇害, 完成当前改动 ... $ git commit -m '大规模测试' # 提交完全测试过的改动 $ git switch fixup-branch # 切换到另一个分支 $ git stash pop # 完成已保存更改的工作恢复被错误地清除/丢弃的贮藏库条目如果你错误地丢弃或清除了贮藏库条目,它们无法通过正常的安全机制恢复。 然而,你可以试试下面的咒语,以获得仍在你的版本库中,但无法到达的贮藏库条目列表:git fsck --unreachable | grep commit | cut -d -f3 | xargs git log --merges --no-walk --grep=WIP原文出处:https://git-scm.com/docs/git-stash/zh_HANS-CN
2024年05月10日
86 阅读
0 评论
0 点赞
2024-05-08
Git冲突:Please commit your changes or stash them before you merge
使用git pull来更新代码时,有时会遇到以下的问题:**error: Your local changes to the following files would be overwritten by merge:....phpPlease, commit your changes or stash them before you can merge.Aborting** 这个问题原因是其他人修改了某个文件并提交到版本库中去了,而你本地也修改了同一个,这时候你进行拉取就会出现冲突了,解决方法,原则是不要去更改别人已经提交的代码,如果确实要更改(不建议也不需要),请先跟当事人沟通方法一:放弃本地修改(此方法本地修改的代码会被丢弃,不可找回)git reset --hard git pullgit reset --hard:撤销工作区中所有未提交的修改内容,将暂存区与工作区都回到上一次版本,并删除之前的所有信息提交方法二:同样是放弃本地修改使用TortoiseGit(小乌龟),打开冲突文件所在目录,如下:方法三:使用git stashgit stash git pull git stash popgit stash:保存当前工作进度,能够将所有未提交的修改(工作区和暂存区)保存至堆栈中,用于后续恢复当前工作目录。也可以用git stash save,作用等同于git stash,区别是可以加一些注释git pull:这个应该不用说了吧!(把服务器仓库的更新拉到本地仓库中)git stash pop:可以把你刚才stash到本地栈中的代码pop到本地(也可以用git stash apply,区别:使用apply恢复,stash列表中的信息是会继续保留的,而使用pop恢复,会将stash列表中的信息进行删除。)git stash list:存储到本地栈顶以后,你可以使用git stash list 查看你本地存储的stash日志git stash clear: 清空Git栈,原来stash的节点都会被清除原文链接:https://blog.csdn.net/weixin_44545251/article/details/115366666
2024年05月08日
176 阅读
0 评论
0 点赞
2024-04-30
PHP中的一些常用的超全局变量总结
《PHP中的一些常用的超全局变量总结》PHP是一种广泛使用的服务器端脚本语言,它被用于开发各种Web应用程序,在PHP中,有一些特殊的全局变量,被称为超全局变量,在本文中,我们将深入了解PHP中的一些...php是一种广泛使用的服务器端脚本语言,它被用于开发各种Web应用程序。在PHP中,有一些特殊的全局变量,被称为超全局变量。超全局变量在整个脚本中都是可用的,无需使用global关键字来访问它们。1. $_GET:$_GET是一个关联数组,用于从URL中获取参数的值。当使用GET方法发送HTTP请求时,参数会附加在URL的末尾,例如:http://example.com/?id=123。可以使用$_GET来获取这些参数的值,例如$_GET['id']将返回123。这在处理表单提交、页面导航和URL参数传递时非常有用。2. $_POST:$_POST也是一个关联数组,用于从HTTP请求的正文中获取参数值。当使用POST方法发送HTTP请求时,参数会被包含在请求正文中,而不是URL中。可以使用$_POST来获取这些参数的值,例如$_POST['name']将返回提交的名称值。与$_GET相比,$_POST更适用于处理敏感数据,因为它们不会在URL中暴露出来。3. $_SERVER:$_SERVER是一个包含了服务器和执行环境信息的关联数组。它提供了许多有用的信息,如当前页面的URL、请求方法、客户端IP地址、服务器信息等。例如,$_SERVER['REQUEST_METHOD']将返回当前请求的方法,$_SERVER['REMOTE_ADDR']将返回客户端的IP地址。$_SERVER在处理会话管理、用户认证和访问控制时非常有用。4. $_SESSION:$_SESSION是用于在不同页面之间存储和访问会话数据的关联数组。它可以用来跟踪用户会话状态,存储用户信息,以及实现用户登录和注销等功能。使用$_SESSION,可以在不同的页面之间传递数据,并且数据在用户关闭浏览器后仍然保留。5. $_COOKIE:$_COOKIE是一个包含了客户端发送的HTTP Cookie的关联数组。Cookie是一种在客户端浏览器中存储数据的机制,用于跟踪用户状态和存储用户偏好设置。通过$_COOKIE,可以读取和修改Cookie的值,例如$_COOKIE['username']将返回存储在名为"username"的Cookie中的值。6. $_REQUEST:$_REQUEST是一个关联数组,包含了通过GET、POST和COOKIE方式提交的参数的值。它可以同时获取GET和POST的参数值。然而,由于它可以获取多种来源的参数,因此在使用之前需要注意安全性和数据一致性。7. $_FILES:$_FILES是一个关联数组,用于访问通过HTTP POST方法上传的文件。它包含了上传文件的属性,如文件名、文件类型、文件大小等。通过$_FILES,可以将上传的文件保存到服务器上的指定位置。8. $_ENV:$_ENV是一个包含了环境变量的关联数组。环境变量是在操作系统中设置的一些系统级别的值,在PHP中可以通过$_ENV来访问它们。例如,$_ENV['PATH']将返回操作系统中配置的路径。9. $GLOBALS:$GLOBALS是一个包含了全局变量的关联数组。它包含了脚本中定义的所有全局变量,以变量名为键名,变量值为键值。通过$GLOBALS,可以在任何地方访问和修改全局变量的值。总结这些超全局变量提供了丰富的功能,用于访问和操作PHP脚本中的各种数据和环境。它们在不同的场景下有不同的用途,例如获取用户输入、处理文件上传、访问系统环境变量等。在使用这些超全局变量时,需要注意安全性和数据验证,以确保应用程序的安全性和可靠性。需要注意的是,尽管超全局变量可以在任何地方访问,但在编写代码时应尽量避免过度使用它们,以免造成代码的混乱和不可维护性。合理使用超全局变量,可以帮助我们简化代码、提高开发效率,并使代码更具可读性和可维护性。超全局变量在PHP中发挥着重要作用,简化了许多常见的Web开发任务。它们提供了一种方便的方式来访问和操作请求参数、服务器信息、会话数据和Cookie。了解和正确使用这些超全局变量,可以帮助我们更高效地开发PHP应用程序,并确保数据的安全性和一致性。需要注意的是,由于超全局变量是全局范围的,因此要特别小心处理它们,以防止安全漏洞和数据冲突。在使用超全局变量时,应该进行验证和过滤,确保输入的数据是安全的,并避免直接使用它们来执行敏感操作。原文出处:http://www.cppcns.com/wangluo/php/641641.html
2024年04月30日
59 阅读
0 评论
0 点赞
2024-04-30
PHP 获取客户端真实IP地址
{callout color="#d1d1d1"} 《PHP获取客户端真实IP地址》PHP获取客户端真实IP地址,只要根据实际部署情况选择相对应的代码获取访客IP地址,是可以确保程序不被假IP欺骗的...{/callout} php获取客户端真实IP地址,需要根据具体的服务器环境来确定使用哪种方法。目前搜索到的方法,大多是直接贴代码,没有针对不同情况作出说明,有可能导致系统被假IP骗过(IP欺骗)。 很多文章都提到“无法保证获取到的访客IP地址100%准确”,是否意味着PHP获取访客IP一定有漏洞可钻呢? 只要根据实际部署情况选择相对应的代码获取访客IP地址,是可以确保程序不被假IP欺骗的。PHP的运行方式 PHP支持非常多的运行方式,例如php-cgi、php-fpm、swoole、php-cli、php-mod等。其中,php-fpm是php的fast-cgi的进程管理器。php-mod通常配合Apache使用,而php-fpm通常配合Nginx使用。从PHP5.4开始,PHP甚至可以以内置PHP服务(Buid-in web server)方式运行。逐渐的,PHP形成了很多经典搭配,例如LAMP、LNMP、LNMPA、IIS+PHP。 无论采用哪种PHP运行方式,分清是谁传递IP给PHP程序即可。这里对几种常见环境进行分析。无代理层(PHP内置服务器/swoole) 由于客户端IP数据是从TCP/IP协议层传递过来的,因此在没有中间代理(客户端和服务器直连)的情况下,可以直接通过标准方法REMOTE_ADDR获得与PHP直接通讯的IP地址。 例如$_SERVER['REMOTE_ADDR']或getenv("REMOTE_ADDR")。 而在swoole中,可以通过$request->server['remote_addr']获得客户端IP地址。 在这种情况下,REMOTE_ADDR不可以显式的伪造,获取到的是实际与服务器连接的IP地址,是可靠的。Nginx代理(Nginx + php-fpm / Nginx + swoole) 常见的LNMP方案,属于Nginx反向代理。Nginx与php的通讯,无论Unix socket方式还是tcp socket方式,都跟Nginx的Header配置有关系。proxy_http_version 1.1; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_set_header X-NginX-Proxy true; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; 可以在第一层nginx代理设置 proxy_set_header X-Forwarded-For $remote_addr,其他层nginx代理设置proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for,这样就可以通过X-Forwarded-For获取客户端真实IP地址。如果设置了X-Real-IP $remote_addr,则通过X-Real-IP获取客户端IP地址。PHP代码:// php-fpm等 $_SERVER['HTTP_X_FORWARDED_FOR']); // swoole $this->http_input->header('x-real-ip'); 总结来说,当有Nginx代理的情况下,需要根据具体配置来选择获取的Header,从而正确获取客户端IP地址,此时PHP中的的REMOTE_ADDR可能是最后一级代理的IP地址。Apache代理(Apache + php_mod / Apache + php-fpm) 通常在Apache + PHP方案中,获取IP地址取决于Apache配置信息。 绝大部分情况可以使用$_SERVER["REMOTE_ADDR"]获取到真实客户端IP地址。 如果Apache上级存在Nginx,那么可以在Apache中使用mod_rpaf模块将客户端IP地址传递到X-Forwarded-For头中。PAFheader X-Forwarded-For负载均衡/云虚拟机/Serverless 在负载均衡条件下,需要查阅对应负载均衡程序的文档,来决定使用哪种方法获取真实客户端IP地址。 在大部分虚拟主机、负载均衡及无服务器中,可以通过HTTP_CLIENT_IP、HTTP_X_FORWARDED_FOR或X-REAL-IP其一得知客户端IP地址。但是不建议对多种来源进行空值判断,这样容易被伪造者利用,从而实现IP欺骗。 目前并未有标准规定将客户端IP地址放入名为CLIENT_IP的环境变量,但是有不少老虚拟主机供应商这样做。新的提供商都不再使用该环境变量。网上大量的PHP文章中都是优先获取HTTP_CLIENT_IP的值,因此导致网上存在大量的服务器可以被伪造IP欺骗。 可能有该漏洞的代码:<?php if(!empty($_SERVER['HTTP_CLIENT_IP'])) { $ip = $_SERVER['HTTP_CLIENT_IP']; } elseif (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) { $ip = $_SERVER['REMOTE_ADDR']; }IIS + PHP 这种情况下直接使用$_SERVER['REMOTE_ADDR']方法即可。总结 无论是哪种情况,如果用户使用匿名代理访问服务器,只能获取到代理服务器的IP地址,其IP地址仍然具有参考意义。 获取客户端真实IP地址,此事需要查阅相关资料根据具体情况选用某一个方法,而不是 复制粘贴 。 部分方法获取到的值可能是一个数组。 不建议对获取到的IP地址进行正则过滤,有可能你获取到的是一个IPv6地址。原文出处:http://www.cppcns.com/wangluo/php/646369.html
2024年04月30日
39 阅读
0 评论
0 点赞
1
2
3
...
11