এইচটিএমএল এনকোড / একটি স্ট্রিং পলায়ন? সেখানে কি অন্তর্নির্মিত?


99

আমার একটি অবিশ্বস্ত স্ট্রিং রয়েছে যা আমি একটি HTML পৃষ্ঠায় পাঠ্য হিসাবে দেখাতে চাই। আমার চরিত্রগুলি ' <' এবং ' &' এইচটিএমএল সত্ত্বা হিসাবে পালাতে হবে । কম ঝামেলা ভাল।

আমি ইউটিএফ 8 ব্যবহার করছি এবং উচ্চারণযুক্ত অক্ষরের জন্য অন্য সত্তার প্রয়োজন নেই।

রুবি বা রেলগুলিতে কোনও অন্তর্নির্মিত ফাংশন আছে, বা আমার নিজেরটি রোল করা উচিত?


4
ওডব্লিউএসপি অনুসারে , এইচটিএমএল উপাদানগুলির সামগ্রীগুলিতে যথাযথ XSS সুরক্ষার জন্য নিম্নলিখিত ছয়টি অক্ষর &<>"'/
এড়ানো উচিত

উত্তর:


95

hসাহায্যকারী পদ্ধতি:

<%=h "<p> will be preserved" %>

ঠিক আছে, এটি পালিয়ে যায়> যা অপ্রয়োজনীয়, তবে তা করবে।
kch

আপনি কিছুগুলি h এবং কিছু ছাড়াই মুদ্রণের জন্য বন্ধনী ব্যবহার করতে পারেন। <% = h ("<p") + ">"%>
ট্রেভর ব্র্যাম্বল

এখন যে নির্বোধ হবে। পালিয়ে যায় কি না সেদিকে আমি খুব একটা পাত্তা দিই না। আমি শুধু লক্ষ করছি যে এইচটিএমএল স্প্যাসের জন্য এটি প্রয়োজন হয় না।
kch

12
এক্সএমএল অনুমানের বরং বিরক্তিকর দৃ'়তার কারণেই এটি মাঝে মাঝে এক্সএইচটিএমএলে প্রয়োজন হয় ']]>' পাঠ্যের বাইরে রাখুন ('চারডাটা' উত্পাদন দেখুন)। এটি সর্বদা এড়াতে এটিকে সাধারণত সহজ (এবং ক্ষতিহীন) করে তোলে।
ববিসন

19
আগ্রহীদের hজন্য একটি উপনামhtml_escape
লাইটউইচ05

141

রুবি সিজিআই ক্লাস চেকআউট করুন । এইচটিএমএল পাশাপাশি ইউআরএলকে এনকোড এবং ডিকোড করার বিভিন্ন পদ্ধতি রয়েছে।

CGI::escapeHTML('Usage: foo "bar" <baz>')
# => "Usage: foo &quot;bar&quot; &lt;baz&gt;"

12
ধন্যবাদ, এটি দুর্দান্ত কারণ এটি নিয়ন্ত্রণকারীদের থেকে করা যায়। অবশ্যই আমি তা করতাম না।
ড্যান রোজনস্টার্ক

4
এটি কোনও টেমপ্লেটে contentোকানো সামগ্রীর যথার্থতা যাচাইয়ের জন্য (যখন বিষয়বস্তুটি এইচটিএমএল-পলায়নযুক্ত বলে মনে করা হয়) কার্যকরী / সংহতকরণ পরীক্ষায় কার্যকর।
অ্যালেক্স ডি

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

ডান - ডাটাবেসে প্রবেশের আগে পালানো দুর্দান্ত great আপনি কেবল এটি নিশ্চিত করতে চান যে আপনি এটি যুক্ত করার আগে থেকে কোনও পুরানো পালানো হ্যাক নেই ...
কেভিন

4
আমি এর প্রতিশব্দটি আরও পছন্দ করি: সিজিআই.সেস্কেপ_এইচটিএমএল
ট্র্যান্টর লিউ

77

রুবে অন রেলে 3 টি এইচটিএমএল ডিফল্টরূপে পালানো হবে।

অ-পালিত স্ট্রিং ব্যবহারের জন্য:

<%= raw "<p>hello world!</p>" %>

25

ERB :: ইউটিলিএইচটিএমএল_স্কেপ যে কোনও জায়গায় ব্যবহার করা যেতে পারে। এটি requireরিলে ব্যবহার না করেই উপলব্ধ ।


এটি আসলে CGI.escapeHTMLনীচে ব্যবহার করছে
akostadinov

@akostadinov - ফলাফল অবশ্য অন্যরকম। উদাহরণস্বরূপ, ERB :: ইউটিলিএইচটিএমএল_সেস্কেপ এস্ট্রোফেসগুলিকে & # x27 তে রূপান্তরিত করবে; যেখানে সিজিআই :: পর্বত এইচটিএমএল করবে না
লুই সাইয়ার্স

