কোন $ _SERVER ভেরিয়েবল নিরাপদ?


97

কোনও ব্যবহারকারী পরিবর্তন করতে পারে এমন কোনও পরিবর্তনশীল, একজন আক্রমণকারীও নিয়ন্ত্রণ করতে পারে এবং সেজন্য আক্রমণটির উত্স। এটিকে "কলঙ্কিত" পরিবর্তনশীল বলা হয় এবং এটি অনিরাপদ।

ব্যবহার করার সময় $_SERVER, অনেকগুলি ভেরিয়েবল নিয়ন্ত্রণ করা যায়। PHP_SELF, HTTP_USER_AGENT, HTTP_X_FORWARDED_FOR, HTTP_ACCEPT_LANGUAGEএবং আরও অনেক কিছু HTTP অনুরোধ ক্লায়েন্ট দ্বারা প্রেরিত শিরোনামের একটা অংশ।

কেউ কি "নিরাপদ তালিকা" বা $_SERVERভেরিয়েবলের অবিচ্ছিন্ন তালিকা সম্পর্কে জানেন ?


8
আপনি কীভাবে "নিরাপদ" সংজ্ঞা দেন তার উপর নির্ভর করে end মানগুলি যেমন আছে তেমন নিরাপদ , এটি কেবলমাত্র আপনি কী ব্যবহার করেন তা নির্ভর করে।
ছদ্মবেশ

6
আমি এই প্রসঙ্গে মনে করি, রুক বলছে "কোন সার্ভারের ভেরিয়েবলগুলি ব্যবহারকারী দ্বারা স্পুফ করা যায় না" যেমন REMOTE_ADDR
vcsjones

6
যে কোনও HTTP_কিছুর পূর্ববর্তী হওয়া হ'ল একটি অনুরোধ শিরোনাম এবং এর মধ্যে ব্রাউজার বা প্রক্সি সেট করা যেতে পারে। আমি তাদের অন্য কোনও ব্যবহারকারী ইনপুট হিসাবে বিবেচনা করব।
ডেটাজেজ

4
@ বব-দ্য ডেস্ট্রোয়ার REMOTE_ADDR সরাসরি অ্যাপাচের টিসিপি সকেট থেকে টানছে , তিন ধরণের হ্যান্ডশেকের কারণে এই মানটি ইন্টারনেটে ছড়িয়ে দেওয়া যায় না।
রোক

4
@ রুক: ভাল পয়েন্ট। আমি "স্পোফিং" এর উল্লেখ সহ অনুমান করি, আমি কোনও প্রকারের আসল মানকে ফাঁকি না দিয়ে আইপি স্পুফিংয়ের পুরানো কাজটির দিকে বেশি ঝুঁকে পড়েছিলাম REMOTE_ADDR। এবং এটি এই প্রশ্নের আওতার বাইরে হবে। এই মানটি কীভাবে সেট করা হয়েছে সে সম্পর্কে কিছুটা অন্তর্দৃষ্টি পাওয়া ভাল, তাই ধন্যবাদ।
বব-দি-

উত্তর:


147

"নিরাপদ" বা "অনিরাপদ" মানগুলির মতো কোনও জিনিস নেই। সার্ভারটি কেবলমাত্র মানগুলি নিয়ন্ত্রণ করে এবং মানগুলি ব্যবহার করে যা ব্যবহারকারীরা নিয়ন্ত্রণ করে এবং আপনাকে কোনও মানটি কোথা থেকে আসে সে সম্পর্কে সচেতন হওয়া দরকার এবং তাই এটি কোনও নির্দিষ্ট উদ্দেশ্যে বিশ্বস্ত করা যায় কিনা। $_SERVER['HTTP_FOOBAR']উদাহরণস্বরূপ কোনও ডাটাবেসে সংরক্ষণ করা সম্পূর্ণ নিরাপদ, তবে আমি অবশ্যই এটি করব না eval

এর মতো, আসুন এই মানগুলিকে তিনটি বিভাগে ভাগ করা যাক:

সার্ভার নিয়ন্ত্রিত

এই ভেরিয়েবলগুলি সার্ভার পরিবেশ দ্বারা সেট করা হয় এবং সম্পূর্ণরূপে সার্ভার কনফিগারেশনের উপর নির্ভর করে।

  • 'GATEWAY_INTERFACE'
  • 'SERVER_ADDR'
  • 'SERVER_SOFTWARE'
  • 'DOCUMENT_ROOT'
  • 'SERVER_ADMIN'
  • 'SERVER_SIGNATURE'

আংশিক সার্ভার নিয়ন্ত্রিত

