আমি যদি ড্রপডাউন ব্যবহার করি তবে এসকিউএল ইঞ্জেকশন থেকে রক্ষা করতে হবে?


97

আমি বুঝতে পারি যে আপনার মূলত এসকিউএল ইনজেকশনের সুযোগের কারণে কোনও ফর্ম থেকে ব্যবহারকারীর ইনপুটটি কখনই বিশ্বাস করা উচিত নয়।

তবে, এটি কি এমন কোনও ফর্মের জন্যও প্রযোজ্য যেখানে একমাত্র ইনপুটটি ড্রপডাউন (গুলি) থেকে (নীচে দেখুন)?

আমি $_POST['size']একটি সেশনে সেভ করছি যা তারপরে বিভিন্ন ডাটাবেসগুলি (একটি mysqliসিলেক্ট ক্যোয়ারী সহ) জিজ্ঞাসা করার জন্য সাইট জুড়ে ব্যবহৃত হয় এবং কোনও এসকিউএল ইঞ্জেকশন অবশ্যই তাদের ক্ষতি করে (সম্ভবত ড্রপ করে))

ডাটাবেসগুলি জিজ্ঞাসা করার জন্য টাইপযুক্ত ব্যবহারকারী ইনপুটটির কোনও ক্ষেত্র নেই, কেবল ড্রপডাউন (গুলি)।

<form action="welcome.php" method="post">
<select name="size">
  <option value="All">Select Size</option> 
  <option value="Large">Large</option>
  <option value="Medium">Medium</option>
  <option value="Small">Small</option>
</select>
<input type="submit">
</form>

112
হ্যাঁ. কোনও আক্রমণকারীকে আপনার ইনপুটটিতে যে মানটি চান তা জমা দিতে বাধা দেয় না <select>। প্রকৃতপক্ষে এমনকি সামান্য প্রযুক্তিগত ব্যবহারকারী ব্রাউজার কনসোল ব্যবহার করে অতিরিক্ত বিকল্প যুক্ত করতে পারে। যদি আপনি উপলভ্য মানগুলির একটি অ্যারে শ্বেত তালিকা
রাখেন

13
আপনার প্রাথমিক অনুরোধ / প্রতিক্রিয়া সংক্রান্ত জিনিসগুলি এবং জিনিসটি যে সামনের দিকটি অনুরোধের উপরে কীভাবে তৈরি করা যায় তা বোঝায় না যেমন এই ক্ষেত্রে ড্রপডাউন
রয়েল বিজি

13
@ আপনারকমমনসেন্স কারণ এটি একটি ভাল প্রশ্ন। সবাই বুঝতে পারে না যে একজন ক্লায়েন্ট কীভাবে হেরফের করতে পারেন। এটি এই সাইটে খুব মূল্যবান উত্তর উত্সাহিত করবে।
ক্রুঙ্কার

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

9
"আমি বুঝতে পারি যে আপনার ব্যবহারকারীর ইনপুটকে বিশ্বাস করা উচিত নয়"। কোন আশা নাই.
প্রিনজর্ন

উত্তর:


69

পোস্টের আকারটি আপনি যা প্রত্যাশা করেন তা নিশ্চিত করার জন্য আপনি নীচের উদাহরণের মতো সাধারণ কিছু করতে পারেন।

$possibleOptions = array('All', 'Large', 'Medium', 'Small');

if(in_array($_POST['size'], $possibleOptions)) {
    // Expected
} else {
    // Not Expected
}

তারপরে আপনার ফলাফলটি সংরক্ষণ করতে আপনি যদি পিএইচপি> = 5.3.0 এর কোনও সংস্করণ ব্যবহার করেন তবে mysqli_ * ব্যবহার করুন। যদি সঠিকভাবে ব্যবহার করা হয় এটি স্কয়ার ইঞ্জেকশনটিতে সহায়তা করবে।


এটি কি 'শ্বেতলিস্ট' অলিভারবিএসের সংক্ষিপ্ত সংস্করণ?
পরীক্ষকগণ

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

