ফর্ম পুনরায় জমা দেওয়া রোধ করা হচ্ছে


107

প্রথম পৃষ্ঠায় একটি HTML ফর্ম রয়েছে। পৃষ্ঠা দুটি - জমা দেওয়া ডেটা পরিচালনা করে এমন কোড।

প্রথম পৃষ্ঠায় ফর্ম জমা দেওয়া হবে। ব্রাউজারটি দুটি পৃষ্ঠায় পুনঃনির্দেশিত হয়। পৃষ্ঠা দুটি জমা দেওয়া ডেটা পরিচালনা করে।

এই মুহুর্তে, পৃষ্ঠা দুটি সতেজ হয়ে উঠলে একটি "ফর্ম পুনরায় জমা দেওয়ার নিশ্চয়তা দিন" সতর্কতা পপ আপ হয়।

এটি কি প্রতিরোধ করা যায়?


: একটি নিশ্চিতকরণ ডায়ালগ ব্যবহার করুন stackoverflow.com/questions/6457750/form-confirm-before-submit/...

3
এখানে বর্ণিত হিসাবে পুনঃনির্দেশিত পোস্টটি ব্যবহার করুন - >> en.wikiki.org/wiki/Post/Redirect/Get
মীর

পুনঃনির্দেশ ছাড়াই আপনি এটি প্রতিরোধ করতে পারেন। দেখুন এখানে
Eugen Konkov

উত্তর:


145

এখানে 2 জন লোক ব্যবহার করত:

পদ্ধতি 1: AJAX + পুনঃনির্দেশ ব্যবহার করুন

এইভাবে আপনি JQuery বা পেজ 2 এর অনুরূপ কিছু ব্যবহার করে আপনার ফর্মটি পটভূমিতে পোস্ট করেন, যখন ব্যবহারকারী এখনও পৃষ্ঠা 1 প্রদর্শিত দেখেন। সফল পোস্টিংয়ের পরে, আপনি ব্রাউজারটি পৃষ্ঠা 2 এ পুনঃনির্দেশ করুন।

পদ্ধতি 2: পোস্ট + নিজেরে পুনঃনির্দেশ করুন

এটি ফোরামে একটি সাধারণ কৌশল। পেজ 1 এ ফর্মটি ডেটা পৃষ্ঠা 2 তে পোস্ট করে, পৃষ্ঠা 2 ডেটা প্রক্রিয়া করে এবং যা করা দরকার তা করে এবং তারপরে এটি নিজেই কোনও HTTP পুনর্নির্দেশ করে। এইভাবে ব্রাউজারটি সর্বশেষ "অ্যাকশন" মনে রাখছে পৃষ্ঠা 2 তে একটি সহজ জিইটি, সুতরাং ফ 5 টি ফর্মটি পুনরায় জমা দেওয়া হচ্ছে না।


2
পদ্ধতি 2 এর একটি বৈকল্পিক অন্য পৃষ্ঠায় পুনর্নির্দেশ। উদাহরণস্বরূপ, আপনি উদাহরণ. com/save.html এ পোস্ট করুন এবং একবার সংরক্ষণ শেষ হয়ে গেলে, আপনি উদাহরণ . com/list.html এ পুনঃনির্দেশ করুন ।
গিলিয়াম

1
পদ্ধতি 1 এর সাথে ক্লায়েন্টকে কিছু ঘটছে তা জানাতে আমি ব্লকইউআই নামের jQuery প্লাগইন ব্যবহার করব।
শিকিরিউ

আমি পদ্ধতি 2 ব্যবহার করছি তবে এটি পুনরায় রিফ্রেশ করলে আমাকে আবার জমা দিতে বলছে। কারও কি এ জাতীয় সমস্যা রয়েছে?
আগ্রহী

আপনি কি নিশ্চিত যে এইচটিটিপি পুনঃনির্দেশ সঠিকভাবে কাজ করছে? বহির্গামী HTTP অনুরোধগুলি পরীক্ষা করার জন্য আপনার ব্রাউজারটি যা যা আছে তা নেটওয়ার্ক ইন্সপেক্টর / ফায়ারব্যাগ / খুলুন এবং এইচটিটিপি কলগুলি দেখুন check আপনার প্রথমটি (ফর্ম ডেটা পোস্ট করা) পোষ্ট পদ্ধতিতে ঘটতে হবে, লোকেশন শিরোনামটি নিজের দিকে ইঙ্গিত করে HTTP কোড 301 ফিরিয়ে আনতে হবে এবং তারপরে তাত্ক্ষণিকভাবে আপনাকে জিইটি পদ্ধতিতে একই পৃষ্ঠাতে অন্য একটি এইচটিটিপি কোয়েরি দেখতে পাবে।
কোডটিউইস

