এইচটিএমএল / পিএইচপি দিয়ে এক্সএসএস কীভাবে প্রতিরোধ করবেন?


256

আমি কীভাবে এক্সএমএস (ক্রস-সাইট স্ক্রিপ্টিং) কেবলমাত্র এইচটিএমএল এবং পিএইচপি ব্যবহার করে প্রতিরোধ করব?

আমি এই বিষয়টিতে আরও অনেক পোস্ট দেখেছি কিন্তু আমি এমন একটি নিবন্ধ পাইনি যা স্পষ্টভাবে এবং সংক্ষিপ্তভাবে জানায় যে কীভাবে এক্সএসএসকে প্রতিরোধ করতে হয়।


3
কেবলমাত্র একটি নোট যে এটি কোনও সমস্যার সমাধান করবে না যেখানে আপনি এইচটিএমএল বৈশিষ্ট্য হিসাবে ব্যবহারকারী ইনপুট ব্যবহার করতে চাইতে পারেন। উদাহরণস্বরূপ, একটি চিত্রের উত্স URL। সাধারণ ঘটনা নয়, তবে ভুলে যাওয়া সহজ।
মাইকেল মায়ার

@MichaelMior এখানে আটকান পদ্ধতি এটা XSS একটি সমাধান hrefবা src: এইচটিএমএল অ্যাট্রিবিউট stackoverflow.com/questions/19047119/...
baptx

এখানে একটি দুর্দান্ত নিবন্ধ রয়েছে যা এক্সএসএস এবং কীভাবে এটি বিভিন্ন ভাষায় প্রতিরোধ করতে পারে তা ব্যাখ্যা করে (পিএলপি পিএইচপি)।
এক্সকোর

উত্তর:


296

আপনি htmlspecialchars()যখনই ইনপুট থেকে আসা ব্রাউজারে কিছু আউটপুট করতে চান তখন মূলত আপনাকে ফাংশনটি ব্যবহার করতে হবে ।

এই ফাংশনটি ব্যবহারের সঠিক উপায়টি হ'ল এইরকম:

echo htmlspecialchars($string, ENT_QUOTES, 'UTF-8');

গুগল কোড বিশ্ববিদ্যালয়ে ওয়েব সুরক্ষা সম্পর্কিত এগুলি খুব শিক্ষামূলক ভিডিও রয়েছে:


7
@ টিমটাইম: বেশিরভাগ ক্ষেত্রে হ্যাঁ। যাইহোক, যখন আপনাকে এইচটিএমএল ইনপুট জিনিসগুলিকে কিছুটা কৌতুকপূর্ণ পেতে দেয় এবং যদি এটি হয় তবে আমি আপনাকে htmlpurifier.org এর
অ্যালিক্স এক্সেল

অ্যালিক্স অ্যাক্সেল, আপনার এইচটিএমএল স্পেশালচার্স ব্যবহার করার জন্য বা এইচটিএমএলপুরিফায়ার.অর্গ ব্যবহার করার উত্তর কী ?
টিমটাইম

3
যদি আপনার এইচটিএমএল ইনপুট ব্যবহার না করা হয় তবে HTML পিউরিফায়ার ব্যবহার করতে হবে htmlspecialchars()
অ্যালিক্স অ্যাক্সেল

9
এইচটিএমএল স্পেশালচার্স বা এইচটিএমলেটিটিস? এখানে চেক করুন stackoverflow.com/questions/46483/...
kiranvj

4
বেশিরভাগ সময় এটি সঠিক হয় তবে এটি এতটা সহজ নয়। আপনার এইচটিএমএল, জেএস, সিএসএসে অবিশ্বস্ত স্ট্রিং বিবেচনা করা উচিত এবং এইচটিএমএলতে অবিশ্বস্ত এইচটিএমএলকে বিবেচনা করা উচিত। এটি দেখুন: owasp.org/index.php/…
ব্রোঞ্জের মানুষ

41

আমার প্রিয় ওডাব্লুএএসপি রেফারেন্সগুলির মধ্যে একটি হ'ল ক্রস-সাইট স্ক্রিপ্টিং ব্যাখ্যা কারণ সেখানে প্রচুর পরিমাণে এক্সএসএস আক্রমণ ভেক্টর রয়েছে, কয়েকটি বিধি নিম্নলিখিত নিম্নলিখিতগুলির বেশিরভাগের বিরুদ্ধে রক্ষা করতে পারে!

এটি পিএইচপি সুরক্ষা চিট শীট


7
আমিও .. এটি এক্সএসএস ফিল্টার ফাঁকি

