আংশিক রেন্ডার করার আগে পলায়ন_ জাভাস্ক্রিপ্ট কেন?


120

আমি এই রেলকাস্ট পর্বটি দেখছি এবং ভাবছি কেন এখানে কল করা escape_javascriptদরকার:

$("#reviews").append("<%= escape_javascript(render(:partial => @review)) %>");

কি জন্য escape_javascriptব্যবহার করা হয়?

রেল ডক্স অনুসারে :

escape_javascript (জাভাস্ক্রিপ্ট)

জাভাস্ক্রিপ্ট বিভাগগুলির জন্য ক্যারিয়ারের রিটার্ন এবং একক এবং ডাবল উদ্ধৃতিগুলি রক্ষা করুন।

তবে এটি আমার কাছে খুব বেশি বোঝায় না।


23
এফওয়াইআই, এখানে গৃহীত উত্তর সঠিক উত্তর নয়। কিকিতোর হল
স্টিভ

উত্তর:


-3

যেহেতু আপনি চান না যে ব্যবহারকারীরা জাভাস্ক্রিপ্ট পোস্ট করছেন যা ব্রাউজারটি বাস্তবায়িত করে?


4
আপনি যখন জাভাস্ক্রিপ্ট কোডটি পাস এবং রেন্ডার করতে চান তবে কীভাবে?
berto77

হ্যাঁ, এটি আসলে ফর্ম্যাটিংয়ের পদ্ধতি method এটি ব্যবহারকারীদের নিজস্ব জাভাস্ক্রিপ্ট কার্যকর করতে বাধা দেয় না। কিছুই তা রোধ করতে পারে না।
লাসাগাআন্ড্রয়েড

3
এটি সহায়ক নয়। পরিবর্তে কিকিতোর উত্তর দেখুন ।
নিটাস

363

আপনি কোডটি দুটি ভাগে বিভক্ত করেছেন কিনা তা বোঝা সহজ।

প্রথম অংশটি $("#reviews").append("<%= ... %>");এরব সহ জাভাস্ক্রিপ্ট। এর অর্থ <%= ... %>এটির অভ্যন্তরীণ রুবি কোড যা ফিরে আসবে তা প্রতিস্থাপিত হবে। সেই প্রতিস্থাপনের ফলাফলটি অবশ্যই বৈধ জাভাস্ক্রিপ্ট হতে হবে, অন্যথায় ক্লায়েন্ট যখন এটি প্রক্রিয়া করার চেষ্টা করবে তখন এটি একটি ত্রুটি ছুঁড়ে দেবে। সুতরাং এটি প্রথম জিনিস: আপনার বৈধ জাভাস্ক্রিপ্ট দরকার ।

আরেকটি বিষয় আমলে নেওয়ার বিষয়টি হ'ল রুবি যা কিছু উত্পন্ন করে তা অবশ্যই জাভাস্ক্রিপ্টের স্ট্রিংয়ের ভিতরে ডাবল কোট যুক্ত থাকতে হবে - এর চারপাশে ডাবল উদ্ধৃতি লক্ষ্য করুন <%= ... %>। এর অর্থ হ'ল উত্পন্ন জাভাস্ক্রিপ্টটি এর মতো দেখাবে:

$("#reviews").append("...");

এখন আসুন এর ভিতরে রুবি অংশটি পরীক্ষা করি <%= ... %>। কি করে render(:partial => @review)? এটি একটি আংশিক রেন্ডারিং করছে - যার অর্থ এটি কোনও ধরণের কোড - এইচটিএমএল, সিএসএস ... বা আরও বেশি জাভাস্ক্রিপ্ট রেন্ডারিং হতে পারে!

সুতরাং, যদি আমাদের আংশিক কিছু সাধারণ এইচটিএমএল থাকে তবে এটি কী ঘটবে?

<a href="/mycontroller/myaction">Action!</a> 

মনে রাখবেন যে আপনার জাভাস্ক্রিপ্টটি প্যারামিটার হিসাবে একটি ডাবল-কোটেড স্ট্রিং নিচ্ছে? আমরা যদি <%= ... %>সেই অংশটির কোডটি সহজভাবে প্রতিস্থাপন করি , তবে আমাদের একটি সমস্যা আছে - এর পরে href=ডাবল উক্তিটি পাওয়া যাওয়ার পরে ! জাভাস্ক্রিপ্ট বৈধ হবে না:

// Without escaping, you get a broken javascript string at href
$("#reviews").append("<a href="/mycontroller/myaction">Action!</a>");

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

<a href=\"/mycontroller/myaction\">Action!</a>

এটি কি escape_javascriptকরে। এটি নিশ্চিত করে যে ফিরে আসা স্ট্রিং জাভাস্ক্রিপ্ট "ব্রেক" করবে না। আপনি যদি এটি ব্যবহার করেন তবে আপনি পছন্দসই আউটপুট পাবেন:

$("#reviews").append("<a href=\"/mycontroller/myaction\">Action!</a>")

শুভেচ্ছা সহ!


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

13
@ স্টিভ সম্মত হয়েছে, একটি ভাল নাম হ'ল escape_for_javascriptযেহেতু প্রায়শই আপনি অন্য কোডগুলি (যেমন এইচটিএমএল) এড়িয়ে যাচ্ছেন যাতে এটি জাভাস্ক্রিপ্টটি না ভেঙে।
কিকিতো

14
escape_javascript()এখন একটি সংক্ষিপ্ত পদ্ধতি রয়েছে: সরল j()(কমপক্ষে 4 টি রেলের মধ্যে)।
mjnissim

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

1
@ জ্যাকস্মিথ আপনার প্রশ্নের উত্তর দিয়েছেন
কিকিতো

8

ব্যবহারকারীরা বিদ্বেষপূর্ণ কোড (দূষিত ব্যবহারকারী) পোস্ট করতে পারে যে অনস্কেপড বামে রাখলে সম্ভাব্যভাবে কার্যকর করা হবে, ব্যবহারকারীদের আপনার অ্যাপ্লিকেশন নিয়ন্ত্রণ করতে দেয়।

এটা চেষ্টা কর:

<% variable = '"); alert("hi there' %>
$("#reviews").append("<%= variable %>");

রেলের সিনট্যাক্সের সাথে সত্যই পরিচিত নয়, তবে আপনি যদি পালাতে না পারেন variableতবে একটি সতর্কতা বাক্স প্রদর্শিত হবে এবং আমি মনে করি না এটি উদ্দেশ্যমূলক আচরণ।


8

আপনি যদি উত্সটি এখানে দেখুন তবে এটি আরও পরিষ্কার হবে।

এই ফাংশনটি নিম্নলিখিত দুটি জিনিস সম্পাদন করে:

  1. এটি JS_ESCAPE_MAP এ সংজ্ঞায়িত অক্ষরের সাথে ইনপুট স্ট্রিংয়ের অক্ষরগুলিকে প্রতিস্থাপন করে

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

  2. ফলস্বরূপ ফলাফলটি স্ট্রিংটি এইচটিএমএল নিরাপদ কিনা তাও পরীক্ষা করে। যদি তা না হয় তবে স্ট্রিংটি এইচটিএমএল নিরাপদে পরিণত হয় এবং ফলাফলটি ফিরিয়ে দেয় তা নিশ্চিত করার জন্য এটি প্রয়োজনীয় পলায়ন করে।

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

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

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

আমি আশা করি এটি আপনার প্রশ্নের সহায়তা করে এবং উত্তর দেয়।

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