@ কোডডউইস: আমার ক্ষেত্রে, পৃষ্ঠা 1 পৃষ্ঠাগুলিতে পোস্ট করেছে, পৃষ্ঠা 2 ডেটা প্রসেস করে এবং একটি পৃষ্ঠা দেখায় (মানগুলি টেমপ্লেটে প্রেরণ করা হয়) .. পুনর্নির্দেশটি কোথায় হওয়া উচিত? .. পৃষ্ঠায় জিইটি অনুরোধ নেই।
ব্যবহারকারী 1050619

24

আপনার PRG ব্যবহার করতে হবে - পোস্ট / পুনঃনির্দেশ / পান প্যাটার্ন এবং আপনি সবেমাত্র PRG এর পি প্রয়োগ করেছেন। আপনাকে পুনঃনির্দেশ করা দরকার । (এখনকার দিনে আপনার কোনও পুনর্নির্দেশের দরকার নেই See এটি দেখুন)

পিআরজি একটি ওয়েব বিকাশ নকশার প্যাটার্ন যা কিছু সদৃশ ফর্ম জমাগুলিকে বাধা দেয় যার অর্থ, ফর্ম জমা দিন (অনুরোধ পোস্ট করুন 1) -> পুনঃনির্দেশ করুন -> পান (অনুরোধ 2)

Under the hood

পুনঃনির্দেশ স্থিতি কোড - HTTP 302 সহ HTTP 1.0 বা HTTP 303 সহ HTTP 1.1

পুনঃনির্দেশ স্থিতি কোড সহ একটি HTTP প্রতিক্রিয়া অতিরিক্ত অবস্থান শিরোনাম ক্ষেত্রে একটি URL সরবরাহ করবে। ব্যবহারকারী এজেন্টকে (যেমন একটি ওয়েব ব্রাউজার) এই কোডটির সাথে একটি প্রতিক্রিয়া দ্বারা আমন্ত্রণ জানানো হয় যাতে দ্বিতীয় ক্ষেত্রে অনুরূপ, লোকেশন ক্ষেত্রে নির্দিষ্ট নতুন ইউআরএলকে অনুরোধ করা হয়।

পুনঃনির্দেশ স্থিতি কোডটি নিশ্চিত করা হয় যে এই পরিস্থিতিতে, ওয়েব ব্যবহারকারীর ব্রাউজারটি প্রাথমিক HTTP পোষ্ট অনুরোধটি পুনরায় জমা দেওয়ার কারণ ছাড়াই সার্ভারের প্রতিক্রিয়াটিকে নিরাপদে রিফ্রেশ করতে পারে।

Double Submit Problem

ডাবল জমা সমস্যা

Post/Redirect/Get Solution

পোস্ট / পুনঃনির্দেশ / সমাধান পান

উৎস


2
ভাল ব্যাখ্যা। আমি ভাবছি যদি ব্যবহারকারী পুনর্নির্দেশের পরে ব্রাউজারের পিছনের বোতামটি ক্লিক করে তবে কী হবে। "ফর্ম পুনরায় জমা দেওয়ার নিশ্চয়তা" পপআপটি আবার প্রদর্শিত হবে। আমার ধারণা, এমনকি যদি নিশ্চিতকরণ পপআপটি আবার প্রদর্শিত না হয়, একই ডেটা সহ পৃষ্ঠা 1 এ একটি পোস্ট অনুরোধ আবার করা হবে এবং আবার ব্যবহারকারীকে পৃষ্ঠা 2 এ পুনঃনির্দেশিত করা হবে I আমার ফর্মের একটি সিরিজ, form1, form2, form3 রয়েছে। কীভাবে বিন্যাসে "এন -1" ফর্ম "এন" থেকে ফিরে যেতে পারেন। এলোমেলো প্রশ্ন: আপনি কোথায় PRG ডিজাইন প্যাটার্ন অধ্যয়ন করেছেন
Rpant

@ ক্রোম অন ক্রোম পিএইচপি ফাইল যা লোকেশন শিরোনাম প্রেরণ করে তা ব্রাউজারের ইতিহাসেও দেখা যায় না, তাই পিছনের বোতামটি আপনাকে ফর্মটিতে ফিরিয়ে নিয়ে যায়।
ফ্লুরোসেন্টগ্রিন