1
ঠিক এক্সএসএস নয়, তবে আমি মনে করি এক্সএসএস এবং সিএসআরএফ
সাইমন

2
এই পৃষ্ঠাটির আর অস্তিত্ব নেই
মজজি


15

সর্বাধিক গুরুত্বপূর্ণ পদক্ষেপগুলির মধ্যে একটি হ'ল যে কোনও ব্যবহারকারীর ইনপুটটি প্রক্রিয়া করার আগে এবং / অথবা ব্রাউজারে ফেরত দেওয়ার আগে স্যানিটাইজ করা। পিএইচপি কিছু " ফিল্টার আছে " ফাংশন রয়েছে যা ব্যবহার করা যায়।

এক্সএসএস সাধারণত যে ফর্মটি আক্রমণ করে তা হ'ল কিছু অফ-সাইট জাভাস্ক্রিপ্টের একটি লিঙ্ক sertোকানো যাতে ব্যবহারকারীর জন্য ক্ষতিকারক উদ্দেশ্য রয়েছে। এটি সম্পর্কে এখানে আরও পড়ুন ।

আপনি নিজের সাইটটিও পরীক্ষা করতে চাইবেন - আমি এক্সএসএস মেসে ফায়ারফক্সের প্রস্তাব দিতে পারি ।


আমি ঠিক কী থেকে ইনপুট স্যানিটাইজ করে তা নিশ্চিত করতে আমার কী দরকার। আমি কি একটি বিশেষ চরিত্র / স্ট্রিং জন্য নজর রাখতে হবে?
টিমটাইম

27
@ টিমটাইম - না সমস্ত ব্যবহারকারীর ইনপুট সর্বদা সহজাত প্রতিকূল হিসাবে বিবেচনা করা উচিত ।
জুমব্যাট

এছাড়াও, অভ্যন্তরীণ ডেটা (কর্মচারী, সিসাদমিন ইত্যাদি) অনিরাপদ হতে পারে। আপনাকে ব্যাখ্যার সাথে প্রদর্শিত (লগের তারিখ এবং ব্যবহারকারীর সাথে) ডেটা সনাক্ত এবং নিরীক্ষণ করা উচিত।
স্যামুয়েল ড্যাজন

9

পছন্দ অনুসারে:

  1. যদি আপনি কোনও টেম্পলেটিং ইঞ্জিন ব্যবহার করেন (যেমন ট্যুইগ, স্মার্ট, ফলক), এটি পরীক্ষা করুন যে এটি প্রাসঙ্গিক-সংবেদনশীল পলায়নের প্রস্তাব করে। টুইগের অভিজ্ঞতা থেকে আমি জানি।{{ var|e('html_attr') }}
  2. আপনি যদি এইচটিএমএলকে অনুমতি দিতে চান তবে এইচটিএমএল পিউরিফায়ার ব্যবহার করুন । এমনকি আপনি যদি মনে করেন যে আপনি কেবল মার্কডাউন বা পুনর্গঠিত পাঠ্য গ্রহণ করেন, আপনি এখনও এই মার্কআপ ল্যাঙ্গুয়েজ আউটপুট এইচটিএমএলকে বিশুদ্ধ করতে চান।
  3. অন্যথায়, ব্যবহার করুন htmlentities($var, ENT_QUOTES | ENT_HTML5, $charset)এবং নিশ্চিত করুন যে আপনার বাকী নথিটি একই অক্ষর সেট হিসাবে ব্যবহার করেছে $charset। বেশিরভাগ ক্ষেত্রে, 'UTF-8'পছন্দসই অক্ষর সেট।

এছাড়াও, নিশ্চিত হয়ে নিন যে আপনি আউটপুট থেকে পালিয়েছেন, ইনপুটটিতে নয়


7

এটি অফলাইনে চলছে এমন এসও ডকুমেন্টেশন বিটা থেকে একীভূত রেফারেন্স হিসাবে ক্রস পোস্টিং।

সমস্যা

ক্রস-সাইট স্ক্রিপ্টিং কোনও ওয়েব ক্লায়েন্টের দ্বারা রিমোট কোডের অনিচ্ছাকৃত সম্পাদন execution কোনও ওয়েব অ্যাপ্লিকেশন XSS- এ নিজেকে প্রকাশ করতে পারে যদি এটি কোনও ব্যবহারকারীর কাছ থেকে ইনপুট নেয় এবং এটি সরাসরি কোনও ওয়েব পৃষ্ঠায় আউটপুট করে। যদি ইনপুটটিতে এইচটিএমএল বা জাভাস্ক্রিপ্ট অন্তর্ভুক্ত থাকে তবে ওয়েব ক্লায়েন্ট দ্বারা এই সামগ্রীটি রেন্ডার করা হলে দূরবর্তী কোড কার্যকর করা যেতে পারে।

