>백엔드 개발 >PHP 튜토리얼 >PHP의 fsockopen() 개방형 포트 스캐너에 대한 자세한 설명

PHP의 fsockopen() 개방형 포트 스캐너에 대한 자세한 설명

小云云
小云云원래의
2018-01-26 09:54:531999검색

이 기사에서는 fsockopen() 함수를 사용하여 간단한 포트 스캐너를 작성합니다. 이 예에서는 포트 번호가 고정되어 있습니다. fsockopen() 함수를 사용하여 연결하면 포트가 열리고 그렇지 않으면 포트가 닫힙니다.

핵심 코드는 다음과 같습니다.


foreach ($port as $key => $value) {
 echo &#39;<tr>&#39;;
 echo &#39;<td>&#39; . $key . &#39;</td>&#39;;
 echo &#39;<td>&#39; . $value . &#39;</td>&#39;;
 echo &#39;<td>&#39; . $msg[$key] . &#39;</td>&#39;;
 //$errno 和 $errstr 在这里基本用不上,只是为了设置 timeout,防止请求超时
 $fp = @fsockopen($ip, $value, $errno, $errstr, 1);//如果主机(hostname)不可访问,将会抛出一个警告级别(E_WARNING)的错误提示。所有需要加@
 $result = $fp ? &#39;<span >开启</span>&#39; : &#39;<span >关闭</span>&#39;;
 echo &#39;<td>&#39; . $result . &#39;</td>&#39;;
 echo &#39;</tr>&#39;;
}


<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>端口扫描</title>
 <style type="text/css">
  td{
   padding:10px;
   border-bottom:1px solid #eee;
  }
 </style>
</head>
<body>
 <form method="post" action=&#39;#&#39;>
  网址/ip:<input type="text" name="ip" value="<?php echo $_POST[&#39;ip&#39;] ?? &#39;127.0.0.1&#39;?>">
  <button>扫描</button>
 </form>
 <table>
  <thead>
   <tr>
    <td>id</td>
    <td>端口号</td>
    <td>服务</td>
    <td>开启状态</td>
   </tr>
  </thead>
  <tbody>
   <?php 
    $ip = $_POST[&#39;ip&#39;] ?? &#39;127.0.0.1&#39;;
    if(ip2long($ip)){
     $aIp = explode(&#39;.&#39;, $ip);//ip4地址使用.分隔符
     //这里没有对 0.0.0.0 这种本机地址进行判断,只是粗略的判断ip是否合法 
     foreach ($aIp as $key => $value) {
      if($value < 0 || $value > 255){
       die(&#39;地址不合法&#39;);
      }
     }
    }
    
    $port = array(
     21, 
     23, 
     25,
     79,
     80, 
     110, 
     135, 
     137, 
     138, 
     139, 
     143, 
     443, 
     445, 
     1433, 
     3306, 
    );
    $msg = array(
     &#39;Ftp&#39;,
     &#39;Telnet&#39;,
     &#39;Smtp&#39;,
     &#39;Finger&#39;,
     &#39;Http&#39;,
     &#39;Pop3&#39;,
     &#39;Location Service&#39;,
     &#39;Netbios-NS&#39;,
     &#39;Netbios-DGM&#39;,
     &#39;Netbios-SSN&#39;,
     &#39;IMAP&#39;,
     &#39;Https&#39;,
     &#39;Microsoft-DS&#39;,
     &#39;MSSQL&#39;,
     &#39;MYSQL&#39;,
     &#39;Terminal Services&#39;
    );
    //无论使用prot还是msg循环都是可以的,因为$key是对应的,都是索引数组
    foreach ($port as $key => $value) {
     echo &#39;<tr>&#39;;
     echo &#39;<td>&#39; . $key . &#39;</td>&#39;;
     echo &#39;<td>&#39; . $value . &#39;</td>&#39;;
     echo &#39;<td>&#39; . $msg[$key] . &#39;</td>&#39;;
     //$errno 和 $errstr 在这里基本用不上,只是为了设置 timeout,防止请求超时
     $fp = @fsockopen($ip, $value, $errno, $errstr, 1);//如果主机(hostname)不可访问,将会抛出一个警告级别(E_WARNING)的错误提示。所有需要加@
     $result = $fp ? &#39;<span >开启</span>&#39; : &#39;<span >关闭</span>&#39;;
     echo &#39;<td>&#39; . $result . &#39;</td>&#39;;
     echo &#39;</tr>&#39;;
    }

   ?>
  </tbody>
 </table>
</body>
</html>
</html>
因为偷懒,把页面和结果都写在一起了,布局就将就把。

주요 함수 소개

fsockopen

호스트 이름을 기반으로 연결을 생성하고 리소스 개체를 성공적으로 반환하며 실패 시 false를 반환합니다. ; 호스트를 사용할 수 없습니다 경고가 발생합니다

관련 권장 사항:


lnmp는 fsockopen() 기능을 활성화합니다

php fsockopen() 기능 비활성화 솔루션

위 내용은 PHP의 fsockopen() 개방형 포트 스캐너에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.