Apakah aman mempercayai $ _SERVER ['REMOTE_ADDR']?

89

Apakah aman untuk dipercaya $_SERVER['REMOTE_ADDR']? Bisakah itu diganti dengan mengubah header permintaan atau sesuatu seperti itu?

Amankah menulis sesuatu seperti itu?

if ($_SERVER['REMOTE_ADDR'] == '222.222.222.222') { // my ip address
    $grant_all_admin_rights = true;
}
Cahaya Perak
sumber
3
Menambah jawaban yang ada, itu akan selalu menjadi alamat IP yang membuat permintaan ke server Anda, tetapi itu tidak berarti alamat IP komputer yang memulai permintaan. Sejumlah server proxy dapat berada di antara Anda dan pengguna akhir, dan yang paling dekat dengan Anda adalah alamat IP yang Anda dapatkan.
Dan Grossman
ya itu aman karena tidak dapat digantikan oleh trik lain atau kecurangan. tapi pastikan Anda menambahkan lebih banyak cek untuk variabel $ grant_all_admin_rights.
Yuda Prawira
Variabel $ _SERVER apa pun dapat dipalsukan - misalnya curl_setopt ($ ch, CURLOPT_HTTPHEADER, array ("REMOTE_ADDR: $ ip", "HTTP_X_FORWARDED_FOR: $ ip")); Jadi itu sepenuhnya tergantung pada konteks: jika penyerang mengharapkan tanggapan, itu akan kembali ke $ ip. Jika mereka tidak peduli dengan responsnya, mereka pasti bisa menipu header. Jika kode Anda setelah cek header malah berkata: "open_the_door_to_badguys ();" kamu akan punya masalah.
TMG
3
@TMG Anda tidak dapat memalsukan $_SERVER['REMOTE_ADDR']variabel dengan menyetel header permintaan HTTP. PHP secara otomatis mengawali semua header permintaan HTTP dengan HTTP_saat membuat kunci di $_SERVERsuperglobal.
MrWhite

Jawaban:

110

Ya, aman. Ini adalah IP sumber dari koneksi TCP dan tidak dapat diganti dengan mengubah header HTTP.

Satu kasus yang mungkin ingin Anda khawatirkan adalah jika Anda berada di belakang proxy balik dalam hal ini REMOTE_ADDR akan selalu menjadi IP server proxy dan IP pengguna akan disediakan dalam header HTTP (seperti X-Forwarded-For ). Tetapi untuk kasus penggunaan normal, REMOTE_ADDR baik-baik saja.

sagi
sumber
4
Bagaimana dengan spoofing alamat IP?
Abdull
1
@Abdull Orang yang dapat melakukannya biasanya adalah orang yang sama yang memiliki akses fisik ke kotak Anda. jadi jangan terlalu khawatir tentang itu.
Behrooz
5
@Abdull IP spoofing hanya dapat mengirim pesan dengan satu cara, Anda tidak dapat memalsukan IP Anda dan mendapatkan pesan sebagai balasannya.
1
Bukankah router internet memeriksa IP sumber dan tujuan untuk merutekan paket? Saya ragu bahwa paket palsu akan mencapai tujuan di seluruh node internet.
Viktor Joras
57

$_SERVER['REMOTE_ADDR']adalah alamat IP tempat koneksi TCP masuk. Meskipun secara teknis mungkin untuk memalsukan alamat IP secara dua arah di Internet (dengan mengumumkan rute busuk melalui BGP), serangan tersebut kemungkinan besar akan terlihat dan tidak tersedia untuk penyerang biasa - pada dasarnya, penyerang Anda harus memiliki kendali atas ISP atau operator. Tidak ada serangan spoofing searah yang layak terhadap TCP (belum). Spoofing IP dua arah sepele di LAN.

Ketahuilah juga bahwa ini mungkin bukan IPv4, tetapi alamat IPv6. Pemeriksaan Anda saat ini baik-baik saja dalam hal itu, tetapi jika Anda ingin memeriksa itu 1.2.3.4hanya terjadi di mana saja di dalam $_SERVER['REMOTE_ADDR'], penyerang dapat langsung terhubung dari 2001:1234:5678::1.2.3.4.

Singkatnya, untuk apa pun selain aplikasi kritis (perbankan / militer / potensi kerusakan> 50.000 €), Anda dapat menggunakan alamat IP jarak jauh jika Anda dapat mengecualikan penyerang di jaringan lokal Anda.

phihag
sumber
4
Anda terdengar sangat paham tentang Protokol Internet.
Brian Peterson
@phihag, Apakah $_SERVER['REMOTE_ADDR']alamat IP tempat koneksi TCP masuk sepenuhnya bergantung pada SAPI Anda.
Pacerier
jauh dari tak tertandingi bagi penyerang pada WEP / WPA WLAN untuk menendang klien sebenarnya, dan memalsukan alamat ip itu - baik WEP dan WPA memiliki kelemahan yang membuat you have been kicked off the wlanpaket spoofing mudah dibuat dengan alat yang tepat. google WPA downgrade test, misalnya
hanshenrik
Alamat IP adalah tingkat IP bukan tingkat TCP.
Viktor Joras
3

Seperti disebutkan di atas, ini tidak sepenuhnya aman. Tapi itu tidak berarti, Anda tidak boleh menggunakannya. Pertimbangkan untuk menggabungkan ini dengan beberapa metode otentikasi lain, misalnya memeriksa nilai COOKIE.

Audio
sumber
7
Setelah memalsukan alamat IP, mengubah permintaan http dan mengirim cookie palsu adalah hal yang mudah ..... (atau sepotong kue)
Uri Goren
1
Tolong jelaskan apa yang Anda maksud dengan "tidak benar-benar aman"
Jake