❶ 如何改變或偽造HTTP
有類似功能的軟體,如HTTP-REFERER
其實偽造HTTP-REFERER是一些流氓軟體或者是一些批量注冊或灌注信息的工具必備的,因為這樣才能跳過伺服器的
HTTP-REFERER檢查。
先看看偽造的方法,看看伺服器端的手
段,伺服器可以輕松實現,但是一個直接的問題就是查 remote_addr的時候,就只有一個了,容易被禁止IP:
ASP:
dim http
set
http=server.createobject("MSXML2.XMLHTTP") '//MSXML2.serverXMLHTTP也可以
Http.open
"GET",url,false
Http.setRequestHeader
"Referer","http://www.fromdomain.cn/"
Http.send()
php(前
提是裝了curl):
$ch = curl_init();
curl_setopt
($ch, CURLOPT_URL, "http://www.readdomain.cn/xxx.asp");
curl_setopt
($ch, CURLOPT_REFERER, "http://www.fromdomain.cn/");
curl_exec ($ch);
curl_close
($ch);
PHP(不裝curl用sock)
$server = 'www.readdomain.cn';
$host =
'www.fromdomain.cn';
$target = '/xxx.php';
$referer =
'http://www.aslibra.com/'; // Referer
$port = 80;
$fp =
fsockopen($server, $port, $errno, $errstr, 30);
if (!$fp)
{
echo
"$errstr ($errno)<br />\n";
}
else
{
$out = "GET
$target HTTP/1.1\r\n";
$out .= "Host: $host\r\n";
$out .= "Cookie:
SESSIONID=test\r\n";
$out .= "Referer: $referer\r\n";
$out .=
"Connection: Close\r\n\r\n";
fwrite($fp, $out);
while (!feof($fp))
{
echo fgets($fp, 128);
}
fclose($fp);
}
VB.NET/C#.NET
Dim oXMLHttp As MSXML2.XMLHTTP30 = New MSXML2.XMLHTTP30()
或
者
MSXML2.XMLHTTP30 oXMLHttp = new MSXML2.XMLHTTP30();
oXMLHttp.open(....
oXMLHttp.setRequestHeader(...
oXMLHttp.send(..
引用
原理都是sock構造http頭來senddata。其他語言什麼的比如perl也可以,目前比較簡單的防
御偽造referer的方法是用驗證碼(Session)。現在有一些能防盜鏈軟體的商業公司比如UUDOG,linkgate,VirtualWall
什麼的,都是開發的應用於IIS上面的dll。有的是採用cookies驗證、線程式控制制,有的是能隨機生成文件名然後做URL重寫。有的方法能的確達到不
錯的效果.
一般的就是這樣的了,但是伺服器就不好實現偽造,只能製造不多的數據了,如果可以實現訪問網頁就可以
偽造,那就可以實現了真正的偽造,實現自然IP分布。
不過,js好像不支持修改,網上有代碼,可是測試過是不行:
<script language="javascript">
var
oReq = new ActiveXObject("Microsoft.XMLHTTP");
oReq.Open("GET","b.php",false);
oReq.SetRequestHeader("Referer","");
oReq.Send();
document.write(oReq.responseText);
</script>
上
面是JS的代碼,請求的b.php只要簡單的把信息列印出來就知道了:
<?
$out="";
foreach($_SERVER
as $k=>$v){
$out.=$k." : ".$v."\n";
}
//可以寫入文件做分析
file_put_contents(time().".txt",$out);
echo
'<pre>';
echo $out;
?>
引用
[HTTP_ACCEPT] => image/gif, image/x-xbitmap, image/jpeg,
image/pjpeg, application/msword, application/vnd.ms-excel,
application/vnd.ms-powerpoint, application/x-shockwave-flash, */*
[HTTP_REFERER] =>
http://www.aslibra.com/test/referrer/a.php?1187692842
.....
看
的出來,修改並不成功,也就是沒法做修改了,如果是出於安全,那也真的不給修改的,否則這個世界真的不安靜了,特別像我這種可能做壞事的人,呵呵~~
❷ php到底怎麼獲取IP地址,為什麼三種方法獲取的IP都不一樣
php獲取真實IP地址,參考方法如下:
functionGetIP(){
if(getenv("HTTP_CLIENT_IP")&&strcasecmp(getenv("HTTP_CLIENT_IP"),"unknown"))
$ip=getenv("HTTP_CLIENT_IP");
elseif(getenv("HTTP_X_FORWARDED_FOR")&&strcasecmp(getenv("HTTP_X_FORWARDED_FOR"),"unknown"))
$ip=getenv("HTTP_X_FORWARDED_FOR");
elseif(getenv("REMOTE_ADDR")&&strcasecmp(getenv("REMOTE_ADDR"),"unknown"))
$ip=getenv("REMOTE_ADDR");
elseif(isset($_SERVER['REMOTE_ADDR'])&&$_SERVER['REMOTE_ADDR']&&strcasecmp($_SERVER['REMOTE_ADDR'],"unknown"))
$ip=$_SERVER['REMOTE_ADDR'];
else
$ip="unknown";
return($ip);
}
❸ 如何利用php獲取url反向代理後面的真實地址
下面的代碼用於獲得真實的客戶端ip,俗話說,道高一尺魔高一丈,更高級的偽裝能夠騙過這種檢測也有可能,不過至少讓偽裝的門檻提高不少。
function getip() {
$unknown = 'unknown';
if ( isset($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARDED_FOR'] && strcasecmp($_SERVER['HTTP_X_FORWARDED_FOR'], $unknown) ) {
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} elseif ( isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], $unknown) ) {
$ip = $_SERVER['REMOTE_ADDR'];
}
/*
處理多層代理的情況
或者使用正則方式:$ip = preg_match("/[\d\.]{7,15}/", $ip, $matches) ? $matches[0] : $unknown;
*/
if (false !== strpos($ip, ','))
$ip = reset(explode(',', $ip));
return $ip;
}
需要做下簡單解釋:
一、沒有使用代理伺服器的PHP獲取客戶端IP情況:
REMOTE_ADDR = 客戶端IP
HTTP_X_FORWARDED_FOR = 沒數值或不顯示
二、使用透明代理伺服器的情況:Transparent Proxies
REMOTE_ADDR = 最後一個代理伺服器 IP
HTTP_X_FORWARDED_FOR = 客戶端真實 IP (經過多個代理伺服器時,這個值類似:221.5.252.160, 203.98.182.163, 203.129.72.215)
這類代理伺服器還是將客戶端真實的IP發送給了訪問對象,無法達到隱藏真實身份的目的.
三、使用普通匿名代理伺服器的PHP獲取客戶端IP情況:Anonymous Proxies
REMOTE_ADDR = 最後一個代理伺服器 IP
HTTP_X_FORWARDED_FOR = 代理伺服器 IP (經過多個代理伺服器時,這個值類似:203.98.182.163, 203.98.182.163, 203.129.72.215)
這種情況下隱藏了客戶端的真實IP,但是向訪問對象透露了客戶端是使用代理伺服器訪問它們的.
四、使用欺騙性代理伺服器的情況:Distorting Proxies
REMOTE_ADDR = 代理伺服器 IP
HTTP_X_FORWARDED_FOR = 隨機的 IP(經過多個代理伺服器時,這個值類似:220.4.251.159, 203.98.182.163, 203.129.72.215)
這種情況下同樣透露了客戶端是使用了代理伺服器,但編造了一個虛假的隨機IP(220.4.251.159)代替客戶端的真實IP來欺騙它.
五、使用高匿名代理伺服器的PHP獲取客戶端IP情況:High Anonymity Proxies (Elite proxies)
REMOTE_ADDR = 代理伺服器 IP
HTTP_X_FORWARDED_FOR = 沒數值或不顯示
無論是REMOTE_ADDR還是HTTP_FORWARDED_FOR,這些頭消息未必能夠取得到,因為不同的瀏覽器不同的網路設備可能發送不同的IP頭消息.因此PHP使用$_SERVER["REMOTE_ADDR"] 、$_SERVER["HTTP_X_FORWARDED_FOR"] 獲取的值可能是空值也可能是「unknown」值.
❹ PHP怎麼禁止代理訪問
要禁止代理訪問,首先你要分辨對方是否使用了代理。
一般來說可以直接通過HTTP協議頭中的REMOTE_ADDR、HTTP_VIA、HTTP_X_FORWARDED_FOR來判斷。
比如,沒有使用代理的情況下,後兩個一般是空的,第一個為真實IP;
而使用了一般的代理的話,前兩個會變成代理的IP,而第三個則是真實IP。
如果使用了一般的匿名代理的話,則三個都會變為代理的IP。
如果使用了欺騙型的匿名代理的話,前兩個還是代理的IP,而第三個會被偽造為一個隨機的IP。
如果使用了高級匿名代理的話,後兩個和沒有代理一樣,是空的,第一個則為代理IP。
以上,由於HTTP協議頭是很容易偽造的,一般很難判斷用戶是否使用了代理的,因為現在絕大多數人都是用的匿名代理,而一般要真的通過上面的方式能檢測到的,很可能是只能通過代理訪問網路的人,比如區域網之類。
不過如果你會JS的話,可以參考一下WebRTC,這個是HTML5帶的一個API,可以直接獲取到真實IP,然後發送回伺服器,再和REMOTE_ADDR比對一下,就可以准確知道是否使用了代理了(使用了代理,那WebRTC獲取到的肯定是和REMOTE_ADDR不一樣的)。但是這個辦法也僅限於使用了新版瀏覽器的用戶(必須支持WebRTC),並且沒有裝屏蔽WebRTC的插件(可以通過Chrome的插件來禁用WebRTC的,較舊的瀏覽器也可以在配置里停用WebRTC),並且,也不是完全不可以偽造,因為隨便寫個腳本放在瀏覽器里替換掉默認的WebRTC API,就可以提供一個虛假的IP(不過就目前來看還沒人這么干,大多數都是想辦法直接停用WebRTC),所以這個辦法也不是100%可靠的。
如果你可以准確判斷代理了,就簡單了,直接在代碼裡面die;掉就行了。
❺ php獲得客戶端的ip和埠號
$_SERVER['REMOTE_PORT'];//埠號
$_SERVER['SERVER_ADDR'];//ip
//補充
$_SERVER['HTTP_CLIENT_IP'];//代理端的(有可能存在,可偽造)
$_SERVER['HTTP_X_FORWARDED_FOR'];//用戶是在哪個IP使用的代理(有可能存在,也可以偽造)
❻ 各位大蝦,我現在需要利用php程序獲得無線路由器里的客戶端mac地址或者ip有沒有什麼好的方案。求完整代碼
function ip(){
if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')){
$ip = getenv('HTTP_CLIENT_IP');
}elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')){
$ip = getenv('HTTP_X_FORWARDED_FOR');
}elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')){
$ip = getenv('REMOTE_ADDR');
}elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')){
$ip = $_SERVER['REMOTE_ADDR'];
}
return preg_match("/[\d\.]{7,15}/", $ip, $matches) ? $matches[0] : 'unknown';
}
回復 cheleimccoy:上面的程序函數,是用來獲取訪問你的網站的用戶的瀏覽器端的ip的!其實你的無線路由使用瀏覽器來訪問的時候也是訪問的他的80埠,你其實可以想辦法能不能把他裡面的程序對接獲取下