উদাহরণস্বরূপ, যদি কোনও তৃতীয় পক্ষের একটি জাভাস্ক্রিপ্ট ফাইল থাকে:

// http://example.com/runme.js
document.write("I'm running");

এবং একটি পিএইচপি অ্যাপ্লিকেশন সরাসরি এতে প্রবেশ করে একটি স্ট্রিং আউটপুট করে:

<?php
echo '<div>' . $_GET['input'] . '</div>';

যদি একটি চেক না করা জিইটি প্যারামিটার থাকে <script src="http://example.com/runme.js"></script>তবে পিএইচপি স্ক্রিপ্টের আউটপুট হবে:

<div><script src="http://example.com/runme.js"></script></div>

তৃতীয় পক্ষের জাভাস্ক্রিপ্ট চলবে এবং ব্যবহারকারী ওয়েব পৃষ্ঠায় "আমি চলমান" দেখবে।

সমাধান

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

মনে রাখবেন যে এমনকি সহজ অ্যাপ্লিকেশনগুলিতে ডেটা চারপাশে স্থানান্তরিত হতে পারে এবং সমস্ত উত্সের উপর নজর রাখা শক্ত হবে। সুতরাং সর্বদা আউটপুট এড়িয়ে চলা একটি সেরা অনুশীলন ।

পিএইচপি প্রসঙ্গের উপর নির্ভর করে আউটপুট এড়ানোর কয়েকটি উপায় সরবরাহ করে।

ফিল্টার ফাংশন

PHPs ফিল্টার ফাংশন পিএইচপি স্ক্রিপ্টের ইনপুট ডেটা করার অনুমতি sanitized বা যাচাই মধ্যে নানাভাবে । ক্লায়েন্ট ইনপুট সংরক্ষণ বা আউটপুট দেওয়ার সময় এগুলি কার্যকর।

এইচটিএমএল এনকোডিং

htmlspecialcharsযে কোনও "এইচটিএমএল বিশেষ অক্ষরগুলি" তাদের এইচটিএমএল এনকোডিংগুলিতে রূপান্তরিত করবে, যার অর্থ সেগুলি তখন স্ট্যান্ডার্ড এইচটিএমএল হিসাবে প্রক্রিয়া করা হবে না । এই পদ্ধতিটি ব্যবহার করে আমাদের পূর্ববর্তী উদাহরণটি ঠিক করতে:

<?php
echo '<div>' . htmlspecialchars($_GET['input']) . '</div>';
// or
echo '<div>' . filter_input(INPUT_GET, 'input', FILTER_SANITIZE_SPECIAL_CHARS) . '</div>';

আউটপুট হবে:

<div>&lt;script src=&quot;http://example.com/runme.js&quot;&gt;&lt;/script&gt;</div>

<div>ট্যাগের ভিতরে থাকা সমস্ত কিছুই ব্রাউজার দ্বারা জাভাস্ক্রিপ্ট ট্যাগ হিসাবে ব্যাখ্যা করা হবে না , পরিবর্তে একটি সাধারণ পাঠ্য নোড হিসাবে। ব্যবহারকারী নিরাপদে দেখতে পাবেন:

<script src="http://example.com/runme.js"></script>

ইউআরএল এনকোডিং

একটি গতিশীল উত্পাদিত ইউআরএল urlencodeআউটপুট করার সময় , পিএইচপি নিরাপদে বৈধ URL গুলি আউটপুট দেওয়ার জন্য ফাংশন সরবরাহ করে । সুতরাং, উদাহরণস্বরূপ, যদি কোনও ব্যবহারকারী ডেটা ইনপুট করতে সক্ষম হয় যা অন্য জিইটি প্যারামিটারের অংশ হয়ে যায়:

<?php
$input = urlencode($_GET['input']);
// or
$input = filter_input(INPUT_GET, 'input', FILTER_SANITIZE_URL);
echo '<a href="http://example.com/page?input="' . $input . '">Link</a>';

যে কোনও দূষিত ইনপুট একটি এনকোডযুক্ত ইউআরএল প্যারামিটারে রূপান্তরিত হবে।

বিশেষায়িত বাহ্যিক গ্রন্থাগার বা OWASP অ্যান্টি সামি তালিকা ব্যবহার করা