9
তবুও, আপনাকে অবশ্যই প্রস্তুত বিবৃতি (প্রস্তাবিত) বা ব্যবহার করতে হবে mysqli_real_escape_string। মানগুলি আউটপুট করার সময় যথাযথভাবে এড়িয়ে চলুন ( যেমন এইচটিএমএল স্পেসিপালচার্স () এইচটিএমএল নথিতে ব্যবহার করুন)।
কমফ্রিচ

4
আমি তৃতীয় প্যারামিটারটি সেটিং করার সুপারিশ করছি in_arrayকরার trueকঠোর তুলনা জন্য। আমি কী ভুল হতে পারে তা নিশ্চিত নই, তবে comparisonিলে comparisonালা তুলনাটি বেশ বিশ্রী।
ব্রিলিয়ানড

4
@ অলিভার বিএস $ _POST মানগুলিও অ্যারে হতে পারে। সংখ্যাযুক্ত স্ট্রিংগুলি সংখ্যা হিসাবে তুলনা করে ('5' == '05')। আমি মনে করি না যে আপনার নির্দিষ্ট উদাহরণে আপনার কোনও সুরক্ষা গর্ত আছে, তবে নিয়মগুলি জটিল এবং গর্তগুলি এমনকি যে কারণে আমি বুঝতে পারি না তার জন্যও এটি খুলতে পারে। কঠোর তুলনা সম্পর্কে যুক্তি করা সহজ, এবং তাই নিরাপদে ব্যবহার করা সহজ।
ব্রিলিয়ানড

195

হ্যাঁ আপনার এ থেকে রক্ষা করা দরকার।

ফায়ারফক্সের বিকাশকারী কনসোলটি ব্যবহার করে কেন আপনাকে দেখাতে পারি:

আমি ড্রপডাউন মানগুলির একটি ড্রপ টেবিল স্টেটমেন্ট হতে সম্পাদনা করেছি

আপনি যদি এই ডেটা পরিষ্কার না করেন তবে আপনার ডাটাবেস নষ্ট হয়ে যাবে। (এটি একটি সম্পূর্ণ বৈধ এসকিউএল বিবৃতি নাও হতে পারে তবে আমি আশা করি আমি আমার বক্তব্যটি অর্জন করেছি।)

আপনার ড্রপডাউনে কোন বিকল্পগুলি উপলভ্য তা সীমাবদ্ধ করার অর্থ এই নয় যে আমি আপনার সার্ভারটি প্রেরণ করতে পারি এমন ডেটা সীমাবদ্ধ করে রেখেছি।

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

curl --data "size=%27%29%3B%20DROP%20TABLE%20*%3B%20--"  http://www.example.com/profile/save

(এটি একটি সম্পূর্ণ বৈধ কার্ল কমান্ড নাও হতে পারে, তবে আবারও আমি আশা করি আমি আমার বক্তব্যটি সরিয়ে নিয়ে এসেছি))

সুতরাং, আমি পুনরাবৃত্তি করব:

কখনও বিশ্বাসী ব্যবহারকারী ইনপুট বিশ্বাস করেন না। সর্বদা নিজেকে রক্ষা করুন।

কোনও ব্যবহারকারী ইনপুট সর্বদা নিরাপদ বলে ধরে নিবেন না। এটি কোনও ফর্ম ব্যতীত অন্য কোনও উপায়ে পৌঁছালেও এটি সম্ভাব্য অনিরাপদ। এর কোনওটিই এসকিউএল ইঞ্জেকশন থেকে নিজেকে রক্ষা করার পক্ষে যথেষ্ট বিশ্বাসযোগ্য নয়।


24
এর সাথে একটি কাস্টম পেওলড কারুকাজ করার কথা উল্লেখ করবেন না curlসর্বদা ইনপুট সার্ভার-সাইড স্যানিটাইজ করুন !
recursion.ninja

14
একটি চিত্র হাজার হাজার শব্দের চেয়ে বেশি বলে।
ডেভিডকনরাদ

4
এটি ডিফল্ট উত্তর হওয়া উচিত। এছাড়াও সম্পর্কে কিছু অন্তর্ভুক্ত করা উচিত curl। লোকেরা বুঝতে পারে না যে আপনি যে কোনও প্রকারের বিন্যাস ব্যবহার করে এবং যে কোনও মানগুলি পাস করে যে কোনও জায়গা থেকে যে কোনও HTTP অনুরোধ প্রেরণ করতে পারবেন, এটি প্রক্রিয়া করার আগে অনুরোধটি বৈধ কিনা তা নিশ্চিত হওয়া সার্ভারের উপর নির্ভর করে।
retrohacker

