ডিবিতে সংযুক্ত না করে মাইএসকিএল_রিয়াল_সেসকেপ_ স্ট্রিংয়ের বিকল্প


91

আমি ডিবি সংযোগ ছাড়াই শুকনো পরীক্ষার প্রয়োজন হয় এমন সময়ে ডাটাবেসে সংযুক্ত না হয়ে মাইএসকিএল_আরইল_সেসকেপ_ স্ট্রিং হিসাবে কাজ করতে চাই have mysql_escape_string হ্রাস করা হয় এবং তাই অনাকাঙ্ক্ষিত। আমার কিছু অনুসন্ধান:

http://www.gamedev.net/commune/forums/topic.asp?topic_id=448909

http://w3schools.invisionzone.com/index.php?showtopic=20064



4
+1 আমি নিজে মাইএসকিউএল ক্লাস লিখছি এবং প্যারামিটার বাইন্ডিংয়ের উদ্দেশ্যে mysql_real_escape_string () ব্যবহার করছি। সমস্ত হোস্টিং এটি সমর্থন করে না বলে আমি মাইএসকিলি ব্যবহার করা এড়িয়ে চলি। আমি বহু-ফাইল এবং বহু-শ্রেণীর লাইব্রেরি এড়িয়ে চলেছি। আমার যা প্রয়োজন তা কেবল একটি ঝরঝরে ও ক্লিন সিঙ্গল ক্লাস। ধন্যবাদ!
ভিয়েতনাম

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

উত্তর:


76

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

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


4
+1 নোটের জন্য ধন্যবাদ। আমি কীভাবে এসকিউএল ইঞ্জেকশন আক্রমণগুলি মাল্টি-বাইট অক্ষর ব্যবহার করে পরীক্ষা করতে পারি তা খুব নিশ্চিত নই।
ভিয়েতনাম

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

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

4
ডিবি চরিত্রের সেটটি যদি সময়ের আগে জানা যায় তবে কী হবে?
jchook

7
হ্যাঁ, আপনি যদি চরিত্র সেটটি জানেন, কোন সংযোগ ছাড়াই পলায়ন করতে বাধা দেয়?
জোহান

67

ঠিক আছে, mysql_real_escape_string ফাংশন রেফারেন্স পৃষ্ঠা অনুসারে: "mysql_real_escape_string () মাইএসকিউএল এর লাইব্রেরি ফাংশন mysql_real_escape_string কে কল করে, যা নিম্নলিখিত অক্ষরগুলি থেকে বেরিয়ে যায়: \ x00, \ n, \ r,।, '," এবং \ x1a "।

এটি মাথায় রেখে, তারপরে আপনার পোস্ট করা দ্বিতীয় লিঙ্কে প্রদত্ত ফাংশনটি আপনার যা ঠিক তা করা উচিত:

function mres($value)
{
    $search = array("\\",  "\x00", "\n",  "\r",  "'",  '"', "\x1a");
    $replace = array("\\\\","\\0","\\n", "\\r", "\'", '\"', "\\Z");

    return str_replace($search, $replace, $value);
}

6
ধন্যবাদ আমি অন্য কিছু প্রস্তাব দেব: ফাংশন এস্কেপ ($ aQuery) {রিটার্ন strtr ($ aQuery, অ্যারে ("\ x00" => '\ x00', "\ n" => '\ n', "\ r" => '\ r', '\\' => '\\\\', "'" => "\" ",'" '=>' \ "'," \ x1a "=>' \ x1a ')) ; }
ভিয়েতনাম

4
\ x1a কেন \\ x1a এর পরিবর্তে \\\ x1a দিয়ে প্রতিস্থাপিত হবে? এটি কি টাইপো?
মাইকেল জেড

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

চরিত্রটি যদি এতে ভুল সেট করে দেয় তবে এটি বিপজ্জনক হতে পারে। মাল্টিবাইট চরিত্রের সেটগুলির জন্য, যদি মাইএসকিএল ব্যবহার করে যে কেউ just কে বাতিল করার জন্য কেবল একটি বাইট লাগাতে পারে \\ মাল্টিবিবাইট অক্ষরগুলি প্রায়শই দ্বিতীয় বাইট হিসাবে যেকোন কিছু নিতে পারে mys মাইএসকিএল-র জন্য এটি একক হিসাবে দেখা যাবে না - তবে এটি মাল্টিবাইট চরিত্রের অংশ। ইউটিএফ 8 দিয়ে কী হয় আমার কোনও ধারণা নেই। আমি আশা করব যে [0xB0, '\\'] দিয়ে যে একটি অবৈধ বাইট হিট করার সময় - এটি কেবল বন্ধ হয়ে যায় এবং এটি বাইটটি গিলে ফেলার চেয়ে আবার শুরু করে।
jgmjgm

4
যদি আমি জানি যে চরসেটটি ইউটিএফ 8, এটি করার জন্য এটি ব্যবহার করা mb_strpos()(এবং এর mb_substr()মতো আচরণ তৈরি করা substr_replace()) নিরাপদ ?
সফটওয়্যার

