কাঁচ বনাম html_safe বনাম h থেকে অনস্কেপ এইচটিএমএল


323

ধরুন আমার কাছে নিম্নলিখিত স্ট্রিং রয়েছে

@x = "<a href='#'>Turn me into a link</a>"

আমার দৃষ্টিতে, আমি একটি লিঙ্ক প্রদর্শিত হতে চাই। এটি হ'ল আমি চাই না যে @x এর সমস্ত কিছু অনস্কেপড হয়ে স্ট্রিং হিসাবে প্রদর্শিত হোক। ব্যবহারের মধ্যে পার্থক্য কি

<%= raw @x %>
<%= h @x %>
<%= @x.html_safe %>

?


যেহেতু কেউ এটি উল্লেখ করেনি আমি বুঝতে পেরেছিলাম যে এজগাইডস.রবিউনরইলস.আর.এইউজের<%== @x %> একটি <%= raw(@x) %> উপন্যাসের কথাও আছে
সিটিএস_এইই

উত্তর:


386

রেল 3 বিবেচনা:

html_safeআসলে এইচটিএমএল সেফ হিসাবে "স্ট্রিং সেট করে" (এটি এর চেয়ে কিছুটা জটিল, তবে এটি মূলত এটি)। এইভাবে, আপনি ইচ্ছামত সাহায্যকারী বা মডেল থেকে এইচটিএমএল নিরাপদ স্ট্রিংগুলি ফিরিয়ে দিতে পারেন।

hএটি কেবল একজন নিয়ামকের মধ্যে থেকে বা ব্যবহারের জন্যই ব্যবহার করা যায়, কারণ এটি কোনও সহায়ক থেকে from এটি আউটপুটটি পালাতে বাধ্য করবে। এটি সত্যই হ্রাস করা হয়নি, তবে আপনি সম্ভবত এটি আর ব্যবহার করবেন না: একমাত্র ব্যবহার হ'ল html_safeঘোষণা "প্রত্যাবর্তন" করা , এটি বেশ অস্বাভাবিক।

সঙ্গে আপনার অভিব্যক্তি Prepending rawআসলে আহ্বান সমতূল্য to_sসঙ্গে শৃঙ্খলিত html_safeএটিতে, কিন্তু একটি সাহায্যকারী উপর ঘোষিত হয়, ঠিক h, তাই এটি শুধুমাত্র কন্ট্রোলার ও দৃশ্যগুলিতে ব্যবহার করা যাবে।

" SafeFuffers এবং Rails 3.0 " কীভাবে SafeBuffer(যে ক্লাসটি ম্যাজিকটিhtml_safe কাজ করে) কীভাবে কাজ করে সে সম্পর্কে একটি দুর্দান্ত ব্যাখ্যা ।


42
আমি hকখনও বলব না যে এটি কখনও অবহেলিত হবে। ব্যবহার "Hi<br/>#{h@ user.name}".html_safeকরা বেশ সাধারণ এবং একটি স্বীকৃত ব্যবহার।
পুরুষদের

1
@ ম্যালেটর আকর্ষণীয় ব্যবহার, যদিও আমি এখনও মনে করি এটি "অস্বাভাবিক" বিভাগে চলে আসে।
ফ্যাবিও বাতিস্তা

5
স্ট্রিং # এইচটিএমএল_সেফ আসলে অ্যাক্টিভাস্পোর্ট :: সেফবুফারের একটি উদাহরণ দেয় যা মূল স্ট্রিংটি মোড়ায় এবং #html_safe হয়? । আসল স্ট্রিং # html_safe হয়ে যায় না? এটিতে #html_safe কল করার পরে।
jmaxyz

9
মনে রাখবেন যে অনুশীলনের মধ্যে rawএবং ব্যবহারের html_safeমধ্যে একটি সূক্ষ্ম পার্থক্য রয়েছে : raw(nil)একটি খালি স্ট্রিং প্রদান করে, যখন nil.html_safeএকটি ব্যতিক্রম ছুঁড়ে দেয়।
ভ্যান ডের হুর্ন

2
hএইচটিএমএল_সেফের ঘোষণাকে "ফিরিয়ে" দেওয়া হবে না। যখন একটি স্ট্রিং হয় html_safe, hকিছুই করবে না।
গুইসএস

113

আমার মনে হয় এটা পুনরাবৃত্তি বহন: html_safeনেই না আপনার স্ট্রিং এইচটিএমএল-অব্যাহতি। প্রকৃতপক্ষে, এটি আপনার স্ট্রিংটিকে পালাতে বাধা দেবে।