4
কি সুন্দর! এটা ছোট ববি টেবিল!
অরা

45

এই প্রশ্নটি হিসাবে ট্যাগ করা হয়েছে , এখানে এই বিশেষ ধরণের আক্রমণ সম্পর্কিত একটি উত্তর:

যেমন আপনাকে মন্তব্যে বলা হয়েছে, আপনাকে ব্যতিক্রম ছাড়া কোনও চলক ডেটা জড়িত প্রতিটি একক প্রশ্নের জন্য প্রস্তুত বিবৃতি ব্যবহার করতে হবে

নির্বিশেষে যে কোনও এইচটিএমএল স্টাফ!
এটি বোঝার জন্য প্রয়োজনীয় যে এসকিউএল কোয়েরিগুলি কোনও বাহ্যিক কারণ নির্বিশেষে সঠিকভাবে ফর্ম্যাট করতে হবে, এটি HTML ইনপুট বা অন্য কিছু হোক না কেন।

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

এখানে আপনি একটি বিশদ বিবরণ পেতে পারেন, প্রস্তুত বিবৃতি কেন প্রয়োজনীয় এবং কীভাবে সেগুলি সঠিকভাবে ব্যবহার করতে হবে এবং যেখানে সেগুলি কার্যকর হয় না এবং এই ক্ষেত্রে কী করা উচিত: এসকিউএল ইনজেকশন সুরক্ষা সম্পর্কিত হিচাইকার্স গাইড

এছাড়াও, এই প্রশ্নটি দিয়ে ট্যাগ করা হয়েছিল । প্রায়শই দুর্ঘটনার কারণে আমার ধারণা, তবে যাইহোক, আপনাকে আপনাকে সতর্ক করতে হবে যে কাঁচা মাইএসকিলি পুরানো মাইএসকি_ * ফাংশনগুলির জন্য পর্যাপ্ত বিকল্প নয় । কেবল কারণ যদি এটি পুরানো স্টাইলে ব্যবহৃত হয় তবে এটি কোনও সুরক্ষা যুক্ত করবে না। যদিও এটি তৈরি করা বিবৃতিগুলির পক্ষে সমর্থন বেদনাদায়ক এবং ঝামেলাজনক, তবুও গড় পিএইচপি ব্যবহারকারীরা এগুলি মোটেও চেষ্টা করতে অক্ষম। সুতরাং, যদি কোনও ওআরএম বা কোনও ধরণের বিমূর্ত গ্রন্থাগার বিকল্প না হয়, তবে পিডিও আপনার একমাত্র পছন্দ।


4
i = এলোমেলো (0, 15); // কিছু ক্যোয়ারী i ব্যবহার করে। আমার কি এখনও এখানে বিবৃতি প্রস্তুত করা দরকার?
ক্রંચার

4
বাস্তবায়ন কি random?
স্লাইসডেপান

9
পছন্দ করেছেন আমার কাছে "সর্বদা এক্স করুন, এবং আমি এর জন্য কোনও যুক্তি সরবরাহ করব না" সংক্ষিপ্ত-দর্শনযুক্ত।
ক্রাঞ্চার

4
@Cruncher আমি কোন কারণে মনে করতে পারেন না না সবসময় প্রস্তুত বিবৃতি, প্রত্যেক সময় সব কিছুর জন্য ব্যবহার করেন, সবসময়। আমাকে একটা বলতে পারেন?
ওয়েসলে মার্চ

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

12

হ্যাঁ.

যে মানগুলি আসলে পাঠানো হয় তার জন্য যে কোনও কিছু ছদ্মবেশী করতে পারে -

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

