首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP端口扫描

PHP端口扫描
EN

Stack Overflow用户
提问于 2014-06-18 07:56:30
回答 2查看 9K关注 0票数 4

这可能是一个重复的帖子,但我没有看到任何正确解决这一问题的答案。

我正在试图找到一个php脚本,它可以正确地确定TCP或UDP端口的状态。

我试过几个我在网上找到的,它们都返回了错误的结果。在我的本地网络上,我有5000 UDP和5060 TCP/UDP端口打开并正确路由。

如果我通过http://www.ipfingerprints.com/portscan.php或GRC屏蔽运行测试,那么将返回正确的结果,但是我尝试过的所有PHP脚本都失败了,并将端口显示为已关闭。

我正在通过我的托管帐户运行php脚本,并试图扫描和测试我自己的网络。

这是我尝试过的脚本之一:

代码语言:javascript
复制
    <html>
<head>
<?php echo "<title>Port Scanning " . $_GET['host'] . "</title>"; ?>
</head>
<body>
<?php
ini_set('display_errors', 0);

if(isset($_GET['host']) == true) 
    $host = $_GET['host'];
else
{
    echo "You didn't set the host parameter";
    die();
}

if(isset($_GET['sport']) == true) 
    $sport = $_GET['sport'];
else
{
    echo "You didn't set the sport parameter";
    die();
}

if(isset($_GET['eport']) == true) 
    $eport = $_GET['eport'];
else
{
    echo "You didn't set the eport parameter";
    die();
}

if($sport > $eport)
{
    $sport = $eport;
}

$scanned = 0;
$openports = 0;
$maxports = 1;
$totalports = ($eport - $sport) + 1;
$mins = floor(($totalports / 10) / 60);
$secs = ($totalports / 10) - $mins * 60;

echo "<font color=\"blue\">Scanning " . $totalports . " ports on " . $host . ", this should take around " . $mins . " minute(s) and " . $secs . " second(s), probably more depending on local website load, hardware, and other factors.<br/><br/></font>";
flush();

do
{
    if($scanned >= $maxports && $maxports != 0)
    {
        echo "<font color=\"darkgreen\" size=\"4\">Scan limit of " . $maxports . " ports reached, scanning stopped.</font><br/><br/><font color=\"darkred\" size=\"4\">Scanner written by Samo502</font>";
        flush();
        die();
    }
    if(fsockopen($host, $sport, $errorno, $errorstr, 0.1))
    {
        echo "<font color=\"darkgreen\">Port " . $sport . " is open on " . $host . "</font><br/>";
        $openports++;
        flush();
    }
    else
    {
        echo "<font color=\"red\">Port " . $sport . " is not open on " . $host . "</font><br/>";
        flush();
    }
    $scanned++;
    $sport++;
} while($sport <= $eport);

echo "<br/><font color=\"blue\">Done, " . $openports . " out of " . $totalports . " ports are open.</font><br/><br/><br/><font color=\"darkred\" size=\"4\">Scanner written by Samo502</font>";
die();
?>
</body>
</html>

有人知道如何正确地做这件事吗?

谢谢

**UPDATE**我发现它似乎工作得更好,但它仍然没有检测到端口21目前在我的网络上开放。

http://resources.infosecinstitute.com/php-build-your-own-mini-port-scanner-2/

任何感激的帮助。谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-18 08:18:10

最好的解决方案是用PHP编写一个包装器--说真的,您无法对一个比nmap更好的nmap进行重新编码。

如果您真的想这样做,您不应该简单地打开TCP端口并检查它是否连接,您应该从较低级别的套接字(原始套接字)开始。

代码语言:javascript
复制
$mysocket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

这允许您研究SYNACK握手标志,并进行秘密或简单的更快的扫描。

您可以并行创建(非阻塞)套接字,并使用socket_select();检查它们的缓冲区/连接,这是处理PHP中几个套接字的最快和最可靠的方法。我可能会使用分叉、线程或分派代码的部分来在与单个端口扫描相同的时间内运行完整的端口扫描。

您希望使用的其他函数是socket_set_timeout()socket_set_blocking()

exec not working with nmap command

https://unix.stackexchange.com/questions/28732/fastest-way-to-port-scan-nmap

http://phpnmap.sourceforge.net/

可能是最好的解决方案,一个PEAR包nmap包装器:Nmap/

票数 2
EN

Stack Overflow用户

发布于 2014-06-18 08:12:44

而不是

代码语言:javascript
复制
if(fsockopen($host, $sport, $errorno, $errorstr, 0.1))

试一试

代码语言:javascript
复制
$connection = @fsockopen($host, $sport);
if (is_resource($connection)){
  // OK
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24279991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档