@ অ্যাঞ্জেলিন পুনর্নির্দেশের পরে কীভাবে তথ্য পাবেন? প্রাক্তন হিসাবে আমি যখন কিছু ডেটা পোস্ট করি / কিছু_আরএল এবং / কিছু_আরলে পুনর্নির্দেশ করি যা একটি জিইটি অনুরোধ করে। আমি কীভাবে জানতে পারি যে / কিছু_আরএল জেনেরিক এবং / কিছু_আরএল / <id> এর মতো কোনও আইডি কনটিন করে না কেন তার প্রতিক্রিয়া কী হওয়া উচিত?
অমিত ত্রিপাঠি

@ আমিত্ত্রিপাঠি আপনার নিজের তৈরি করতে হবে উদাহরণস্বরূপ: পোস্টের অনুরোধটি গ্রাহকের ডেটা tingোকানো হতে পারে যেখানে জিইটি sertedোকানো ডেটার প্রদর্শন সফল হবে। আপনি ডাটাটি প্রদর্শন করতে সক্ষম হবেন কারণ এটি ফর্ম ডেটা ছাড়া কিছুই ছিল না বা ডাটাবেসে সফল সন্নিবেশের পরে গ্রাহক আইডি দিয়ে সেই গ্রাহকের জন্য ডাটাবেস থেকে আনার মাধ্যমে গ্রাহক পৃষ্ঠার দৃশ্যটি পুনরায় ব্যবহার করতে পারবেন।
অ্যাঞ্জলিন নাদের

তবে আমি @ ইউজেন কনকভ সমাধানের সাথে একমত
এঞ্জেলিন নাদার

10

সরাসরি, আপনি পারবেন না এবং এটি একটি ভাল জিনিস। ব্রাউজারের সতর্কতা একটি কারণ রয়েছে। এই থ্রেডটি আপনার প্রশ্নের উত্তর দেওয়া উচিত:

পিওএসটি নিশ্চিতকরণ সতর্কতা দেখানো থেকে পিছনে বোতামটি আটকাবেন

প্রস্তাবিত দুটি মূল কাজের ক্ষেত্রগুলি হ'ল পিআরজি প্যাটার্ন এবং একটি এজেএক্স জমা দেওয়ার পরে একটি স্ক্রিপ্টিং স্থানান্তর।

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


8

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


6

উত্তরের দুটি অংশ রয়েছে:

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

  2. নিশ্চিত করুন যে উভয় দ্বারা সদৃশ জমা দেওয়ার সম্ভাবনাটি ব্যবহারকারীর বিরক্ত নয়

    • পোষ্টের পরে জিইটি-তে পুনঃনির্দেশ করা হচ্ছে (জিইটি প্যাটার পুনঃনির্দেশ করুন)
    • জাভাস্ক্রিপ্ট ব্যবহার করে বোতামটি অক্ষম করা হচ্ছে

আপনি 2 এর নীচে কিছুই করবেন না সম্পূর্ণরূপে সদৃশ জমা জমা প্রতিরোধ করবে। লোকেরা খুব দ্রুত ক্লিক করতে পারে এবং হ্যাকাররা যে কোনওভাবে পোস্ট করতে পারে। আপনার সর্বদা 1. টি প্রয়োজন need আপনি যদি নিশ্চিত হন যে কোনও নকল নেই।


2

আপনি যদি কোনও পোষ্টের ডেটা দিয়ে একটি পৃষ্ঠা রিফ্রেশ করেন তবে ব্রাউজারটি আপনার পুনরায় জমা দেওয়ার বিষয়টি নিশ্চিত করবে। আপনি যদি জিইটি ডেটা ব্যবহার করেন তবে বার্তাটি প্রদর্শিত হবে না। আপনার জমাটি সংরক্ষণের পরে দ্বিতীয় পৃষ্ঠাও থাকতে পারে, কোনও ডেটা ছাড়াই তৃতীয় পৃষ্ঠায় পুনর্নির্দেশ করতে হবে।


2

আমি খুঁজে পেয়েছি কেউ এই কৌশল সম্পর্কে উল্লেখ করেনি।

পুনঃনির্দেশ ছাড়াই আপনি রিফ্রেশ করার পরেও ফর্ম নিশ্চিতকরণটি আটকাতে পারবেন।

ডিফল্টরূপে ফর্ম কোডটি এরকম:

<form method="post" action="test.php">

