PHP中对数组的操作

数组的声明 PHP中有两种数组:索引数组和关联数组。索引数组的索引是从0开始递增的数字,由程序自动生成;关联数组使用字符串作为索引值,由用户自行输入。 初始化时直接赋值 1 2 3 4 5 6 7 8 9 //索引数组 $example[0] = "a"; $example[1] = "b"; $example[2] = "c"; //关联数组 $example_1["a"] = "1"; $example_1["b"] = "2"; $example_1["c"] = "3"; 若要按默认索引顺序声明索引数组,可以不用填入索引值,程序自动按声明顺序为键值建立索引: 1 2 3 $example[] = "a"; //索引为0 $example[] = "b"; //索引为1 $example[] = "c"; //索引为2 通过array()函数创建 1 2 3 4 5 //索引数组 $example = array("a", "b", "c"); //关联数组 $example_1 = array("a" => "1", "b" => "2", "c" => "3"); 多维数组的创建使用array()函数嵌套完成: 1 2 3 4 5 $example = array( "array1" => array("a", "b", "c"), "array2" => array("d", "e", "f"), "array3" => array("g", "h", "i") ) 数组的遍历 使用for循环遍历 1 2 3 4 5 6 7 8 9 <?php $example = array("a", "b", "c"); for($i = 0; $i < count($example); $i++){ echo $example[$i]."<br>"; } ?> 打印结果: ...

Oct. 19, 2019 · 10 min · 1960 words · Jiekang Hu

关于SSH远程登录

SSH(Secure Shell,安全外壳协议),是用于计算机之间的加密登录的一种安全协议标准。其最大的特点在于加密,这也正是它相比Telnet、FTP等其他协议的优势。如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会泄露。 使用SSH登录只需要一行命令: 1 2 3 ssh 用户名@服务器IP # 默认状态 ssh 服务器IP # 当本机的用户名和服务器用户名相同时 ssh -p 8888 用户名@服务器IP # 自定义访问端口 SSH的加密方式 加密的方式主要有两种:对称加密和非对称加密。对称加密指的是加密与解密使用同一套密钥。这种加密方式在不知道密钥的情况下极其难被破解,但是在SSH这种具有多个客户端的情况下,如果大家共用一套密钥,那么只要有一个客户端的密钥发生了泄露,所有的连接都会变得不安全,所以对称加密在SSH上是不可行的,SSH使用的是非对称加密。 所谓非对称加密,就是使用公钥和私钥来对数据进行加解密。经过公钥加密的数据,只能通过私钥来解密,而通过公钥来推出私钥的可能性几乎没有。其工作流程主要分为以下几步: 客户端向服务器发送连接请求 服务器返回公钥文件,客户端使用该公钥对密码进行加密后发送给服务器 服务器使用私钥解密,并与正确密码进行比对,验证客户端的身份 比对后返回结果给客户端 可以看到,私钥是始终存在于服务器端的,即便拦截到了密文,由于没有私钥也无法进行解密,这也就保证了数据的安全性。 但是,它依然有不完美之处:首先由于SSH的密钥都是自己签发的,并不像HTTPS有CA证书,这也就使得SSH密钥的真伪性很难辨别。 如果服务器发送的公钥被拦截,随后拦截者发送另一个伪造的公钥给客户端,那么拦截者接收客户端发送的密文之后,就可以使用自己伪造的私钥来解密,随后得到密码就可以直接攻击目标服务器。这种风险就是著名的"中间人攻击"(Man-in-the-middle attack)。 SSH的认证方式 使用公钥指纹认证 SSH在用户第一次登录服务器时,会发出类似于下面的信息: 1 2 3 The authenticity of host 'example.com (xxx.xxx.xxx.xxx)' can't be established. RSA key fingerprint is xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx. Are you sure you want to continue connecting (yes/no)? 它的意思就是:无法确认主机的真实身份,但是知道它的公钥指纹,是否继续连接? 从这里可以看出,SSH的第一种认证方式就是把公钥指纹显示给客户端,让客户端进行辨别。为什么使用公钥指纹呢?因为公钥的长度很长不便于比对(通常有1024位),于是就计算公钥的hash并生成一个128位的指纹,这样就更好比对了。 那么用户怎么知道远程主机的公钥指纹应该是多少?目前并没有很好的办法,所以远程主机必须在自己的网站上贴出公钥指纹,以便用户自行核对。 如果用户确认无误,就可以输入yes,继续连接。接下来服务器会把这个客户端添加至“已信任的主机”列表(known_hosts)里。 1 2 Warning: Permanently added 'example.com (xxx.xxx.xxx.xxx)' (RSA) to the list of known hosts. Password: (enter password) 使用公钥认证 公钥认证的原理如下: ...

Oct. 14, 2019 · 1 min · 148 words · Jiekang Hu

Python爬虫学习总结

