ProxyDetected.php 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. <?php
  2. /**
  3. * 检测用户是否是通过代理服务器访问
  4. *
  5. * 用法:
  6. * $proxyDetected = \Qii\Library\new ProxyDetected();
  7. * $isProxy = $proxyDetected->isProxy();
  8. */
  9. namespace Qii\Library;
  10. class ProxyDetected
  11. {
  12. // HTTP-Proxy-Headers
  13. protected $proxyHeaders = array(
  14. 'HTTP_X_FORWARDED_FOR',
  15. 'HTTP_X_FORWARDED',
  16. 'HTTP_X_REAL_IP',
  17. 'HTTP_X_CLIENT_IP',
  18. 'HTTP_X_FORWARDED_HOST',
  19. 'HTTP_X_FORWARDED_SERVER',
  20. 'HTTP_FORWARDED_FOR',
  21. 'HTTP_CLIENT_IP',
  22. 'HTTP_VIA',
  23. 'HTTP_FORWARDED',
  24. 'HTTP_FORWARDED_FOR_IP',
  25. 'VIA',
  26. 'X_FORWARDED_FOR',
  27. 'FORWARDED_FOR',
  28. 'X_FORWARDED',
  29. 'FORWARDED',
  30. 'CLIENT_IP',
  31. 'FORWARDED_FOR_IP',
  32. 'HTTP_PROXY_CONNECTION'
  33. );
  34. //Ports to scan
  35. protected $scanPorts = array(
  36. 80,
  37. 443,
  38. 3128,
  39. 8080,
  40. );
  41. //List of ports to compare with the remoteport.
  42. protected $ports = array(
  43. 78,
  44. 79,
  45. 80,
  46. 81,
  47. 82,
  48. 83,
  49. 443,
  50. 3128,
  51. 8080,
  52. 8081,
  53. 8090,
  54. 8181,
  55. 8282,
  56. 8888,
  57. 9050,
  58. 9999
  59. );
  60. function isProxy($ip = null)
  61. {
  62. if(!$ip){
  63. $ip = $_SERVER["REMOTE_PORT"];
  64. }
  65. foreach ($this->proxyHeaders as $header) {
  66. if (isset($_SERVER[$header])) {
  67. return true;
  68. }
  69. }
  70. foreach ($this->scanPorts as $port) {
  71. if (@fsockopen($ip, $port, $errstr, $errno, 1)) {
  72. return true;
  73. }
  74. }
  75. foreach ($this->ports as $port) {
  76. if ($ip == $port) {
  77. return true;
  78. }
  79. }
  80. return false;
  81. }
  82. }