এই ভেরিয়েবলগুলি ক্লায়েন্টকে প্রেরিত নির্দিষ্ট অনুরোধের উপর নির্ভর করে, তবে কেবলমাত্র বৈধ মানগুলির একটি সীমিত সংখ্যক গ্রহণ করতে পারে, যেহেতু সমস্ত অবৈধ মান ওয়েব সার্ভারের দ্বারা প্রত্যাখ্যান করা উচিত এবং স্ক্রিপ্টের অনুরোধটি শুরু করার কারণ নয়। সুতরাং এগুলি নির্ভরযোগ্য হিসাবে বিবেচনা করা যেতে পারে ।

  • 'HTTPS'
  • 'REQUEST_TIME'
  • 'REMOTE_ADDR' *
  • 'REMOTE_HOST' *
  • 'REMOTE_PORT' *
  • 'SERVER_PROTOCOL'
  • 'HTTP_HOST'
  • 'SERVER_NAME'
  • 'SCRIPT_FILENAME'
  • 'SERVER_PORT'
  • 'SCRIPT_NAME'

* REMOTE_টিসিপি / আইপি হ্যান্ডশেক দ্বারা যাচাই করা হিসাবে মানগুলি ক্লায়েন্টের বৈধ ঠিকানা হতে গ্যারান্টিযুক্ত। এটি সেই ঠিকানা যেখানে কোনও প্রতিক্রিয়া পাঠানো হবে। REMOTE_HOSTযদিও বিপরীত ডিএনএস লুকআপের উপর নির্ভর করে এবং তাই এটি আপনার সার্ভারের বিরুদ্ধে ডিএনএস আক্রমণ দ্বারা ছদ্মবেশী হতে পারে (এক্ষেত্রে আপনার যে কোনও সমস্যা হতে পারে)। এই মানটি একটি প্রক্সি হতে পারে, এটি টিসিপি / আইপি প্রোটোকলের একটি সাধারণ বাস্তবতা এবং আপনি কিছুই করতে পারেন না এমন কিছুই।

Your যদি আপনার ওয়েব সার্ভার শিরোনাম নির্বিশেষে কোনও অনুরোধের প্রতিক্রিয়া জানায় তবে এটিকেও HOSTঅনিরাপদ হিসাবে বিবেচনা করা উচিত। দেখুন safe _SERVER ["HTTP_HOST"] কতটা নিরাপদ?
এছাড়াও http://shiflett.org/blog/2006/mar/server-name-versus-http-host দেখুন

‡ দেখুন https://bugs.php.net/bug.php?id=64457 , http://httpd.apache.org/docs/current/mod/core.html#usecanonicalphysicalport , HTTP: //httpd.apache। org / ডকস / 2.4 / মোড / কোর html # মন্তব্য_999

সম্পূর্ণ নির্বিচারে ব্যবহারকারী নিয়ন্ত্রিত মান

এই মানগুলি একেবারেই চেক করা হয় না এবং কোনও সার্ভার কনফিগারেশনের উপর নির্ভর করে না, সেগুলি ক্লায়েন্টের দ্বারা প্রেরিত সম্পূর্ণরূপে স্বেচ্ছাচারিত তথ্য।

  • 'argv', 'argc'(কেবলমাত্র সি এল এলির অনুরোধেই প্রযোজ্য, সাধারণত ওয়েব সার্ভারগুলির জন্য উদ্বেগ নয়)
  • 'REQUEST_METHOD' §
  • 'QUERY_STRING'
  • 'HTTP_ACCEPT'
  • 'HTTP_ACCEPT_CHARSET'
  • 'HTTP_ACCEPT_ENCODING'
  • 'HTTP_ACCEPT_LANGUAGE'
  • 'HTTP_CONNECTION'
  • 'HTTP_REFERER'
  • 'HTTP_USER_AGENT'
  • 'AUTH_TYPE'
  • 'PHP_AUTH_DIGEST'
  • 'PHP_AUTH_USER'
  • 'PHP_AUTH_PW'
  • 'PATH_INFO'
  • 'ORIG_PATH_INFO'
  • 'REQUEST_URI' (কলঙ্কযুক্ত ডেটা থাকতে পারে)
  • 'PHP_SELF' (কলঙ্কযুক্ত ডেটা থাকতে পারে)
  • 'PATH_TRANSLATED'
  • অন্য কোন 'HTTP_'মান

Server যতক্ষণ না ওয়েব সার্ভার কেবলমাত্র কিছু নির্দিষ্ট অনুরোধের পদ্ধতির অনুমতি দেয় ততক্ষণ নির্ভরযোগ্য হিসাবে বিবেচিত হতে পারে ।

Authe সত্যতা ওয়েব সার্ভার দ্বারা সম্পূর্ণরূপে পরিচালিত হলে নির্ভরযোগ্য হিসাবে বিবেচিত হতে পারে ।

