ব্যবহারকারীকে এএসপি.নেট এমভিসি - ভ্যালিডিয়েট ইনপুট বা মঞ্জুরিপ্রযুক্তিতে HTML ইনপুট করার অনুমতি দিন


120

আমি কীভাবে কোনও ব্যবহারকারীর ASP.net এমভিসি ব্যবহার করে কোনও নির্দিষ্ট ক্ষেত্রে HTML কে ইনপুট করার অনুমতি দিতে পারি।

আমার অনেকগুলি ক্ষেত্রের সাথে একটি দীর্ঘ ফর্ম রয়েছে যা নিয়ামকটিতে এই জটিল অবজেক্টটিতে ম্যাপ হয়।

আমি একটি ক্ষেত্র (বর্ণন) এইচটিএমএলকে অনুমতি দিতে চাই যা পরবর্তী সময়ে আমার নিজস্ব স্যানিটেশন প্রম্পট করবে।


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

উত্তর:


163

আপনি যে HTMLটির জন্য এইচটিএমএলকে মঞ্জুরি দিতে চান তাতে নিয়মিত ক্রিয়াকলাপ (পোস্ট) যুক্ত করুন:

[ValidateInput(false)] 

সম্পাদনা: অনুযায়ী Charlino মন্তব্য করেছেন:

আপনার ওয়েবকনফিগটিতে বৈধতা মোড ব্যবহৃত হয়েছে। এমএসডিএন দেখুন :

<httpRuntime requestValidationMode="2.0" />

সম্পাদনা করুন সেপ্টেম্বর 2014: অনুযায়ী sprinter252 মন্তব্য করেছেন:

আপনার এখন [AllowHtml]বৈশিষ্ট্যটি ব্যবহার করা উচিত । এমএসডিএন থেকে নীচে দেখুন :

এএসপি.নেট এমভিসি 3 অ্যাপ্লিকেশনগুলির জন্য, যখন আপনাকে আপনার মডেলটিতে ফিরে এইচটিএমএল পোস্ট করা দরকার, অনুরোধ বৈধকরণ বন্ধ করতে ValidateInput (মিথ্যা) ব্যবহার করবেন না don't কেবলমাত্র আপনার মডেলের সম্পত্তিতে [AllowHtml] যুক্ত করুন, এর মতো:

public class BlogEntry {
    public int UserId {get;set;}
    [AllowHtml] 
    public string BlogText {get;set;}
 }

1
আপনি যদি নেট 4 ব্যবহার করছেন তবে আপনাকে <httpRuntime requestValidationMode="2.0" />আপনার ওয়েব কোডফাইগ ফাইলটিতেও সেট করতে হবে।
চার্লিনো

3
.NET 4 এর জন্য আসলেই কোনও সমাধান নেই যা অনুরোধের বৈধতা মোডকে ডাউনগ্রেড করার অন্তর্ভুক্ত নয়?
bzlm

20
দুটিই MSDN ( msdn.microsoft.com/de-de/magazine/hh708755.aspx ) এরশাদ করেন, যে আপনার ValidateInpute ব্যবহার করা উচিত নয় এবং এর পরিবর্তে AllowHtmlAttribute নিতে। (ইংরেজি সংস্করণটি খুঁজে পেল না)
আলেকজান্ডার

8
আশা করা যায় যে 3 টি ডাউন ভোটগুলি সম্প্রতি করা হয়েছে বলে সম্বোধন করার জন্য সম্পাদনা করা হয়েছিল ... এটি একটি 4 বছরের পুরানো উত্তর ছিল :)
কেলসি

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

131

[AllowHtml]সম্পত্তির উপরের বৈশিষ্ট্য সম্পর্কে কী ?


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

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

1
দুর্ভাগ্যক্রমে এটি কার্যকর হয় না যদি আপনি মেটাডেটাটাইপঅ্যাট্রিবিউট
ডেভ_আই

@ ড্যাভ_আই: এই দ্রষ্টব্যটি সূক্ষ্মভাবে কাজ করে MetadataTypeAttributeএবং এটি পছন্দনীয় কারণ এটি কেবলমাত্র পুরো বস্তুর পরিবর্তে পৃথক ক্ষেত্রগুলিতে এইচটিএমএলকে অনুমতি দেয়।
কোডিং হয়ে গেছে