if(in_array($_POST['ddMenu'], $dropDownValues){

    $valueYouUseLaterInPDO = $dropDownValues[array_search("two", $arr)];

} else {

    die("effin h4x0rs! Keep off my LAMP!!"); 

}

4
এই উত্তরটি অসম্পূর্ণ, অতিরিক্ত হিসাবে আপনি প্রস্তুত বিবৃতি ব্যবহার করা উচিত, যাতে ইনজেকশনটি কী সেট করা যায় তা নির্বিশেষে সম্ভব নয়
স্লাইডডপ্যান

7
স্লাইডডপান সত্যিই? মনে হচ্ছে আপনি কেন ব্যান্ডব্যাগনে ঝাঁপিয়ে পড়ছেন কেন ... যদি আমার কোনও প্রশ্নের মধ্যে কয়েকটা সম্ভব সম্ভাব্য ইনপুট থাকে, যাতে আমি যাচাই করতে পারি যে সেগুলি ঠিক আছে (যা আমি জানি, কারণ আমি তাদের তৈরি করেছি), তারপরে আপনি প্রস্তুত বিবৃতি ব্যবহার না করে কোনও অতিরিক্ত সুরক্ষা সুবিধা অর্জন করবেন না
ক্রুঙ্কার

4
একটি কনভেনশন হিসাবে প্রস্তুত বিবৃতি ব্যবহার প্রয়োগ করা আপনাকে ভবিষ্যতে এসকিউএল ইঞ্জেকশন দুর্বলতাগুলি প্রবর্তন থেকে সুরক্ষা দেয়।
স্লাইডডপান

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

4
@ ক্রাঙ্কার আপনি যদি নিজের এসকিউএল স্টাফগুলি সঠিকভাবে পরিচালনা করেন তবে আপনি এসকিউএলকে সঠিকভাবে কাজ করার ক্ষেত্রে হস্তক্ষেপ না করে যে কোনও ইনপুট গ্রহণ করতে পারবেন । এসকিউএল অংশটি যে কোনও জায়গা থেকেই আসুক না কেন কিছু মেনে নিতে প্রস্তুত এবং প্রস্তুত থাকতে হবে। অন্য সব কিছুই ত্রুটি-প্রবণ।
glglgl

8

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

<?php
// No, you don't need to specify the numbers in the array but as we're using them I always find having them visually there helpful.
$sizes = array(0 => 'All', 1 => 'Large', 2 => 'Medium', 3 => 'Small');
$size = filter_input(INPUT_POST, "size", FILTER_VALIDATE_INT);

echo '<select name="size">';
foreach($sizes as $i => $s) {
    echo '<option value="' . $i . '"' . ($i == $size ? ' selected' : '') . '>' . $s . '</option>';
}
echo '</select>';

তারপরে আপনি $sizeজ্ঞান সহ আপনার ক্যোয়ারিতে ব্যবহার করতে পারেন যে এটিতে কেবল কখনও FALSEপূর্ণসংখ্যা বা পূর্ণসংখ্যা থাকবে।


4
@ ওলিভারবিএস filter_inputসার্ভারের পাশে যদি একটি চেক না হয়? পূর্ণসংখ্যা ব্যতীত আর কেউ পোস্ট করতে পারে না।
স্টিফোন

ধন্যবাদ স্টিফন, সুতরাং এটি ওপিতে ফর্মটি প্রতিস্থাপন করবে? এবং এটি কি একাধিক ড্রপডাউন সহ বৃহত্তর ফর্মগুলির জন্য প্রযোজ্য? আমি যদি 'রঙ' বলার জন্য এটিতে আরও একটি ড্রপডাউন যুক্ত করি?
টেটারগুলি

নিবন্ধন করুন আপনি এটি যতটা পছন্দ আপনার পছন্দ মতো অনেকগুলি ড্রপডাউন ব্যবহার করতে পারেন। আপনি প্রতিটি ড্রপডাউনের জন্য কেবল একটি নতুন অ্যারে তৈরি করে অ্যারেতে ড্রপডাউন করার জন্য সমস্ত বিকল্প রেখেছেন।
স্টিফোন

সুন্দর! আমি এটা পছন্দ করি. আমি এটিকে একটি শট দেব এবং পরীক্ষায় আমি কী পাব তা দেখব।
পরীক্ষকগণ

স্যামুয়েলটাটার্সফিল্ড গ্রেট, কেবলমাত্র সেই filter_inputঅংশটি বৈধতার জন্য ব্যবহার করার বিষয়টি নিশ্চিত করুন , অন্যথায় এটি সুরক্ষার জন্য চকোলেট টিপোটের মতোই কার্যকর।
স্টিফোন

7

অন্যান্য উত্তরগুলি ইতিমধ্যে আপনার যা জানা দরকার তা কভার করে। তবে এটি আরও কিছুটা পরিষ্কার করতে সহায়তা করে:

আছে দুটি জিনিস আপনাকে যা করতে হবে:

1. ফর্ম তথ্য বৈধ করুন।

হিসাবে জনাথন হবস 'উত্তর শো সুস্পষ্টভাবে, ফর্ম ইনপুট জন্য HTML উপাদান পছন্দমত আপনার জন্য কোনো নির্ভরযোগ্য ফিল্টারিং করি না।

বৈধতা সাধারণত এমনভাবে করা হয় যা ডেটা পরিবর্তন করে না, তবে "দয়া করে এটি সংশোধন করুন" হিসাবে চিহ্নিত ক্ষেত্রগুলি দিয়ে আবার ফর্মটি দেখায়।

বেশিরভাগ ফ্রেমওয়ার্ক এবং সিএমএসগুলিতে ফর্ম বিল্ডার রয়েছে যা আপনাকে এই কাজটিতে সহায়তা করে। এবং কেবল এটিই নয়, তারা সিএসআরএফ (বা "এক্সএসআরএফ") এর বিরুদ্ধেও সহায়তা করে, যা আক্রমণাত্মক অন্য রূপ।

2. এসকিউএল বিবৃতিতে সানিটাইজ / এস্কেপ ভেরিয়েবল ..

.. বা প্রস্তুত বিবৃতি আপনার জন্য কাজ করতে দিন।

আপনি যদি কোনও ব্যবহারকারী (মাই) এসকিউএল স্টেটমেন্টটি কোনও ভেরিয়েবলের সাথে তৈরি করেন, ব্যবহারকারী দ্বারা সরবরাহিত বা না, তবে আপনাকে এই ভেরিয়েবলগুলি পালাতে এবং উদ্ধৃত করতে হবে।

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

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

  • পুরানো-স্কুল মাইএসকিউএল + পিএইচপি, mysql_real_escape_string () কাজ করে। সমস্যাটি হ'ল এটি ভুলে যাওয়া অনেক সহজ, সুতরাং আপনার অবশ্যই প্রস্তুত স্টেটমেন্ট বা ক্যোয়ারী বিল্ডারগুলি ব্যবহার করা উচিত।
  • মাইএসকিউএলিতে আপনি প্রস্তুত বিবৃতি ব্যবহার করতে পারেন।
  • বেশিরভাগ ফ্রেমওয়ার্ক এবং সিএমএসগুলি কোয়েরি বিল্ডার সরবরাহ করে যা আপনাকে এই কাজটিতে সহায়তা করে।

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

এটি উল্লেখ করা গুরুত্বপূর্ণ যে আপনি এসকিউএল স্টেটমেন্টের জন্য ভেরিয়েবলগুলি এড়িয়ে গেছেন এবং ডাটাবেসের জন্য নয় । ডাটাবেসটি মূল স্ট্রিং সংরক্ষণ করবে, তবে বিবৃতিটির একটি পালানো সংস্করণ দরকার।

এর মধ্যে একটি বাদ দিলে কী ঘটে?

আপনি যদি ফর্ম বৈধতা ব্যবহার না করেন তবে আপনি আপনার এসকিউএল ইনপুট স্যানিটাইজ করেন তবে আপনি দেখতে পাচ্ছেন যে সমস্ত ধরণের খারাপ জিনিস ঘটতে পারে তবে আপনি এসকিউএল ইঞ্জেকশন দেখতে পাবেন না! (*)

প্রথমত, এটি আপনার অ্যাপ্লিকেশনটিকে এমন একটি রাজ্যে নিয়ে যেতে পারে যা আপনি পরিকল্পনা করেননি। যেমন আপনি যদি সমস্ত ব্যবহারকারীর গড় বয়স গণনা করতে চান তবে একজন ব্যবহারকারী বয়সের জন্য "aljkdfaqer" দিয়েছেন, আপনার গণনা ব্যর্থ হবে।

দ্বিতীয়ত, আপনার বিবেচনা করা উচিত অন্যান্য ধরণের ইনজেকশন আক্রমণ হতে পারে: যেমন ব্যবহারকারী ইনপুটটিতে জাভাস্ক্রিপ্ট বা অন্যান্য স্টাফ থাকতে পারে।

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

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

(*) বা এটি সত্যিই বহিরাগত কিছু হতে পারে।

আপনি যদি এসকিউএল স্টেটমেন্টের জন্য ভেরিয়েবলগুলি এড়ান না , তবে আপনি ফর্ম ইনপুটটিকে বৈধতা দিয়েছেন , তবে আপনি এখনও খারাপ জিনিসগুলি দেখতে পাচ্ছেন।

প্রথমত, আপনি ঝুঁকিপূর্ণ যে যখন আপনি ডাটাবেজে ডেটা সংরক্ষণ করেন এবং আবার লোড করেন, এটি আর একই ডেটা হবে না, "অনুবাদে হারিয়ে গেছে"।

দ্বিতীয়ত, এটি অবৈধ এসকিউএল বিবৃতিতে ফলাফল করতে পারে এবং এভাবে আপনার অ্যাপ্লিকেশন ক্র্যাশ হয়ে যায়। উদাহরণস্বরূপ যদি কোনও ভেরিয়েবলের কোনও উদ্ধৃতি বা ডাবল উদ্ধৃতি অক্ষর থাকে তবে আপনি কোন ধরণের উদ্ধৃতি ব্যবহার করেন তা নির্ভর করে আপনি অবৈধ মাইএসকিউএল বিবৃতি পাবেন।

তৃতীয়ত, এটি এখনও এসকিউএল ইঞ্জেকশন তৈরি করতে পারে।

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

এবং আপনার কাছে কোনও ফর্ম ইনপুট না থাকলেও, আপনার কাছে এখনও সমস্ত ধরণের উত্স থেকে স্ট্রিং থাকতে পারে: ফাইল সিস্টেম থেকে পড়া, ইন্টারনেট থেকে স্ক্র্যাপ করা ইত্যাদি নুন কোনও গ্যারান্টি দিতে পারে যে এই স্ট্রিংগুলি নিরাপদ।


সংখ্যার ক্ষেত্রের স্ট্রিং নয় খুব দীর্ঘ ডেটা কোনও কিছুই ক্র্যাশ করবে না
আপনার সাধারণ অনুভূতি

হুম, এটি এখনই চেষ্টা করে দেখুন, এবং এটি ত্রুটির পরিবর্তে একটি সতর্কতা দেখায় shows আমি মনে করি এটি PDO যা এটিকে একটি ত্রুটিতে পরিণত করে। আমি নিশ্চিত যে আমি drupal.org- র এক ডজন ইস্যুতে আলোচনা করেছি যেখানে কিছু স্ট্রিং একটি বার্চের জন্য খুব দীর্ঘ।
ডনকুইক্সোট

6

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


6

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


5

এসকিউএল ইঞ্জেকশনের বিরুদ্ধে নিশ্চিত করতে প্যারামিটারাইজড ক্যোয়ারি ব্যবহার করা ভাল। সেক্ষেত্রে ক্যোয়ারির চেহারাটি হ'ল:

SELECT * FROM table WHERE size = ?

যখন আপনি উপরের মত একটি কোয়েরি পাঠ্যের সাথে সরবরাহ করেছেন যা সততার জন্য যাচাই করা হয়নি (ইনপুটটি সার্ভারে যাচাই করা হয়নি) এবং এতে এসকিউএল ইঞ্জেকশন কোড থাকে এটি সঠিকভাবে পরিচালনা করা হবে। অন্য কথায়, অনুরোধটির ফলাফল ডাটাবেস স্তরতে এমন কিছু ঘটবে:

SELECT * FROM table WHERE size = 'DROP table;'

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


4

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

আপনি যখন ক্লায়েন্টকে বিশ্বাস করবেন তখন কী ঘটবে এবং কী ঘটবে তার উদাহরণ


4

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

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