অনুরোধের প্যারামিটার '_csrf' বা শিরোনাম 'এক্স-সিএসআরএফ-টোকেন'-তে অবৈধ সিএসআরএফ টোকেন 'নাল' পাওয়া গেছে


91

স্প্রিং সিকিউরিটি ৩.২ কনফিগার করার পরে, _csrf.tokenকোনও অনুরোধ বা সেশন অবজেক্টে আবদ্ধ নয়।

এটি বসন্ত সুরক্ষা কনফিগারেশন:

<http pattern="/login.jsp" security="none"/>

<http>
    <intercept-url pattern="/**" access="ROLE_USER"/>
    <form-login login-page="/login.jsp"
                authentication-failure-url="/login.jsp?error=1"
                default-target-url="/index.jsp"/>
    <logout/>
    <csrf />
</http>

<authentication-manager>
    <authentication-provider>
        <user-service>
            <user name="test" password="test" authorities="ROLE_USER/>
        </user-service>
    </authentication-provider>
</authentication-manager>

Login.jsp ফাইল sp

<form name="f" action="${contextPath}/j_spring_security_check" method="post" >
    <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />
    <button id="ingresarButton"
            name="submit"
            type="submit"
            class="right"
            style="margin-right: 10px;">Ingresar</button>
    <span>
        <label for="usuario">Usuario :</label>
        <input type="text" name="j_username" id="u" class="" value=''/>
    </span>
    <span>
        <label for="clave">Contrase&ntilde;a :</label>

        <input type="password"
               name="j_password"
               id="p"
               class=""
               onfocus="vc_psfocus = 1;"
               value="">
    </span>
</form>

এবং এটি পরবর্তী এইচটিএমএল রেন্ডার করে:

<input type="hidden" name="" value="" />

ফলাফল 403 HTTP স্থিতি:

Invalid CSRF Token 'null' was found on the request parameter '_csrf' or header 'X-CSRF-TOKEN'.

আপডেট কিছু ডিবাগের পরে, অনুরোধের অবজেক্টটি DelegatingFilterProxy সূক্ষ্ম ফর্মটি পেয়ে যায়, তবে কোয়েটএডাপ্টারের 469 লাইনে এটি অনুরোধ কার্যকর করে re যা সমস্ত বৈশিষ্ট্য মুছে ফেলে ...

আমি টমকাট 6.0.36, 7.0.50 জেডিকে 1.7 দিয়ে পরীক্ষা করি।

আমি এই আচরণটি বুঝতে পারি না, বরং, যদি কেউ সিএসআরএফের সাথে কাজ করে স্প্রিং সিকিউরিটি ৩.২ সহ কিছু প্রয়োগের নমুনা যুদ্ধের দিকে আমাকে নির্দেশ করেন তবে এটি সম্ভব হবে।


4
আপনি কোন বসন্ত সংস্করণ ব্যবহার করবেন? এই একই জিনিসটি spring-security.xmlস্প্রিং ৪.০.০ রিলিজ (জিএ), স্প্রিং সিকিউরিটি ৩.২.০ রিলিজ (জিএ) এর সাথে আমার জন্য কাজ করে (যদিও এটি স্ট্রুটস ২.৩.১ with এর সাথে সংহত হয়েছে। আমি এটিকে একটিও দিইনি) একা বসন্ত এমভিসি দিয়ে চেষ্টা করুন)। 403 স্ট্যাটাসের সাথে ফাইলগুলি আপলোড করার জন্য অনুরোধটি বহুগুণে নেমে গেলে এটি ব্যর্থ হয় I'm আমি এর সমাধান খুঁজতে লড়াই করছি।
ক্ষুদ্র

স্প্রিং ৩.২..6, স্প্রিং সিকিউরিটি ৩.২.০, সিএসআরএফ, টোকেনটি http--অনুরোধ অবজেক্টে যুক্ত করা হয়েছিল, অনুরোধের থ্রেডের সাথে সেশনের অবজেক্টটি একই রকম হয়, তবে যখন তার রেন্ডার না হয় যতক্ষণ না জেএসপি সমস্ত বৈশিষ্ট্য মুছে ফেলে এবং কেবল একটি বৈশিষ্ট্য রেখে যান ... ফিল্টার_ অ্যাপ্লাইড
হুগো রোবায়ো 4'14