কখনও কখনও আপনি এইচটিএমএল বা অন্য ধরণের কোড ইনপুট প্রেরণ করতে চাইবেন। আপনাকে অনুমোদিত শব্দগুলির (সাদা তালিকা) এবং অন-অনুমোদিত (কালো তালিকাভুক্ত) একটি তালিকা বজায় রাখতে হবে।

আপনি ওডাব্লিউএএসপি অ্যান্টিস্যামি ওয়েবসাইটে উপলব্ধ স্ট্যান্ডার্ড তালিকাগুলি ডাউনলোড করতে পারেন । প্রতিটি তালিকা একটি নির্দিষ্ট ধরণের মিথস্ক্রিয়া জন্য উপযুক্ত (ইবে এপি, টিনিএমসিএ, ইত্যাদি ...)। এবং এটি ওপেন সোর্স।

এইচটিএমএল ফিল্টার করার জন্য এবং সাধারণ ক্ষেত্রে এক্সএসএস আক্রমণ প্রতিরোধ করতে এবং কমপক্ষে পাশাপাশি অ্যান্টিস্যামি তালিকাগুলি খুব সহজ ব্যবহারের সাথে সম্পাদনা করার জন্য রয়েছে গ্রন্থাগার রয়েছে। উদাহরণস্বরূপ আপনার এইচটিএমএল পিউরিফায়ার রয়েছে


5

অনেকগুলি ফ্রেমওয়ার্ক এক্সএসএসকে বিভিন্ন উপায়ে পরিচালনা করতে সহায়তা করে। আপনার নিজের ঘূর্ণায়নের সময় বা যদি কোনও এক্সএসএস উদ্বেগ থাকে, আমরা ফিল্টার_ইনপুট_আরয়ে (পিএইচপি 5> = 5.2.0, পিএইচপি 7 এ উপলব্ধ) পেতে পারি I ডেটার সাথে ইন্টারেক্ট করে। এই পদ্ধতিতে, সমস্ত ব্যবহারকারীর ইনপুট 1 কেন্দ্রীয় স্থানে স্যানিটাইজড হয়ে যায়। এটি যদি কোনও প্রকল্পের শুরুতে বা আপনার ডাটাবেসটিতে বিষাক্ত হওয়ার আগে করা হয়ে থাকে, আউটপুট দেওয়ার সময় আপনার কোনও সমস্যা হওয়া উচিত নয় ... আবর্জনা আটকে দেয়, আবর্জনা বাইরে বেরোবে।

/* Prevent XSS input */
$_GET   = filter_input_array(INPUT_GET, FILTER_SANITIZE_STRING);
$_POST  = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);
/* I prefer not to use $_REQUEST...but for those who do: */
$_REQUEST = (array)$_POST + (array)$_GET + (array)$_REQUEST;

উপরের সমস্ত HTML এবং স্ক্রিপ্ট ট্যাগগুলি মুছে ফেলবে । যদি আপনার এমন কোনও সমাধানের প্রয়োজন হয় যা কোনও শ্বেত তালিকার উপর ভিত্তি করে নিরাপদ ট্যাগগুলিকে মঞ্জুরি দেয় তবে এইচটিএমএল পিউরিফায়ার পরীক্ষা করে দেখুন ।


যদি আপনার ডেটাবেসটি ইতিমধ্যে বিষযুক্ত হয়ে থাকে বা আপনি এক্সপিএসের সাথে আউটপুট করার সময় ডিল করতে চান, OWASP এর জন্য একটি কাস্টম মোড়ক ফাংশন তৈরি করার পরামর্শ দেয় echoএবং এটি ব্যবহার করে আপনি ব্যবহারকারী-সরবরাহিত মানগুলি যেখানেই আউটপুট করেন:

//xss mitigation functions
function xssafe($data,$encoding='UTF-8')
{
   return htmlspecialchars($data,ENT_QUOTES | ENT_HTML401,$encoding);
}
function xecho($data)
{
   echo xssafe($data);
}

2

আপনি এর মাধ্যমে কিছু এক্সএসএস সম্পর্কিত HTTP প্রতিক্রিয়া শিরোনামও সেট করতে সক্ষম header(...)

এক্স-এক্সএসএস-সুরক্ষা "1; মোড = ব্লক"

নিশ্চিত হওয়ার জন্য, ব্রাউজারটি এক্সএসএস সুরক্ষা মোড সক্ষম করেছে।

সামগ্রী-সুরক্ষা-নীতি "ডিফল্ট-এসসিআর 'স্ব'; ..."