@ ট্র্যু ব্লুউসি, আমি আমার এমভিসি ৪.০ পরিবেশে কয়েক ঘন্টা চেষ্টা করে যাচ্ছি এবং যদিও AllowHtml এর কাজ করা উচিত নয়। আমাকে পরাজয় স্বীকার করতে হবে এবং একটি কম সুরক্ষিত বিকল্পের সাথে যেতে হবে যা প্যান্ট is AllowHtml কেবল মেটাডেটাটাইপঅ্যাট্রিবিউটের ব্যবহার নিয়ে কাজ করছে বলে মনে হচ্ছে না
জুলিয়ান গুপি

42

মডেল যুক্ত করুন:

using System.Web.Mvc;

এবং আপনার সম্পত্তি

        [AllowHtml]
        [Display(Name = "Body")]
        public String Body { get; set; }

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


9

যোগ করার পদ্ধতি [AllowHtml]নির্দিষ্ট সম্পত্তি হিসাবে ব্লগ এবং মন্তব্য নিরাপত্তার মাত্রা, যা অগ্রহণযোগ্য হওয়া উচিত হ্রাস পরামর্শ প্রচুর আছে প্রস্তাবিত সমাধান।

যোগ করে, এমভিসি ফ্রেমওয়ার্কটি কন্ট্রোলারকে আঘাত করতে এবং সেই নিয়ামকের কোডটি কার্যকর করতে দেয় to

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

যে কোনও ক্ষেত্রে, [AllowHtml]বৈশিষ্ট্য যুক্ত করা হ'ল সঠিক উত্তর, কারণ এটি এইচটিএমএলকে নিয়ামকটিতে deserialized করার অনুমতি দেয় allows আপনার ভিউ মডেলের উদাহরণ:

[AllowHtml]
public string MessageWithHtml {get; set;}

8

আমি একই সমস্যার মুখোমুখি হয়েছি যদিও আমি [System.Web.Mvc.AllowHtml]কিছু উত্তরে বর্ণিত সম্পত্তি সম্পর্কিত সম্পত্তি যুক্ত করেছি।

আমার ক্ষেত্রে, আমার কাছে একটি UnhandledExceptionFilterক্লাস রয়েছে যা এমভিসি বৈধকরণ হওয়ার আগে অনুরোধ অবজেক্টটিতে অ্যাক্সেস করে (এবং সুতরাং AllowHtML এর কোনও প্রভাব পড়ে না) এবং এই অ্যাক্সেসটি একটি উত্থাপন করে [HttpRequestValidationException] A potentially dangerous Request.Form value was detected from the client

এর অর্থ, একটি অনুরোধের অবজেক্টের নির্দিষ্ট বৈশিষ্ট্য অ্যাক্সেস করা সুস্পষ্টভাবে বৈধতা চালায় (আমার ক্ষেত্রে এটির Paramsসম্পত্তি)।

বৈধতা রোধ করার একটি সমাধান এমএসডিএন- তে নথিভুক্ত করা হয়

একটি অনুরোধে নির্দিষ্ট ক্ষেত্রের জন্য অনুরোধের বৈধতা অক্ষম করতে (উদাহরণস্বরূপ, কোনও ইনপুট উপাদান বা ক্যোয়ারী স্ট্রিংয়ের মানের জন্য), অনুরোধটি কল করুন following নিম্নোক্ত উদাহরণে দেখানো হিসাবে, আইটেমটি পেয়ে গেলে অবৈধ পদ্ধতি

সুতরাং, আপনার যদি এই মত কোড থাকে