@ টিনি: আপনি কি কখনও মাল্টিপার্ট সমস্যার সমাধান খুঁজে পেয়েছেন? আমি ঠিক একই সমস্যা হচ্ছে।
রব জোহানসেন

4
@ অ্যালিয়ানবিশপ: হ্যাঁ, দয়া করে এই উত্তরটি দেখুন (এটি স্প্রিং এবং স্ট্রটসের সংমিশ্রণ ব্যবহার করে)। যদি আপনার কাছে স্প্রিং এমভিসি একা থাকে তবে দয়া করে এই উত্তরটি দেখুন। এটি লক্ষ করা উচিত যে ফিল্টারগুলির ক্রমটি web.xmlঅত্যন্ত গুরুত্বপূর্ণ। MultipartFilterআগে ঘোষণা করতে হবে springSecurityFilterChain। আশা করি এইটি কাজ করবে. ধন্যবাদ
ছোট

উত্তর:


113

দেখে মনে হচ্ছে আপনার বসন্ত অ্যাপ্লিকেশনটিতে সিএসআরএফ (ক্রস সাইট রিকোয়েস্ট জালিয়াতি) সুরক্ষা সক্ষম করা আছে। আসলে এটি ডিফল্টরূপে সক্ষম হয়।

বসন্ত.io অনুযায়ী :

আপনার কখন সিএসআরএফ সুরক্ষা ব্যবহার করা উচিত? আমাদের সুপারিশটি হ'ল সাধারণ ব্যবহারকারীরা ব্রাউজার দ্বারা প্রক্রিয়াজাত করা যে কোনও অনুরোধের জন্য সিএসআরএফ সুরক্ষা ব্যবহার করতে পারেন। আপনি যদি কেবল এমন একটি পরিষেবা তৈরি করছেন যা ব্রাউজার-বিহীন ক্লায়েন্টদের দ্বারা ব্যবহৃত হয়, আপনি সম্ভবত সিএসআরএফ সুরক্ষা অক্ষম করতে চাইবেন।

সুতরাং এটি অক্ষম করতে:

@Configuration
public class RestSecurityConfig extends WebSecurityConfigurerAdapter {
  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http.csrf().disable();
  }
}

আপনি যদি সিএসআরএফ সুরক্ষা সক্ষম রাখতে চান তবে আপনাকে আপনার ফর্মটিতে অন্তর্ভুক্ত করতে হবে csrftoken। আপনি এটি এর মতো করতে পারেন:

<form .... >
  ....other fields here....
  <input type="hidden"  name="${_csrf.parameterName}"   value="${_csrf.token}"/>
</form>

এমনকি আপনি ফর্মের ক্রিয়ায় সিএসআরএফ টোকেনও অন্তর্ভুক্ত করতে পারেন:

<form action="./upload?${_csrf.parameterName}=${_csrf.token}" method="post" enctype="multipart/form-data">

4
এটি উত্তর হিসাবে গ্রহণ করা উচিত কারণ এটি কেবল কী করা উচিত তা নয়, এই ত্রুটিগুলি বন্ধ করতে কিছু করার আগে আপনার কী বিবেচনা করা উচিত তাও ব্যাখ্যা করে।
থমাস ক্যারিসেল

4
আপনিও করতে পারেন.csrf().ignoringAntMatchers("/h2-console/**")
ইনান-ই

উপরের উত্তরে ক্যোয়ারী প্যারামিটার শৈলীর মধ্য দিয়ে যাওয়া এড়ানো উচিত। আপনি যদি এটি করেন আপনি প্রকাশ্যে টোকেন প্রকাশ করছেন।
প্রমোদ এস নিকম

32

আপনি লগইন ফর্ম যোগ করা উচিত নয় ?;

<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/> 

এখানে বসন্ত সুরক্ষা ডকুমেন্টেশন হিসাবে বলা হয়েছে


12

আপনি যদি আবেদন করেন security="none"তবে কোনও সিএসআরএফ টোকেন তৈরি করা হবে না। পৃষ্ঠাটি সুরক্ষা ফিল্টার দিয়ে যাবে না। অবিসংবাদিত ভূমিকা ব্যবহার করুন।