সুপারগ্লোবলে $_SERVERবেশ কয়েকটি পরিবেশের ভেরিয়েবলও রয়েছে। এগুলি "নিরাপদ" কিনা এবং কীভাবে (এবং কোথায়) সেগুলি সংজ্ঞায়িত করা হয় তার উপর নির্ভর করে। এগুলি সম্পূর্ণ সার্ভার নিয়ন্ত্রিত থেকে সম্পূর্ণ ব্যবহারকারী নিয়ন্ত্রিত হতে পারে।


4
@ রুক তবে যেমনটি আমি বলেছিলাম, আপনি এটি কীভাবে ব্যবহার করেন এটির উপর নির্ভর করে । কেবল নিজেরাই মানগুলি নিরাপদ বা অনিরাপদ নয়, এটি আপনি কী ব্যবহার করেন তার উপর নির্ভর করে । এমনকি কোনও ঘৃণ্য ব্যবহারকারীর কাছ থেকে প্রেরিত ডেটা ততক্ষণ নিরাপদ থাকে যতক্ষণ আপনি এটির সাথে এমন কিছু করেন না যা আপনার সুরক্ষাকে আপস করতে পারে।
ছদ্মবেশ

4
@ রুক: আপনার "নিরাপদ" ধারণাটি এই প্রশ্নটিকে কিছুটা স্বচ্ছন্দ মনে করে, বিশেষত যেহেতু এটি সম্পূর্ণরূপে একটি অস্পষ্ট এক্সটেনশন বা পিএইচপি-র কাস্টম সংস্করণে আবদ্ধ। আপনি যখন বলছেন যে "হিপ থেকে" অঙ্কন "করা উচিত নয়" তবে এই মানগুলি কীভাবে সেট করা আছে তা খুঁজে পাওয়ার জন্য কোনও উত্তর আসলে পিএইচপি উত্সকোডের সাথে ন্যূনতম পরিচিতির প্রয়োজন বলে মনে হয়। পিএইচপি ডেভেলস ইমেলগুলি উত্তর খোঁজার জন্য আরও ভাল পদ্ধতির হতে পারে না?
বব-দি-

4
@ রুক: বিচ্ছিন্নতা। প্রতারণার ইঙ্গিত হিসাবে, "কী উদ্দেশ্যে নিরাপদ"। আমি যেমন ইঙ্গিত দিয়েছি, আপনার উদ্দেশ্য অজানা, এবং $_SERVERফাইলটি কীভাবে পরিবেশিত হবে তার উপর নির্ভর করে আরও কয়েকটি অননুমোদিত মান রয়েছে। আমার মতে, নথিভুক্তরা প্রকৃত উত্সটি স্পষ্ট করে না। অন্যথায় আমি বিশ্বাস করি আপনি এই প্রশ্ন জিজ্ঞাসা করা হবে না। আপনি যে তালিকাটি ব্যবহার করতে পারেন তা পেয়ে খুশি। তবে আমি এখনও একটি বাগ রিপোর্ট জমা দেওয়ার পরামর্শ দিচ্ছি (যখন তাদের বাগ সাইটটি স্থির হয়ে থাকে), ডক রক্ষণাবেক্ষণকারীদের একটি ইমেল প্রেরণ করা বা ডক্সটি নিজেই আপডেট করার (যদি আপনি লিঙ্কটি প্রাইভেট হন)। এটি সম্প্রদায়ের এই তথ্যটি জানার পক্ষে উপকৃত হবে।
বব-দ্য-ডেস্ট্রয়ার

4
SERVER_NAMEঅগত্যা সার্ভার দ্বারা নিয়ন্ত্রিত হয় না। গেটওয়ে এবং সেটিংসের উপর নির্ভর করে এটি থেকে সদৃশ হতে পারে HTTP_HOSTএবং তাই একই ক্যাভিয়েটের সাপেক্ষে।
ববিনস

4
@ রেকস @ রুকের কি SERVER_PORTসেই ছোট ক্রস দরকার? bugs.php.net/bug.php?id=64457
দেজন

12

পিএইচপি-তে প্রতিটি $_SERVERচলক HTTP_ব্যবহারকারী দ্বারা প্রভাবিত হতে পারে with উদাহরণস্বরূপ, ভেরিয়েবলটি HTTP অনুরোধে একটি নির্বিচার $_SERVER['HTTP_REINERS']মানতে HTTP শিরোনাম সেট করে কল্পনা করা যায় REINERS


পুনরায় "নির্বিচারে"; তারা বিন্যাস অনুসারে সম্পূর্ণ নির্বিচারে নয়। উদাহরণস্বরূপ, $_SERVER['HTTP_REINERS'] বেশিরভাগ সেপিসের নীচে নিউলাইন অক্ষর থাকতে পারে না।
পেসারিয়ার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.