最初に環境を開くと、リンクが表示され、それを開いて確認できます。
Openはコード監査です
<?php
highlight_file(__FILE__);//用PHP高亮显示当前的文件
function check_inner_ip($url) //获取url的域名,将域名转为ip,然后再判断这个ip是否是私有地址
{
$match_result=preg_match('/^(http|https)?:\/\/.*(\/)?.*$/',$url);
//返回$url的匹配,值将是 0 次(不匹配)或 1
//^从开头开始匹配
//? 匹配0或1个正好在它之前的那个字符。注意:这个元字符不是所有的软件都支持的
//( )标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 \( 和 \)
//. 匹配除换行符 \n 之外的任何单字符。要匹配 . ,请使用 \.
//* 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*
//$:从字符串末尾进行匹配
if (!$match_result)
{
die('url fomat error');
//如果url不符合正则表达式
}
try
{
$url_parse=parse_url($url);
//分解出一个URL的各个部
// $url_parse是一个数组
}
catch(Exception $e)
{
die('url fomat error');
return false;
}
$hostname=$url_parse['host']; //hostname 为主机名,也就是域名
$ip=gethostbyname($hostname); //通过域名获取IP地址
$int_ip=ip2long($ip); //ip2long:将IPv4的ip地址(以小数点分隔形式)转换为int
return ip2long('127.0.0.0')>>24 == $int_ip>>24 || ip2long('10.0.0.0')>>24 == $int_ip>>24 || ip2long('172.16.0.0')>>20 == $int_ip>>20 || ip2long('192.168.0.0')>>16 == $int_ip>>16;
//判断是否是私有地址,是则这个函数就返回1
}
function safe_request_url($url)
{
if (check_inner_ip($url))
//判断url是否是私有地址
{
echo $url.' is inner ip';
}
else
{
$ch = curl_init(); //初始化新的会话,返回 cURL 句柄,供curl_setopt()、 curl_exec() 和 curl_close() 函数使用
curl_setopt($ch, CURLOPT_URL, $url); //访问的域名
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //
curl_setopt($ch, CURLOPT_HEADER, 0); //
//curl_setopt函数参数解释:https://www.cnblogs.com/lilyhomexl/p/6278921.html
$output = curl_exec($ch); //抓取URL并把它传递给浏览器
$result_info = curl_getinfo($ch); //php curl请求在curl_exec()函数执行之后,可以使用curl_getinfo()函数获取CURL请求输出的相关信息
//[php curl curl_getinfo()返回参数详解](https://www.cnblogs.com/zqifa/p/php-curl-3.html)
if ($result_info['redirect_url'])
{
safe_request_url($result_info['redirect_url']);
}
curl_close($ch); // 关闭cURL资源,并且释放系统资源
var_dump($output); //执行
}
}
$url = $_GET['url'];
if(!empty($url)){
//判断url是否为空,不为空就执行
safe_request_url($url);
}
まず、この機能を実行しますcheck_inner_ip、この関数の一般的な意味は、いくつかのプライベートip、つまりローカルファイルにアクセスできるipをフィルタリングすることです。最初に
この関数の機能を確認してください。おそらく通常の一致であることがわかり、次にURLを解析します。
ここではこれ以上のルールを紹介しません。上記のソースコードは非常に明確です。主にURL解析のバイパスを紹介します。この記事を見て、ここで完全なURLのさまざまな部分を分析しましょう
。完全なURLを使用してそれを解析して最初に見てください。
結果
は、これらが1対1の対応であることがわかります。したがって、他の場所で要求したいアドレスに変更できます。
着信URLはhttp:// a:@ 127.0.0.1:[email protected]であり、safe_request_url検出を入力した後にparse_urlによって取得されたホストはbaidu.comです。
このようにして、関数をチェックでき、curlは127.0.0.1:80を取得するため、IPが検出されると、それは通常のWebサイトのドメイン名であることがわかりますが、実際のcurl要求が行われると、それが構築されます。 127.0.0.1として。