var lParams = aRequestContext.HttpContext.Request.Params;
if (lParams.Count > 0)
{
  ...

এটি পরিবর্তন করুন

var lUnvalidatedRequest = aRequestContext.HttpContext.Request.Unvalidated;

var lForm = lUnvalidatedRequest.Form;
if (lForm.Count > 0)
{
  ...

অথবা কেবলমাত্র সেই Formসম্পত্তিটি ব্যবহার করুন যা বৈধতা যাচাই করে না বলে মনে হয়

var lForm = aRequestContext.HttpContext.Request.Form;
if (lForm.Count > 0)
{
  ...

1
ধন্যবাদ! অনুরোধ.অনুযুক্ত হ'ল একমাত্র সমাধান যা আমার পক্ষে কাজ করেছিল।
পিটার আইভারসন

3

যদি আপনাকে অ্যাকশন-পদ্ধতি প্যারামিটারের জন্য এইচটিএমএল ইনপুটের অনুমতি দেওয়ার প্রয়োজন হয় ("মডেল সম্পত্তি" এর বিপরীতে) এটি করার কোনও অভ্যন্তরীণ উপায় নেই তবে আপনি কাস্টম মডেল বাইন্ডার ব্যবহার করে সহজেই এটি অর্জন করতে পারেন:

public ActionResult AddBlogPost(int userId,
    [ModelBinder(typeof(AllowHtmlBinder))] string htmlBody)
{
    //...
}

AllowHtml বাইন্ডার কোড:

public class AllowHtmlBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var request = controllerContext.HttpContext.Request;
        var name = bindingContext.ModelName;
        return request.Unvalidated[name]; //magic happens here
    }
}

আমার ব্লগ পোস্টে সম্পূর্ণ উত্স কোড এবং ব্যাখ্যা সন্ধান করুন: https://www.jitbit.com/alexblog/273-aspnet-mvc-allowing-html- for-particular-क्शन- paraters/


1
অবৈধ মনে হচ্ছে কেবলমাত্র 4.5 বা তার উপরে ফ্রেমওয়ার্কে উপলব্ধ।
বেন

@ ঠিক আছে! দয়া করে এই পরিবর্তিত সমাধানটি পরীক্ষা করুন। stackoverflow.com/questions/59483284/…
ওম-হা

3

ইউআরএল ডেটা এনকোডিং আমার জন্যও কাজ করে

উদাহরণ স্বরূপ

var ডেটা = '<b> হ্যালো </ b>'

ব্রাউজারে পোস্ট করার আগে এনকোডিউআরআইকিউম্পোন্ট (ডেটা) কল করুন

সার্ভারে এইচটিপিটিউটিলিটি Uআরলডিকোড (প্রাপ্ত_ডাটা) ডিকোড করতে কল করুন

এই ভাবে আপনি ঠিক কোন ক্ষেত্রের অঞ্চলটি এইচটিএমএল থাকার অনুমতি দিয়েছিলেন তা নিয়ন্ত্রণ করতে পারবেন


এখন পর্যন্ত সবচেয়ে সহজ উপায়
N1gthm4r3

1

নপকমার্স ব্যবহার করে ই-কমার্স সাইটের উন্নয়নের সময় আমি এই সমস্যার মুখোমুখি হয়েছি, আমি পূর্ববর্তী উত্তরগুলির মতো 3 টি বিভিন্ন উপায়ে এই সমাধানটি পেয়েছি। তবে নপকমার্স কাঠামো অনুসারে আমি একবারে এই তিনটি খুঁজে পাইনি। আমি সবেমাত্র দেখেছি যে তারা সেখানে ঠিকঠাক ব্যবহার [AllowHtml]করছে এবং কোনও সমস্যা ছাড়াই এটি কাজ করছে working পূর্বে প্রশ্ন করা হিসাবে

ব্যক্তিগতভাবে আমি পছন্দ করি না [ValidateInput(false)]কারণ আমি মোট মডেল সত্তা যাচাই করা বাদ দিচ্ছি যা অনিরাপদ। তবে কেউ যদি কেবল লেখেন তবে এখানে একবার দেখুন

[AllowHtml] 
public string BlogText {get;set;}

তারপরে এটি কেবলমাত্র একক সম্পত্তি এড়িয়ে চলে এবং কেবলমাত্র নির্দিষ্ট সম্পত্তিকে অনুমতি দেয় এবং অন্যান্য সমস্ত সত্ত্বাকে খুব কমই পরীক্ষা করে। সুতরাং এটি আমার দিকে ভাল মনে হয়।


1

আমার ক্ষেত্রে, আউটপুট ক্যাশে অ্যাকশন ফিল্টারটির সাথে মিলিত হওয়ার পরে AllowHtml অ্যাট্রিবিউট কাজ করছে না। এই উত্তরটি আমার জন্য সমস্যার সমাধান করেছে। আশা করি এটি কাউকে সাহায্য করবে।


1

আপনি [AllowHtml]উদাহরণস্বরূপ আপনার প্রকল্পে ব্যবহার করতে পারেন

 [AllowHtml]
 public string Description { get; set; }

ক্লাস লাইব্রেরিতে এই কোডটি ব্যবহারের জন্য আপনি এই প্যাকেজটি ইনস্টল করুন

Install-Package Microsoft.AspNet.Mvc

এটি ব্যবহার করার পরে using

using System.Web.Mvc;

0

দুর্ভাগ্যক্রমে এখানে উত্তরগুলির কোনওটিই আমার পক্ষে কার্যকর হয়নি।

আমি কাস্টম মডেল বাইন্ডিং ব্যবহার করে শেষ করেছি এবং তৃতীয় পক্ষের স্যানিটাইজার ব্যবহার করেছি।

আমার স্ব-উত্তরযুক্ত প্রশ্নটি এখানে দেখুন

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