今天一位网友想用PHP做一个端口扫描,我推荐他用curl或fsockopen,最终用了curl。
虽然说PHP做端口扫描不是最佳的,但是玩玩还是可以的!结果,他说他的CURL请求https出不了结果,返回为空,甚至报证书的错误。
解决这个问题其实也很简单,curl的选项本身是支持这些的,只能说我们设置有问题而已,具体操作如下:
第一种方法:设定为不验证证书和host(推荐)
在执行curl_exec()之前,设置option,例如:
$ch = curl_init();
......
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
第二种方法:设定一个正确的证书。
本地ssl判别证书太旧,导致链接报错ssl证书不正确。
我们需要下载新的ssl 本地判别文件
http://curl.haxx.se/ca/cacert.pem
放到 程序文件目录
curl增加下面的配置代码:
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,true); ;
curl_setopt($ch,CURLOPT_CAINFO,dirname(__FILE__).'/cacert.pem');
最终:
他选择用了第一种方法,这样的话,curl请求既支持HTTP,也支持HTTPS了,他的简单PHP扫描端口代码如下:
<?php
// 创建新的 cURL 资源
$ch = curl_init();
// 设置 URL地址与端口
curl_setopt($ch, CURLOPT_URL, "www.fujieace.com");
curl_setopt($ch, CURLOPT_PORT, "80");
//启用时会将头文件的信息作为数据流输出。
curl_setopt($ch, CURLOPT_HEADER, true);
//false 禁止 cURL 验证对等证书(peer's certificate)。要验证的交换证书可以在 CURLOPT_CAINFO 选项中设置,或在 CURLOPT_CAPATH中设置证书目录。
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
//true 验证证书状态。
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
//true 时将不输出 BODY 部分。同时 Mehtod 变成了 HEAD。修改为 false 时不会变成 GET。
curl_setopt($ch, CURLOPT_NOBODY, false);
// 抓取 URL 并把它传递给浏览器
curl_exec($ch);
//获取一个cURL连接资源句柄的信息
$info = curl_getinfo($ch);
//得到状态码
var_dump($info["http_code"]);
// 关闭 cURL 资源,并且释放系统资源
curl_close($ch);
?>
最终扫描代码效果如下:
总结:
做端口扫描原理就是这么简单,我给某个端口发个数据,只要有返回结果,就说明端口是存在的。
只能说此PHP端口扫描代码容易被检测到,如果我没有记错的话,此PHP端口扫描代码属于“Connect()扫描”
什么是Connect()扫描?
Connect()扫描试图与每一个TCP端口进行“三次握手”通信。如果能够成功建立接连,则证明端口开发,否则为关闭。准确度很高,但是最容易被防火墙和IDS检测到,并且在目标主机的日志中会记录大量的连接请求以及错误信息。