আমি বিশদে যাই নি, তবে এটি আমার পক্ষে কাজ করছে।

 <http auto-config="true" use-expressions="true">
   <intercept-url pattern="/login.jsp" access="hasRole('ANONYMOUS')" />
   <!-- you configuration -->
   </http>

আমি সুরক্ষা = ব্যবহার করছিলাম না এবং আপনার উত্তরে এই সমস্যাটির সমাধান হয়েছে solved এটা দুর্দান্ত থাইমালিফ স্বয়ংক্রিয়ভাবে সিএসআরএফ টোকেন যুক্ত করে। ধন্যবাদ!
rxx



6

সিএসআরএফ অক্ষম করার জন্য স্প্রিং ডকুমেন্টেশন: https://docs.spring.io/spring-security/site/docs/current/references/html/csrf.html#csrf-configure

@EnableWebSecurity
public class WebSecurityConfig extends
WebSecurityConfigurerAdapter {

   @Override
   protected void configure(HttpSecurity http) throws Exception {
      http.csrf().disable();
   }
}

দয়া করে বিদ্যমান উত্তরগুলি অনুলিপি করবেন না।
james.garriss 14

4

আমারও একই সমস্যা ছিল

আপনার কনফিগারেশনটি সুরক্ষা ব্যবহার করে = "কিছুই নয়" তাই _ সিএসআরএফ তৈরি করতে পারে না:

<http pattern="/login.jsp" security="none"/>

আপনি পৃষ্ঠা / লগিনের জন্য অ্যাক্সেস = "IS_AUTHENTICATED_ANONYMOUSLY" সেট করতে পারেন above উপরের কনফিগারেশনটি প্রতিস্থাপন করুন :

<http>
    <intercept-url pattern="/login.jsp*" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
    <intercept-url pattern="/**" access="ROLE_USER"/>
    <form-login login-page="/login.jsp"
            authentication-failure-url="/login.jsp?error=1"
            default-target-url="/index.jsp"/>
    <logout/>
    <csrf />
</http>

2

আমি মনে করি সিএসআরএফ কেবল বসন্তের ফর্মগুলির সাথে কাজ করে

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

form:formট্যাগ পরিবর্তন করুন এবং এটি কাজ করে দেখুন।


আপনার বসন্তের ফর্মগুলি ব্যবহার করার দরকার নেই: ডকস.স্প্রিং.আইও
বার্ট সোয়েনেনহুইস

1

দয়া করে গিথুবে আমার কাজের নমুনা অ্যাপ্লিকেশনটি দেখুন এবং আপনার সেট আপের সাথে তুলনা করুন।


আমি বসন্ত 3.2.6 এ ডাউনগ্রেড করব, আমি আশা করি এটি বসন্তের এমভিসি ছাড়াই কাজ করে।
হুগো রোবায়ো

হ্যাঁ, এটি সমস্যা ছাড়াই কাজ করা উচিত কারণ আমি আমার বিদ্যমান অ্যাপ্লিকেশনটি থেকে স্যাম্পল অ্যাপ্লিকেশন তৈরি করেছি যা স্প্রিং ৩.১.৪ এ ছিল।
মনিশ

হা হা হা হা হা, দুর্দান্ত, এটিকে কেবল ডাউনগ্রেডিংয়ে কাজ করা সমাধান ভাইয়াহ জি মনিশ নয়
কুলদীপ সিং

1

সমাধানগুলির মধ্যে একটিও আমাকে গঠন করেনি। স্প্রিং ফর্মে আমার জন্য একমাত্র যে কাজ করেছে:

ক্রিয়া = "./ আপলোড? $ {_ csrf.parameterName} = $ {_ csrf.token}"

সঙ্গে প্রতিস্থাপিত:

ক্রিয়া = "./ আপলোড? _csrf = $ {_ csrf.token}"

(জাভা কনফিগারেশনে সক্ষমিত সিএসআরএফ সহ বসন্ত 5)


0

আপনার নিয়ামকটিতে নিম্নলিখিতগুলি যুক্ত করুন:

@RequestParam(value = "_csrf", required = false) String csrf

এবং jsp পেজে অ্যাড করুন

<form:form modelAttribute="someName" action="someURI?${_csrf.parameterName}=${_csrf.token}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.