28

আমার অন্য উত্তরের প্রত্যক্ষ বিরোধিতা করে, এই নিম্নলিখিত ফাংশনটি সম্ভবত নিরাপদ, এমনকি বহু-বাইট অক্ষর রয়েছে।

// replace any non-ascii character with its hex code.
function escape($value) {
    $return = '';
    for($i = 0; $i < strlen($value); ++$i) {
        $char = $value[$i];
        $ord = ord($char);
        if($char !== "'" && $char !== "\"" && $char !== '\\' && $ord >= 32 && $ord <= 126)
            $return .= $char;
        else
            $return .= '\\x' . dechex($ord);
    }
    return $return;
}

আমি আশা করছি যে আমার চেয়ে বেশি জ্ঞানী কেউ আমাকে বলতে পারবেন যে উপরের কোডটি কেন কাজ করবে না ...


+1 অতিরিক্ত চেষ্টার জন্য ধন্যবাদ। আমি বহু-বাইট সম্পর্কিত এসকিউএল ইঞ্জেকশন সম্পর্কে আরও সন্ধান করতে ঘুরতে যাচ্ছি।
ভিয়েতনাম

আমার ধারণা এটি $ ফেরত। = '\ X' হওয়া উচিত। ডেসেক্স ($ অর্ড); পরিবর্তে
ভিয়েতনাম

4
একটি সাধারণ নিয়ম হিসাবে, আমি একক-উদ্ধৃত স্ট্রিংগুলিতে এমনকি '\\' ব্যবহার করতে পছন্দ করি, কারণ যদি আপনি যত্নবান না হন তবে একক '\' পরবর্তী অক্ষরকে প্রভাবিত করতে পারে। আমি সম্ভবত আবার OCD হচ্ছে।
খুব বেশি পিএইচপি

4
এই ফাংশনটি মাইএসকিএল পালানোর নিয়ম অনুসরণ করে না এবং এর ফলে ডেটা অখণ্ডতা হারাবে। "মাইএসকিউএল টেবিল 9.1," বিশেষ চরিত্রের এস্কেপ সিকোয়েন্সস "-এ দেখানো পালানোর ক্রমগুলি স্বীকৃত করেছে other কেবল "এক্স"। " - dev.mysql.com/doc/refman/5.6/en/…
ভেলক্রো

4
My xAA বলতে আসলে কোনও মাইএসকিউএল স্ট্রিংয়ে আক্ষরিক "xAA" লেখাটির চেয়ে বেশি কিছু বোঝায়? ডকুমেন্টেশন বলে মনে হচ্ছে যে \ x এর কোনও বিশেষ অর্থ নেই, তাই \ উপেক্ষা করা হবে। dev.mysql.com/doc/refman/5.0/en/string-literals.html
জেসন

6

আরও গবেষণা থেকে, আমি খুঁজে পেয়েছি:

http://dev.mysql.com/doc/refman/5.1/en/news-5-1-1.html

সুরক্ষা ফিক্স:

মাল্টি-বাইট এনকোডিং প্রক্রিয়াকরণে একটি এসকিউএল-ইনজেকশন সুরক্ষা গর্ত পাওয়া গেছে। বাগটি সার্ভারে ছিল, ভুলভাবে স্ট্রিংটিকে পার্সিং করে mysql_real_escape_string () C API ফাংশন দিয়ে পালিয়ে গেছে।

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

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

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

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

বর্তমান সংযোগের জন্য এই মোডটি সেট করতে, নিম্নলিখিত এসকিউএল বিবৃতিটি প্রবেশ করুন:

SET sql_mode='NO_BACKSLASH_ESCAPES';

আপনি সমস্ত ক্লায়েন্টদের জন্য বিশ্বব্যাপী মোডটি সেট করতে পারেন:

SET GLOBAL sql_mode='NO_BACKSLASH_ESCAPES';

এই এসকিউএল মোডটি স্বয়ংক্রিয়ভাবে সক্ষম করা যায় যখন সার্ভারটি কমান্ড-লাইন বিকল্পটি ব্যবহার করে --sql-মোড = NO_BACKSLASH_ESCAPES ব্যবহার করে বা সার্ভার বিকল্প ফাইলে sql- মোড = NO_BACKSLASH_ESCAPES সেট করে (উদাহরণস্বরূপ, my.cnf বা my.ini) সক্ষম করা যায় আপনার সিস্টেমের উপর নির্ভর করে)। (বাগ # 8378, সিভিই-2006-2753)

বাগ # 8303 দেখুন।


4
এটি অনেক আগেই স্থির করা হয়েছে।
আপনার সাধারণ অনুভূতি

4
এছাড়াও যে হুঁশিয়ার NO_BACKSLASH_ESCAPES প্রবর্তন অন্যান্য দুর্বলতা
উদ্বিগ্ন

4
: - 5.1.11 মধ্যে ফিক্সড লিংক ভেঙ্গে গেল, এখানে সংরক্ষণাগার হয় web.archive.org/web/20120501203047/http://dev.mysql.com:80/doc/...
বুরূজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.