网络爬虫的流程和原理 整个网络爬虫的流程可以分为如下的三个步骤: 整个爬虫的过程都可以使用 Python(本文使用 Python 3)来完成,每个步骤使用的模块大致如下: 获取网页:requests、urllib、selenium(模拟浏览器) 解析网页:re正则表达式、BeautifulSoup、HTML 解析器lxml等 存储数据:存储至 txt、csv 等文件或是存储至 MySQL、MongoDB 等数据库 使用 requests 模块发起 HTTP 请求与抓取静态网页 使用 pip 命令安装requests模块。 1 pip install requests 使用requests.get()可以向目标 URL 发送一个GET请求并返回页面内容与信息。 1 2 import requests r = requests.get('https://www.baidu.com') 此时我们就已经实现了一个静态网页的抓取。requests.get()方法返回的对象包含了关于本次请求的信息,通过它的一些实例变量和方法可以进行访问。下面列出了一些常用的变量和方法: status_code :返回 HTTP 状态码 headers :返回请求头 encoding :返回编码类型 text :返回响应内容(Unicode) content :返回响应内容(二进制数据) json() :返回 JSON 响应内容 url :返回网页 URL 上面只是一个所有参数都为默认时的请求。有时候我们可以对requests进行定制,使得请求符合我们的需求。 设置 URL 参数 可以使用一个字典用于保存参数名称与其对应的值,然后通过params参数传入requests.get()方法中。在下面的代码中,将值为value1的参数key1和值为value2的参数key2传入网页http://httpbin.org/get,发现 URL 已经正确编码: 1 2 3 4 5 import requests key = {'key1': 'value1', 'key2': 'value2'} r = requests.get('http://httpbin.org/get', params = key) print(r.url) print(r.text) 运行结果如下: ...

Sep. 27, 2019 · 13 min · 2728 words · Jiekang Hu

CNSS Recruit 2019 WriteUp

Web部分 True_check_in 题目链接:http://144.202.82.121:23333/ 看到题肯定就先按要求来咯。先算了一下 2 的 33 次方等于多少: 填入结果发现问题:输入框限制了字符串长度,导致了不能够将结果 8589934592 直接输入提交。 尝试传入错误结果,返回 wrong。 于是尝试使用 BurpSuite 进行抓包,截获请求头: 发现用户输入的结果是通过 answer 的值使用 POST 方法传至服务器的,遂通过 BurpSuite 直接修改 answer 的值为 8589934592,然后提交请求,得到 flag: check_in 题目链接:http://47.107.115.177:2333/ 打开页面,发现只有这么一句话,查看源代码没发现什么猫腻,因为源代码也只有这一句话… 再打开审查元素界面看看请求头和响应头,发现了一个陌生的面孔 ETag : 以下是 Wikipedia 对ETag的解释: ETag 是 HTTP 协议提供的若干机制中的一种 Web 缓存验证机制,并且允许客户端进行缓存协商。这就使得缓存变得更加高效,而且节省带宽。如果资源的内容没有发生改变,Web 服务器就不需要发送一个完整的响应。 ETag 是一个不透明的标识符,由 Web 服务器根据 URL 上的资源的特定版本而指定。如果那个 URL 上的资源内容改变,一个新的不一样的 ETag 就会被分配。用这种方法使用 ETag 即类似于指纹,并且他们能够被快速地被比较,以确定两个版本的资源是否相同。 如果 ETag 值匹配,这就意味着资源没有改变,服务器便会发送回一个极短的响应,包含 HTTP “304 未修改” 的状态。 304 状态告诉客户端,它的缓存版本是最新的,并应该使用它。 ...

Sep. 23, 2019 · 3 min · 585 words · Jiekang Hu

Aegis招新WriteUp

Adventures in PHP (0) 很明显,flag 就在 flag1.php 的 $flag 变量中。 观察发现 $flag 变量必须存在且非 NULL,而且用到了 strcmp() 字符串比较函数。而我输入的值显然不可能等于$flag的值,故只能想办法绕过 strcmp() 函数来达到显示 flag 的目的。 查阅 PHP 官方手册中有关 strcmp() 函数的说明,发现当字符串和数组或一个对象进行比较时会得到 NULL 且返回警告: 所以最简单的办法,就是使用 GET 方法令变量 $flag 为一数组 flag[]=1 即可绕过 strcmp() ,成功得到 flag。 Adventures in PHP (1) 同样很容易看出,flag 就在 flag2.php 的某个变量中。 观察代码,发现需要以 GET 方法读入变量 $args,且 $args 的值必须和正则表达式/^\w+$/匹配,即匹配由数字、26 个英文字母或者下划线组成的字符串,这样才不会进入内层的 if 条件导致程序退出。 接下来是 eval(var_dump($$args););。 eval() 可执行将字符串当成代码来执行,而 var_dump() 可以打印出变量的相关信息。又发现 $$args 是一个可变变量,即变量名为另一个变量,即 $args 。 ...

Sep. 22, 2019 · 2 min · 348 words · Jiekang Hu