<%= "<script>alert('Hello!')</script>" %>

রাখব:

&lt;script&gt;alert(&#x27;Hello!&#x27;)&lt;/script&gt;

আপনার এইচটিএমএল উত্সে (হ্যাঁ, তাই নিরাপদ!), যখন:

<%= "<script>alert('Hello!')</script>".html_safe %>

সতর্কতা ডায়ালগ পপ আপ করবে (আপনি কি চান তা কি নিশ্চিত?) সুতরাং আপনি সম্ভবত html_safeকোনও ব্যবহারকারী-প্রবেশ করা স্ট্রিংয়ে কল করতে চান না ।


81
অন্য কথায়, এইচটিএমএল_সেফ "দয়া করে এই এইচটিএমএলটিকে নিরাপদ করুন" নয়, এটি বিপরীত - এটিই আপনি প্রোগ্রামার রেলগুলিকে বলছেন যে "এই স্ট্রিংটি এইচটিএমএল নিরাপদ, প্রতিশ্রুতি!"
পলমুরেসিবিআর

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

"Html_safe" ধারণাটি স্ট্রিংয়ের কেবল একটি মেটা পতাকা। কিছু চিহ্নিত যেমন html_safeনেই না অব্যাহতি না unescape। এইচটিএমএলকে নিরাপদ নয় বলে চিহ্নিত করার শেষ ফলাফল এবং এরপরে ERB <% = ট্যাগের অন্তর্নিহিত পলায়ন ব্যবহার করার সময়, অনস্কেপিং ডেটার সমান হতে পারে এবং তারপরে আউটপুটটিতে পুনরায় পলায়ন করা কার্যকরভাবে হয় না। (6 * -1 * -1), বনাম 6. এর পার্থক্যের মতো
বেন জিটলাউ

46

পার্থক্যটি 'রেল' html_safe()এবং এর মধ্যে raw()। এটি সম্পর্কে ইহুদা কাটজের একটি দুর্দান্ত পোস্ট রয়েছে এবং এটি সত্যিই এটিকে ফুটিয়ে তোলে:

def raw(stringish)

  stringish.to_s.html_safe

end

হ্যাঁ, raw()চারপাশে এমন একটি মোড়ক html_safe()যা স্ট্রিংয়ে ইনপুটকে চাপ দেয় এবং তারপরে কল html_safe()করে। এছাড়া ক্ষেত্রে যে raw()একটি মডিউল একটি সাহায্যকারী করে, অন্যদিকে html_safe()একটি আছে - যা একটি নতুন ActiveSupport তোলে স্ট্রিং বর্গ উপর একটি পদ্ধতি :: SafeBuffer উদাহরণস্বরূপ হয় @dirtyতাতে পতাকা।

" রেলগুলি html_safe বনাম কাঁচা " দেখুন।


30
  1. html_safe :

    একটি স্ট্রিংকে বিশ্বস্ত নিরাপদ হিসাবে চিহ্নিত করে। এটি কোনও অতিরিক্ত অব্যাহতি সম্পন্ন না করে HTML এ .োকানো হবে।

    "<a>Hello</a>".html_safe
    #=> "<a>Hello</a>"
    
    nil.html_safe
    #=> NoMethodError: undefined method `html_safe' for nil:NilClass
  2. raw :

    rawচারদিকে কেবল একটি মোড়ক html_saferawস্ট্রিং হওয়ার সম্ভাবনা থাকলে ব্যবহার করুন nil

    raw("<a>Hello</a>")
    #=> "<a>Hello</a>"
    
    raw(nil)
    #=> ""
  3. hএর জন্য নাম html_escape:

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

    3 ও তারপরে রেলগুলিতে এটি ডিফল্টরূপে ব্যবহৃত হয় সুতরাং আপনাকে এই পদ্ধতিটি স্পষ্টভাবে ব্যবহার করার দরকার নেই



2

সাধারণ রেলের শর্তাদি:

h এইচটিএমএল ট্যাগগুলি সংখ্যা অক্ষরগুলিতে সরিয়ে ফেলুন যাতে রেন্ডারিং আপনার এইচটিএমএলকে ভেঙে না ফেলে

html_safe স্ট্রিংয়ে একটি বুলিয়ান সেট করে যাতে স্ট্রিংটি এইচটিএমএল সেভ হিসাবে বিবেচিত হয়

raw এটি html_safe স্ট্রিংয়ে রূপান্তর করে


hহয় html_safeযার মানে হিসাবে হয় এইচটিএমএল পেশ করা হয়েছে।
ডেভ নিউটন

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