@ লুইসায়ার্স, আমি কীভাবে এটি ঘটতে পারে তা দেখতে পাচ্ছি না: `` `[43] পিআর (মূল)> শো-উত্স ERB :: ইউটিলি এইচটিএমএল_স্কেপ থেকে: /usr/share/ruby/erb.rb @ লাইন 945: মালিক : # <শ্রেণি: ERB :: ব্যবহার> দৃশ্যমানতা: সার্বজনীন লাইনের সংখ্যা: 3 ডিফ html_escape (গুলি) সিজিআই.এসকেপ এইচটিএমএল (s.to_s) শেষ `` `
akostadinov

@ একোস্টাডিনভ - হুম ... ঠিক আবার দৌড়ে এসেছিলেন এবং হ্যাঁ, তারা একই ফলাফল দিয়েছে। আমি কাজ করার সময় (সম্ভবত ভিন্ন ভিন্ন / সিজি সংস্করণ আচরণ?) যখন এটি তৈরি করতাম তখন এটির বিভিন্ন ফলাফলের শপথ করি। আগামীকাল কাজের জায়গায় কেন আমি আলাদা ফলাফল পেয়েছি তা আমাকে দেখতে হবে।
লুই সায়ার্স

17

এইচটিএমএল যে কোনও জায়গায় পলায়ন করা ব্যবহার করার জন্য ক্রিস্টোফার ব্র্যাডফোর্ডের উত্তরের সংযোজন, যেহেতু CGIআজকাল বেশিরভাগ লোক ব্যবহার করে না , আপনি এটিও ব্যবহার করতে পারেন Rack:

require 'rack/utils'
Rack::Utils.escape_html('Usage: foo "bar" <baz>')

মডেল উদাহরণ পদ্ধতিতে একইভাবে স্ট্রিংগুলি থেকে বাঁচার জন্য আরও ভাল উপায় কি থাকতে পারে?
সক্রিয় কোডিং

15

আপনি হয় h()বা ব্যবহার করতে পারেন html_escape(), তবে বেশিরভাগ লোক h()কনভেনশন করে ব্যবহার করে। রেলের h()জন্য সংক্ষিপ্ত html_escape()

আপনার নিয়ামক মধ্যে:

@stuff = "<b>Hello World!</b>"

আপনার দৃষ্টিতে:

<%=h @stuff %>

আপনি যদি এইচটিএমএল উত্সটি দেখেন: আপনি আসলে ডেটা বোল্ডিং ছাড়াই আউটপুট দেখতে পাবেন। অর্থাৎ এটি হিসাবে এনকোড করা আছে &lt;b&gt;Hello World!&lt;/b&gt;

এটি প্রদর্শিত হবে হিসাবে প্রদর্শিত হবে <b>Hello World!</b>


10

বিভিন্ন পদ্ধতির তুলনা:

> CGI::escapeHTML("quote ' double quotes \"")
=> "quote &#39; double quotes &quot;"

> Rack::Utils.escape_html("quote ' double quotes \"")
=> "quote &#x27; double quotes &quot;"

> ERB::Util.html_escape("quote ' double quotes \"")
=> "quote &#39; double quotes &quot;"

আমি রেল অ্যাক্টিভমেলার পলায়নের সাথে সামঞ্জস্য রাখতে নিজের লেখা লিখেছি:

def escape_html(str)
  CGI.escapeHTML(str).gsub("&#39;", "'")
end

0

h() উদ্ধৃতি অব্যাহতি জন্য দরকারী।

উদাহরণস্বরূপ, আমার একটি ভিউ আছে যা পাঠ্য ক্ষেত্রটি ব্যবহার করে একটি লিঙ্ক উত্পন্ন করে result[r].thtitle। পাঠ্যটিতে একক উদ্ধৃতি অন্তর্ভুক্ত থাকতে পারে। আমি যদি result[r].thtitleনিশ্চিতকরণ পদ্ধতিতে পালাতে না পারি তবে জাভাস্ক্রিপ্টটি ভেঙে যাবে:

&lt;%= link_to_remote "#{result[r].thtitle}", :url=>{ :controller=>:resource,
:action         =>:delete_resourced,
:id     => result[r].id,
:th     => thread,                                                                                                      
:html       =>{:title=> "<= Remove"},                                                       
:confirm    => h("#{result[r].thtitle} will be removed"),                                                   
:method     => :delete %>

&lt;a href="#" onclick="if (confirm('docs: add column &amp;apos;dummy&amp;apos; will be removed')) { new Ajax.Request('/resource/delete_resourced/837?owner=386&amp;th=511', {asynchronous:true, evalScripts:true, method:'delete', parameters:'authenticity_token=' + encodeURIComponent('ou812')}); }; return false;" title="&lt;= Remove">docs: add column 'dummy'</a>

দ্রষ্টব্য: :htmlশিরোনামের ঘোষণাটি জাদুকরীভাবে রেলগুলি দ্বারা পালিয়ে গেছে।

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