ব্রাউজারের দিকের সামগ্রী সুরক্ষা সক্ষম করতে। কনটেন্ট সিকিউরিটি পলিসি (সিএসপি) এর বিশদগুলির জন্য এটি দেখুন: http://content-security-policy.com/ বিশেষত ইনলাইন-স্ক্রিপ্টগুলি এবং বাহ্যিক স্ক্রিপ্ট উত্সগুলি ব্লক করতে সিএসপি স্থাপন এক্সএসএসের বিরুদ্ধে সহায়ক।

আপনার ওয়েবঅ্যাপের সুরক্ষা সম্পর্কিত একটি সাধারণ গুচ্ছ দরকারী এইচটিটিপি প্রতিক্রিয়া শিরোনামের জন্য, ওডাব্লুএএসপি দেখুন: https://www.owasp.org/index.php/List_of_useful_HTTP_headers


1
<?php
function xss_clean($data)
{
// Fix &entity\n;
$data = str_replace(array('&amp;','&lt;','&gt;'), array('&amp;amp;','&amp;lt;','&amp;gt;'), $data);
$data = preg_replace('/(&#*\w+)[\x00-\x20]+;/u', '$1;', $data);
$data = preg_replace('/(&#x*[0-9A-F]+);*/iu', '$1;', $data);
$data = html_entity_decode($data, ENT_COMPAT, 'UTF-8');

// Remove any attribute starting with "on" or xmlns
$data = preg_replace('#(<[^>]+?[\x00-\x20"\'])(?:on|xmlns)[^>]*+>#iu', '$1>', $data);

// Remove javascript: and vbscript: protocols
$data = preg_replace('#([a-z]*)[\x00-\x20]*=[\x00-\x20]*([`\'"]*)[\x00-\x20]*j[\x00-\x20]*a[\x00-\x20]*v[\x00-\x20]*a[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iu', '$1=$2nojavascript...', $data);
$data = preg_replace('#([a-z]*)[\x00-\x20]*=([\'"]*)[\x00-\x20]*v[\x00-\x20]*b[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iu', '$1=$2novbscript...', $data);
$data = preg_replace('#([a-z]*)[\x00-\x20]*=([\'"]*)[\x00-\x20]*-moz-binding[\x00-\x20]*:#u', '$1=$2nomozbinding...', $data);

// Only works in IE: <span style="width: expression(alert('Ping!'));"></span>
$data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?expression[\x00-\x20]*\([^>]*+>#i', '$1>', $data);
$data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?behaviour[\x00-\x20]*\([^>]*+>#i', '$1>', $data);
$data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:*[^>]*+>#iu', '$1>', $data);

// Remove namespaced elements (we do not need them)
$data = preg_replace('#</*\w+:\w[^>]*+>#i', '', $data);

do
{
    // Remove really unwanted tags
    $old_data = $data;
    $data = preg_replace('#</*(?:applet|b(?:ase|gsound|link)|embed|frame(?:set)?|i(?:frame|layer)|l(?:ayer|ink)|meta|object|s(?:cript|tyle)|title|xml)[^>]*+>#i', '', $data);
}
while ($old_data !== $data);

// we are done...
return $data;
}

5
preg_replaceএটি evalআপনার ইনপুটটিতে যেমন ব্যবহার করে তেমন ব্যবহার করা উচিত নয় । owasp.org/index.php/PHP_Security_Cheat_Sheet#Code_Inication
ক্র্যাবল্যাব

0

ব্যবহার htmlspecialcharsকরুন PHP। এইচটিএমএল এ ব্যবহার এড়াতে চেষ্টা করুন:

element.innerHTML = “…”; element.outerHTML = “…”; document.write(…); document.writeln(…);

যেখানে varহয় ব্যবহারকারী দ্বারা নিয়ন্ত্রিত

স্পষ্টতই এড়িয়ে চলার চেষ্টা করুন eval(var), আপনার যদি তাদের কোনওটি ব্যবহার করতে হয় তবে জেএস তাদের থেকে পালানোর চেষ্টা করুন, এইচটিএমএল এগুলি এড়িয়ে চলে এবং আপনার আরও কিছু করতে হতে পারে তবে বেসিকগুলির জন্য এটি যথেষ্ট হওয়া উচিত।


0

এটির ব্যবহারের জন্য আপনার ইনপুটটি সুরক্ষিত করার সর্বোত্তম উপায় htmlentities। উদাহরণ:

htmlentities($target, ENT_QUOTES, 'UTF-8');

আপনি এখানে আরও তথ্য পেতে পারেন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.