এখন, এটি পরিবর্তন করুন <form method="post" action="test.php?nonsense=1">

আপনি ম্যাজিক দেখতে পাবেন।

আমার ধারণা এটির কারণ ব্রাউজারগুলি নিশ্চিতকরণ সতর্কতা পপআপ ট্রিগার করবে না যদি এটি url এ একটি জিইটি পদ্ধতি (ক্যোয়ারী স্ট্রিং) পায়।


2

আপনি jquery ব্যবহার করে এটি করতে পারেন

<script>
   $(document).ready(function(){
   window.history.replaceState('','',window.location.href)
   });
</script>

পোস্ট পিছনের কারণে জমা দেওয়ার পরে আবার ডেটা প্রতিরোধের এটি সবচেয়ে মার্জিত উপায়।

আশাকরি এটা সাহায্য করবে.


0

পিআরজি প্যাটার্নটি কেবল পৃষ্ঠা রিফ্রেশের কারণে পুনরায় জমা দেওয়া রোধ করতে পারে। এটি 100% নিরাপদ পদক্ষেপ নয়।

সাধারণত, পুনরায় জমা রোধ করতে আমি নীচে পদক্ষেপ নেব:

  1. ক্লায়েন্ট সাইড - একটি বোতামে নকল ক্লিকগুলি প্রতিরোধ করতে জাভাস্ক্রিপ্ট ব্যবহার করুন যা ফর্ম জমা দেওয়ার ট্রিগার করবে। প্রথম ক্লিকের পরে আপনি কেবল বোতামটি অক্ষম করতে পারেন।

  2. সার্ভার সাইড - আমি জমা দেওয়া প্যারামিটারগুলিতে একটি হ্যাশ গণনা করব এবং সেশনে বা ডাটাবেসে সেই হ্যাশটি সংরক্ষণ করব, সুতরাং যখন সদৃশ জমাটি পাওয়া গেল তখন আমরা নকলটি সনাক্ত করতে পারি তখন ক্লায়েন্টের যথাযথ প্রতিক্রিয়া। তবে, আপনি ক্লায়েন্টের পাশে একটি হ্যাশ তৈরি করতে পরিচালনা করতে পারেন।

বেশিরভাগ অনুষ্ঠানে, এই পদক্ষেপগুলি পুনরায় জমা দেওয়া রোধ করতে সহায়তা করতে পারে।


0

আমি অ্যাঞ্জেলিনের উত্তরটি সত্যিই পছন্দ করি। তবে আপনি যদি এমন কোনও লিগ্যাসি কোড নিয়ে কাজ করছেন যেখানে এটি ব্যবহারিক নয়, এই কৌশলটি আপনার পক্ষে কাজ করতে পারে।

ফাইলের শীর্ষে

// Protect against resubmits
if (empty($_POST))  {
   $_POST['last_pos_sub'] = time();
} else {
     if (isset($_POST['last_pos_sub'])){
        if ($_POST['last_pos_sub'] == $_SESSION['curr_pos_sub']) {
           redirect back to the file so POST data is not preserved
        }
        $_SESSION['curr_pos_sub'] = $_POST['last_pos_sub'];
     }
}

তারপরে ফর্মটির শেষে, নীচের last_pos_subমতো আটকে দিন :

<input type="hidden" name="last_pos_sub" value=<?php echo $_POST['last_pos_sub']; ?>>

0

ট্রিস ব্যবহার করে দেখুন:

function prevent_multi_submit($excl = "validator") {
    $string = "";
    foreach ($_POST as $key => $val) {
    // this test is to exclude a single variable, f.e. a captcha value
    if ($key != $excl) {
        $string .= $key . $val;
    }
    }
    if (isset($_SESSION['last'])) {
    if ($_SESSION['last'] === md5($string)) {
        return false;
    } else {
        $_SESSION['last'] = md5($string);
        return true;
    }
    } else {
    $_SESSION['last'] = md5($string);
    return true;
    }
}

কীভাবে ব্যবহার / উদাহরণ:

if (isset($_POST)) {
    if ($_POST['field'] != "") { // place here the form validation and other controls
    if (prevent_multi_submit()) { // use the function before you call the database or etc
        mysql_query("INSERT INTO table..."); // or send a mail like...
        mail($mailto, $sub, $body); // etc
    } else {
        echo "The form is already processed";
    }
    } else {
    // your error about invalid fields
    }
}

হরফ: https://www.tutdepot.com/prevent-m Multiple-form-submission/


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