പരീക്ഷണ വിജയം php. ഒരു പ്രൊബേഷണറി കാലയളവിൽ ഒരു PHP ഡവലപ്പർക്കുള്ള ടെസ്റ്റ് ടാസ്ക്ക്. ഒരു js സ്ക്രിപ്റ്റ് സൃഷ്ടിക്കുന്നു

സാധനങ്ങൾക്കും സേവനങ്ങൾക്കും ഓൺലൈനായി പണമടയ്ക്കാനുള്ള താങ്ങാനാവുന്നതും സുരക്ഷിതവുമായ മാർഗമാണിത്. നിങ്ങളുടെ ഓൺലൈൻ സ്റ്റോറിൽ ഈ സിസ്റ്റത്തിനായി ഒരു പ്രോസസർ ചേർക്കുകയും കാലതാമസമില്ലാതെ പേയ്‌മെൻ്റുകൾ സ്വീകരിക്കുകയും ചെയ്യുക.

അപ്ഡേറ്റ് ചെയ്ത Yandex.Money 3.0 പ്രോട്ടോക്കോൾ വിവിധ തരത്തിലുള്ള പേയ്മെൻ്റ് ഉപയോഗിക്കാൻ നിങ്ങളെ അനുവദിക്കുന്നു:

  • യഥാർത്ഥത്തിൽ Yandex പണം;
  • ബാങ്ക് കാർഡുകൾ;
  • ടെർമിനലുകൾ വഴിയുള്ള പേയ്‌മെൻ്റുകൾ;
  • മൊബൈൽ പേയ്‌മെൻ്റുകൾ.
കൂടാതെ, പ്ലാറ്റ്ഫോമിൽ സൃഷ്ടിച്ച സ്റ്റോറുകൾ ബന്ധിപ്പിക്കുന്നതിനുള്ള നടപടിക്രമം 1C-ബിട്രിക്സ്: സൈറ്റ് മാനേജ്മെൻ്റ്, Yanedex. Money ലേക്ക് ഗണ്യമായി ലളിതമാക്കിയിരിക്കുന്നു. നിങ്ങൾ Yandex.Money വെബ്‌സൈറ്റിൽ ഒരു അഭ്യർത്ഥന നൽകേണ്ടതുണ്ട് (നിങ്ങളുടെ വെബ്‌സൈറ്റ് ഓണാണെന്ന് അഭിപ്രായത്തിൽ സൂചിപ്പിക്കുക പ്രോട്ടോക്കോൾ പതിപ്പ് 3.0.) കൂടാതെ ഒരു ലളിതമായ ഫോം പൂരിപ്പിക്കുക (3 ഫീൽഡുകൾ മാത്രം ഉൾക്കൊള്ളുന്നു).

1C-Bitrix പ്ലാറ്റ്‌ഫോമിലെ ഒരു ഓൺലൈൻ സ്റ്റോറിൽ പുതിയ Yandex.Money പ്രോട്ടോക്കോൾ ബന്ധിപ്പിക്കുന്നതിന്, നിങ്ങൾ ഒരു പുതിയ പേയ്‌മെൻ്റ് സിസ്റ്റം സൃഷ്‌ടിച്ച് ഒരു പ്രോസസ്സർ തിരഞ്ഞെടുക്കേണ്ടതുണ്ട്.

https പ്രോട്ടോക്കോൾ ഉപയോഗിച്ച് നിങ്ങളുടെ സൈറ്റ് പ്രതികരിക്കുന്നുണ്ടോയെന്ന് പരിശോധിക്കുക. Yanedex.Money 3.0 പ്രോട്ടോക്കോൾ ഉപയോഗിച്ച് പേയ്‌മെൻ്റുകൾ സ്വീകരിക്കുന്നതിന് ഇത് ഒരു മുൻവ്യവസ്ഥയാണ്.

നിങ്ങൾക്ക് സ്വയം ഒപ്പിട്ട SSL സർട്ടിഫിക്കറ്റ് അല്ലെങ്കിൽ ഞങ്ങളുടെ വെർച്വൽ മെഷീൻ ഉപയോഗിക്കാം, അവിടെ എല്ലാം ഇതിനകം കോൺഫിഗർ ചെയ്‌തിരിക്കുന്നു.

അടുത്തതായി, സൂചിപ്പിക്കുക സെൻട്രൽ പ്രോസസ്സിംഗ് സെൻ്ററിൽ ഐഡി സംഭരിക്കുക, സെൻട്രൽ പ്രോസസ്സിംഗ് സെൻ്ററിലെ ഷോപ്പ് വിൻഡോ നമ്പർ, ഒരു കരാർ അവസാനിപ്പിക്കുമ്പോൾ നിങ്ങൾക്ക് Yandex-ൽ നിന്ന് ലഭിക്കണം, കൂടാതെ ഷോപ്പ് പാസ്‌വേഡ് (ഷോപ്പ് പാസ്‌വേഡ്)സ്റ്റോറിൻ്റെ Yandex പ്രൊഫൈലിൽ നിന്ന്.

ഓരോ തരത്തിലുള്ള പേയ്‌മെൻ്റിനും, നിങ്ങളുടേതായ പ്രോസസ്സർ സൃഷ്‌ടിച്ച് ആവശ്യമായ പേയ്‌മെൻ്റ് തരം തിരഞ്ഞെടുക്കേണ്ടതുണ്ട്.

പേയ്‌മെൻ്റ് പരിശോധിക്കുന്നതിന് നിങ്ങൾ ഫീൽഡിൽ "Y" മൂല്യം നൽകേണ്ടതുണ്ട് ടെസ്റ്റ് മോഡ്. Yandex.Money 3.0 പ്രോട്ടോക്കോളിലേക്ക് കണക്റ്റുചെയ്യുന്നതിന് നിങ്ങൾ ഒരു അപേക്ഷ സമർപ്പിക്കുമ്പോൾ, നിങ്ങൾക്ക് ഒരു പ്രത്യേക ലിങ്ക് ലഭിക്കും, അത് ഉപയോഗിച്ച് 1000 റൂബിളുകൾ ഉപയോഗിച്ച് നിങ്ങളുടെ വാലറ്റിൻ്റെ ബാലൻസ് ടോപ്പ് അപ്പ് ചെയ്യാൻ കഴിയും.

ഓൺലൈൻ സ്റ്റോർ മൊഡ്യൂളിൻ്റെ ക്രമീകരണങ്ങളിൽ, വിജയകരമായ പേയ്‌മെൻ്റിനെക്കുറിച്ചോ പിശകിനെക്കുറിച്ചോ ഉള്ള ഒരു സന്ദേശം ഉപയോഗിച്ച് പേജുകളിലേക്കുള്ള പാതകൾ നിങ്ങൾക്ക് പുനർനിർവചിക്കാം.

എല്ലാം. സജ്ജീകരണം പൂർത്തിയായി. ഉപയോഗിക്കുക

Yandex.Money (1.6) ൻ്റെ മുൻ പതിപ്പ് കണക്റ്റുചെയ്‌ത ക്ലയൻ്റുകൾ പതിപ്പ് 3.0-ലേക്ക് അപ്‌ഗ്രേഡ് ചെയ്യേണ്ടതില്ല. ആ. രണ്ട് പതിപ്പുകളും Yandex.Money, 1C-Bitrix എന്നിവ പിന്തുണയ്ക്കുന്നു: സൈറ്റ് മാനേജ്മെൻ്റ്. എന്നാൽ Yandex.Money ഒഴികെയുള്ള പേയ്‌മെൻ്റുകൾ ഉപയോഗിക്കാനുള്ള കഴിവ് പതിപ്പ് 1.6 ചേർക്കുന്നില്ല. ഈ പേയ്‌മെൻ്റ് സിസ്റ്റത്തിൻ്റെ പുതിയ ക്ലയൻ്റുകളെ പ്രോട്ടോക്കോൾ 3.0 ഉപയോഗിച്ച് ബന്ധിപ്പിച്ചിരിക്കുന്നു.

ഉൽപ്പന്ന വിതരണത്തിൽ 1C-ബിട്രിക്സ്: സൈറ്റ് മാനേജ്മെൻ്റ് Yandex.Money പ്രോസസർ (3.0) ഓൺലൈൻ സ്റ്റോർ (വിൽപ്പന) മൊഡ്യൂളിൻ്റെ 14.0.0 പതിപ്പിൽ പുറത്തിറക്കും. ഈ അപ്‌ഡേറ്റ് റിലീസ് ചെയ്യുന്നതിനുമുമ്പ് (മാസാവസാനം ഇത് ആൽഫയിൽ റിലീസ് ചെയ്യുമെന്ന് ഞങ്ങൾ കരുതുന്നു), ഹാൻഡ്‌ലറോട് സാങ്കേതിക പിന്തുണയിലൂടെ അഭ്യർത്ഥിക്കാം.

ആധുനിക വെബ് യുഗത്തിൽ, മിക്ക വെബ്‌സൈറ്റുകളും കൂടുതൽ കൂടുതൽ സംവേദനാത്മകമായി മാറുകയാണ്. മുമ്പ്, അപ്‌ഡേറ്റ് ചെയ്‌ത ഡാറ്റ ലഭിക്കുന്നതിന്, ഞങ്ങൾക്ക് മുഴുവൻ പേജും പുതുക്കേണ്ട ആവശ്യമുണ്ടെങ്കിൽ, ഇപ്പോൾ മുഴുവൻ പേജും ലോഡ് ചെയ്യാൻ അനുവദിക്കുന്ന സാങ്കേതികവിദ്യകൾ പ്രത്യക്ഷപ്പെട്ടു, പക്ഷേ അതിൻ്റെ ഒരു പ്രത്യേക ഭാഗം മാത്രം. അതാകട്ടെ, ഇത് ഉപയോക്താക്കൾക്കും സെർവർ ഉടമകൾക്കും സൗകര്യം പ്രദാനം ചെയ്യുന്നു, കാരണം പേജിൻ്റെ ഒരു പ്രത്യേക ഭാഗം മാത്രമേ ലോഡ് ചെയ്തിട്ടുള്ളൂ എന്നതിനാൽ പേജ് ഉപയോക്താവിന് വേഗത്തിൽ ലോഡുചെയ്യും, കൂടാതെ സെർവറിന് ഓരോ തവണയും പേജ് സൃഷ്‌ടിച്ച് നൽകേണ്ടതില്ല. ഉപയോക്താവ്. ഈ സവിശേഷതകൾ php, ajax എന്നിവ ഉപയോഗിച്ച് നടപ്പിലാക്കാൻ എളുപ്പമാണ്.

AJAX ആശയം എങ്ങനെ പ്രവർത്തിക്കുന്നുവെന്ന് നന്നായി മനസ്സിലാക്കാൻ ഇന്ന് നമ്മൾ ഒരു ചെറിയ ഉദാഹരണം നോക്കും. php ഉം ajax ഉം എങ്ങനെ പരസ്പരം ഇടപഴകുന്നുവെന്ന് തുടക്കക്കാർക്ക് മനസിലാക്കാൻ ചിലപ്പോൾ ബുദ്ധിമുട്ടാണ്; മുഴുവൻ പേജും റീലോഡ് ചെയ്യാതെ തന്നെ ഫ്ലൈയിൽ ഫോമുകൾ എങ്ങനെ സാധൂകരിക്കാം എന്നതിൻ്റെ ഉദാഹരണങ്ങൾ പലരും തിരയുന്നു. ഇത് എങ്ങനെ ചെയ്യുന്നുവെന്ന് ഞാൻ നിങ്ങൾക്ക് ഹ്രസ്വമായി കാണിച്ചുതരാം, അതുവഴി ഭാവിയിൽ മറ്റ് ടൂളുകൾ കൂടുതൽ വേഗത്തിൽ മാസ്റ്റർ ചെയ്യാനും നിങ്ങളുടെ സ്വന്തം സ്ക്രിപ്റ്റുകൾ എഴുതാനും നിങ്ങളെ അനുവദിക്കുന്ന അടിസ്ഥാനകാര്യങ്ങളും തത്വങ്ങളും നിങ്ങൾക്ക് മനസിലാക്കാൻ കഴിയും.

നമുക്കായി ഒരു ചെറിയ ടാസ്‌ക് കൊണ്ടുവരാം, php, ajax എന്നിവ ഉപയോഗിച്ച് പേജ് വീണ്ടും ലോഡുചെയ്യാതെ ഡാറ്റാബേസിൽ ഒരു ഇമെയിൽ വിലാസത്തിൻ്റെ സാന്നിധ്യം ഞങ്ങൾ പരിശോധിക്കും. ബ്രൗസറിൽ പേജ് റീലോഡ് ചെയ്യാതെ സെർവറുമായി എങ്ങനെ സംവദിക്കാമെന്ന് ഈ ഉദാഹരണം നന്നായി കാണിക്കും, കൂടാതെ, ഇത് പലപ്പോഴും വിവിധ തരത്തിലുള്ള ഉപയോക്തൃ ഫോം മൂല്യനിർണ്ണയങ്ങൾക്കായി ഉപയോഗിക്കുന്നു. റൂട്ട് ഡയറക്‌ടറിയിൽ ഞങ്ങൾ index.php, email.php, validate.js എന്നിങ്ങനെ 3 ഫയലുകൾ സൃഷ്‌ടിക്കും.

ഒരു പേജ് സൃഷ്ടിക്കുന്നു

ഒരു ഇമെയിൽ നൽകുന്നതിനുള്ള ഒരു ഫീൽഡ് മാത്രം ഉൾക്കൊള്ളുന്ന ഒരു ഫോം ഉപയോഗിച്ച് നമുക്ക് ഒരു ലളിതമായ പേജ് സൃഷ്ടിക്കാം.
Index.php ഫയൽ സിൻ്റാക്സ്

AJAX ട്യൂട്ടോറിയൽ

AJAX-നൊപ്പം പ്രവർത്തിക്കാനുള്ള ഏറ്റവും എളുപ്പ മാർഗം jQuery ചട്ടക്കൂട് ബന്ധിപ്പിക്കുക എന്നതാണ്, അതാണ് ഞാൻ ചെയ്തത്. AJAX അഭ്യർത്ഥനകൾ അയയ്‌ക്കുന്നതിന് jQuery ഞങ്ങൾക്ക് മനസ്സിലാക്കാൻ എളുപ്പമുള്ളതും ഉപയോഗിക്കാൻ എളുപ്പമുള്ളതുമായ വാക്യഘടന നൽകുന്നു, അതിനാൽ എന്തുകൊണ്ട് അത് പ്രയോജനപ്പെടുത്തിക്കൂടാ?

ഒരു js സ്ക്രിപ്റ്റ് സൃഷ്ടിക്കുന്നു

Validate.js ഫയലിൻ്റെ വാക്യഘടന

$(document).ready(function())( var email = ""; $("#email").keyup(function())( var value = $(this).val(); $.ajax((( ടൈപ്പ്: "POST", url:"email.php", data:"email="+value, success:function(msg)( if(msg == "valid")( $("#message").html( "ഈ ഇമെയിൽ ഉപയോഗിക്കാം. ഈ ഇമെയിൽ ഇതിനകം എടുത്തതാണ്."); ) )); )); $("#submit").click(function())( if(email == "")( alert( "ദയവായി, എല്ലാ ഇമെയിലുകളിലും ഡാറ്റ ഇടുക"); )else( $.ajax((തരം: "POST", url:"email.php", data:"add_email="+email, success:function(msg)( $ ("#സന്ദേശം" ).html(msg); ) ));) ));));

PHP ഹാൻഡ്ലർ

ഈ സ്ക്രിപ്റ്റിന് ക്ലയൻ്റിൽ നിന്ന് ഒരു POST അഭ്യർത്ഥന ലഭിക്കും, അത് പ്രോസസ്സ് ചെയ്ത് ഫലം നൽകും. AJAX ഫലം വായിക്കുകയും അതിനെ അടിസ്ഥാനമാക്കി ഒരു തീരുമാനമെടുക്കുകയും ചെയ്യുന്നു.
Email.php ഫയൽ വാക്യഘടന

$കണക്ഷൻ = mysqli_connect("localhost","email","email","email"); if(isset($_POST["email"]) && $_POST["email"] != "")( $email = $_POST["email"]; $email = mysqli_real_escape_string($connection,$email); എങ്കിൽ (!filter_var($email, FILTER_VALIDATE_EMAIL))( എക്കോ "അസാധുവാണ്"; )else( $sql = "ഇമെയിലിൽ നിന്ന് ഐഡി തിരഞ്ഞെടുക്കുക "$ഇമെയിൽ""; $result = mysqli_query($connection,$sql); if( mysqli_num_rows($result) == 1)( echo "invalid"; )else( echo "valid"; ) ) ) if(isset($_POST["add_email"]) && $_POST["add_email"] != "" )( $email = mysqli_real_escape_string($connection,$_POST["add_email"]); $sql = "ഇമെയിലിലേക്ക് ചേർക്കുക(ഇമെയിൽ) മൂല്യങ്ങൾ("$ഇമെയിൽ")"; if(mysqli_query($connection,$sql))( പ്രതിധ്വനി വിജയം"; )അല്ലെങ്കിൽ (എക്കോ "പിശക്"; ) )

ഞങ്ങളുടെ PHP സ്ക്രിപ്റ്റിൽ, ഒരു പോസ്റ്റ് അഭ്യർത്ഥന പ്രോസസ്സ് ചെയ്യുകയും പേജിൽ ചില ടെക്സ്റ്റ് പ്രിൻ്റ് ചെയ്യുകയും ചെയ്യുന്ന ഏറ്റവും സാധാരണമായ കോഡ്. തൽഫലമായി, AJAX ഒരു php സ്ക്രിപ്റ്റിലേക്ക് ഒരു അഭ്യർത്ഥന അയയ്‌ക്കുന്നു, സ്‌ക്രിപ്റ്റ് അത് പ്രോസസ്സ് ചെയ്യുകയും ഫലം പുറപ്പെടുവിക്കുകയും ചെയ്യുന്നു, AJAX ഫലം വായിക്കുകയും പേജ് തത്സമയം മാറ്റുകയും ചെയ്യുന്നു.

ഈ കോഡ് ഉപയോഗിച്ച് AJAX സ്ക്രിപ്റ്റിലേക്ക് ഒരു POST അഭ്യർത്ഥന അയയ്ക്കുന്നു:

$.ajax(( type:"POST", url:"email.php", data:"email="+value, success:function(msg)( if(msg == "valid")( $("#message ").html("ഈ ഇമെയിൽ ഉപയോഗിക്കാം."); ഇമെയിൽ = മൂല്യം; )else( $("#സന്ദേശം").html("ഈ ഇമെയിൽ ഇതിനകം എടുത്തതാണ്."); ) ));

തരം - അഭ്യർത്ഥന തരം, POST അല്ലെങ്കിൽ GET. ഞങ്ങളുടെ കാര്യത്തിൽ POST;
url - അഭ്യർത്ഥന അയച്ച സ്ക്രിപ്റ്റിൻ്റെ വിലാസം;
ഡാറ്റ - അഭ്യർത്ഥനയിൽ കൈമാറുന്ന ഡാറ്റ;
വിജയം - വിജയകരമായ അഭ്യർത്ഥന നിർവ്വഹണത്തിൻ്റെ ഫലമായി എന്തുചെയ്യണം. ഞങ്ങളുടെ കാര്യത്തിൽ, പ്രവർത്തനത്തെ വിളിക്കുന്നു;

സ്ക്രിപ്റ്റിൽ തന്നെ, ഓരോ തവണയും ഇമെയിൽ ഫീൽഡിൽ ഒരു പ്രതീകം നൽകുമ്പോൾ ഡാറ്റാബേസിൽ ഒരു ഇമെയിലിൻ്റെ സാന്നിധ്യം പരിശോധിക്കുന്നു. സ്‌ക്രിപ്റ്റിൽ, $("#email").keyup(function()()); എന്ന വിഭാഗം ഇൻപുട്ട് പ്രോസസ്സ് ചെയ്യുന്നതിനുള്ള ഉത്തരവാദിത്തമാണ്. , ഐഡി = "ഇമെയിൽ" ഉള്ള ഒരു ഫീൽഡിൽ ഒരു കീ അമർത്തുന്നത് പരിശോധിക്കുന്നു.
നിങ്ങൾക്ക് കാണാനാകുന്നതുപോലെ, കോഡ് വളരെ ലളിതവും മനസിലാക്കാൻ പ്രത്യേകിച്ച് മികച്ച കഴിവുകൾ ആവശ്യമില്ല, എല്ലാം ഇവൻ്റുകൾ പ്രോസസ്സ് ചെയ്യുന്നതുമായി ബന്ധപ്പെട്ടിരിക്കുന്നു കീഅപ്പ്() - ഒരു കീ അമർത്തുക, ക്ലിക്ക്() - ഒരു ഘടകത്തിൽ ഒരു മൗസ് ക്ലിക്ക്. ഇതിന് ശേഷം AJAX അഭ്യർത്ഥനയും സ്ക്രിപ്റ്റിൽ നിന്നുള്ള പ്രതികരണവും. അതിനാൽ, php, ajax എന്നിവ ഉപയോഗിച്ച് നിങ്ങൾക്ക് ഇൻ്ററാക്ടീവ് പേജുകൾ സൃഷ്ടിക്കുന്നതിനുള്ള പരിധിയില്ലാത്ത സാധ്യതകൾ ലഭിക്കും.
ഈ കോഡ് ഉയർന്ന നിലവാരമുള്ളതായി നടിക്കുന്നില്ല, എന്നാൽ നിങ്ങൾ ഇത് വികസിപ്പിക്കുകയാണെങ്കിൽ, ക്ലയൻ്റ്, സെർവർ തലങ്ങളിൽ ശരിയായ മൂല്യനിർണ്ണയങ്ങൾ ചേർക്കുകയും css അവതരിപ്പിക്കുകയും ചെയ്താൽ, അത് നിങ്ങളുടെ പ്രോജക്റ്റുകളിൽ ഉപയോഗിക്കാനാകും.
നിങ്ങൾക്ക് എന്തെങ്കിലും ചോദ്യങ്ങളുണ്ടെങ്കിൽ, അഭിപ്രായങ്ങൾ എഴുതാൻ മടിക്കരുത്.
ഞാൻ നിങ്ങൾക്ക് ഒരു നല്ല ദിവസം ആശംസിക്കുന്നു, ഉടൻ കാണാം :)

7.4K
ഈ ലേഖനത്തിൽ ഞാൻ ഒരു AJAX ഫോം സൃഷ്ടിക്കുന്നതും സമർപ്പിക്കുന്നതും വിവരിക്കും. ഇതിനുശേഷം, animate.css ഉപയോഗിച്ച് ആനിമേഷൻ നടപ്പിലാക്കുന്നതും JavaScript ഉപയോഗിച്ച് ഡാറ്റ മൂല്യനിർണ്ണയവും നമുക്ക് നോക്കാം.

ഈ ലേഖനം എഴുതുമ്പോൾ, ചട്ടക്കൂടിൻ്റെ നിലവിലെ പതിപ്പ് ബൂട്ട്സ്ട്രാപ്പ് 3.3.5 ആണ്. ഈ ലേഖനത്തിനായി, ഞങ്ങൾ സ്ഥിരസ്ഥിതി ബൂട്ട്സ്ട്രാപ്പ് ബിൽഡ് (12 നിരകൾ) ഉപയോഗിക്കുന്നു. ഈ ലേഖനത്തിലെ ടാസ്ക്കുകൾ പൂർത്തിയാക്കുമ്പോൾ, ബൂട്ട്സ്ട്രാപ്പ് ഡോക്യുമെൻ്റേഷനിൽ വിവരിച്ചിരിക്കുന്ന ഏറ്റവും പുതിയ സ്നിപ്പെറ്റുകളും കോഡ് ഘടനയും ഉപയോഗിക്കുന്നത് ഉറപ്പാക്കുക.

ഫയലിൻ്റെയും ഫോൾഡറിൻ്റെയും ഘടന

ഞങ്ങൾ ഒരു റൂട്ട് ഡയറക്ടറി സൃഷ്ടിക്കുകയും അതിൽ ഇനിപ്പറയുന്ന ഫയലുകളും ഫോൾഡറുകളും ചേർക്കുകയും ചെയ്യും:

ബൂട്ട്സ്ട്രാപ്പ്-ഫോം:


ഞങ്ങൾക്ക് ചില ഫ്രണ്ട്-എൻഡ് ലൈബ്രറികൾ ബന്ധിപ്പിക്കേണ്ടതുണ്ട്:
  • ബൂട്ട്സ്ട്രാപ്പ്;
  • jQuery.

ഈ ലൈബ്രറികൾ കണക്കിലെടുക്കുമ്പോൾ, ഫയൽ ഘടന ഇതുപോലെ കാണപ്പെടും:

ബൂട്ട്സ്ട്രാപ്പ്-ഫോം:

ഒരു ഫോം സൃഷ്ടിക്കുന്നു

നിങ്ങളുടെ index.html ഫയൽ തുറന്ന് ഇനിപ്പറയുന്ന അടിസ്ഥാന AJAX കോൺടാക്റ്റ് ഫോം ഘടന അതിലേക്ക് പകർത്തുക:

ബൂട്ട്‌സ്‌ട്രാപ്പ് 3.3.4 ഉപയോഗിച്ചുള്ള ഫോമുമായി ബന്ധപ്പെടുക " എനിക്കൊരു സന്ദേശം അയയ്‌ക്കുക

ഞങ്ങൾ ഫോം ഉള്ളടക്കം ചേർക്കുന്ന അടിസ്ഥാന HTML ടെംപ്ലേറ്റ് ഇതാണ്. ആവശ്യമായ എല്ലാ CSS, JavaScript ഫയലുകളും ഞങ്ങൾ ഉൾപ്പെടുത്തിയിട്ടുണ്ട്. ഈ പ്രത്യേക ഉദാഹരണത്തിനായി നമുക്ക് bootstrap.js ആവശ്യമില്ല എന്നത് ശ്രദ്ധിക്കുക.

ബൂട്ട്‌സ്‌ട്രാപ്പിനുള്ളിലെ മീഡിയ അന്വേഷണങ്ങൾക്കായി ഞങ്ങൾ വ്യൂപോർട്ട് മെറ്റാ ടാഗ് ഉൾപ്പെടുത്തിയിട്ടുണ്ട്. ഫയലിൻ്റെ അടിയിൽ JavaScript സ്ഥാപിച്ചു, അതിനാൽ പ്രധാന കോഡ് ആദ്യം പ്രോസസ്സ് ചെയ്തു.

ബോഡി ടാഗിൽ ഞങ്ങൾ col-sm-6 col-sm-offset-3 ക്ലാസ് ഉള്ള ഒരു div ഉൾപ്പെടുത്തിയിട്ടുണ്ട്. ഇതിനർത്ഥം sm (ചെറിയ) വ്യൂപോർട്ടിനുള്ളിലും മുകളിലും 50% വീതിയുള്ള കോളം (പരമാവധി നിരകളുടെ എണ്ണം 12) പ്രദർശിപ്പിക്കാൻ ഞങ്ങൾ ആഗ്രഹിക്കുന്നു എന്നാണ്. ക്ലാസ് col-sm-offset-3 ഇടത് ഓഫ്‌സെറ്റിനെ 25% ആയി സജ്ജമാക്കുന്നു.

ഇത് ലഭ്യമായ സ്ഥലത്തിൻ്റെ പകുതിയോളം എടുക്കുകയും തിരശ്ചീനമായി കേന്ദ്രീകരിക്കുകയും ചെയ്യുന്ന ഒരു ലേഔട്ട് സൃഷ്ടിക്കുന്നു. അതിനുശേഷം ഞങ്ങൾ h3 ഉൾപ്പെടുത്തി, അടുത്തതായി ഫോമിൻ്റെ അടിസ്ഥാനം വരുന്നു. ഫോമിലേക്ക് നിങ്ങൾ ഒരു ഐഡി പ്രയോഗിക്കുന്നുണ്ടെന്ന് ഉറപ്പാക്കുക, അതിലൂടെ നിങ്ങൾക്ക് പിന്നീട് ഒരു AJAX JQuery ഫോം അറ്റാച്ചുചെയ്യാൻ കഴിയും.

പോരാട്ടമില്ലാതെ വിജയമില്ല

പേര് ഇമെയിൽ സന്ദേശം സമർപ്പിക്കുക സന്ദേശം സമർപ്പിച്ചു!

ഇവയെല്ലാം ഉപയോക്താവ് സംവദിക്കുന്ന ഇൻപുട്ട് ഫീൽഡുകളും ബട്ടണുകളുമാണ്. അസൈൻ ചെയ്‌തിരിക്കുന്ന വരി ക്ലാസുള്ള പ്രാരംഭ ഡിവ് ക്ലാസിക് ബൂട്ട്‌സ്‌ട്രാപ്പ് വാക്യഘടനയാണ്, ഇത് കോൾ ഘടകങ്ങളുടെ തിരശ്ചീന ഗ്രൂപ്പിംഗിനെ പ്രതിനിധീകരിക്കുന്നു. ബൂട്ട്സ്ട്രാപ്പിനുള്ളിലെ നിരകൾ പാഡിംഗ് അല്ലെങ്കിൽ വൈറ്റ് സ്പേസ് സൃഷ്ടിക്കുന്നു. അവ നീക്കം ചെയ്യുന്നതിലൂടെ, ലൈൻ കണ്ടെയ്നറിലേക്ക് തുല്യമായി യോജിക്കുന്നുവെന്ന് ഉറപ്പാക്കാൻ കഴിയും.

കോൾ-എസ്എം-6 (50%) ക്ലാസ് ഉപയോഗിച്ച് ഞങ്ങൾ രണ്ട് കോളങ്ങൾ സൃഷ്ടിച്ചു, അത് ഫോമിൻ്റെ മുകൾഭാഗം വേർതിരിക്കുന്നതിന് ഞങ്ങൾ ഉപയോഗിക്കും. ആദ്യ കോളത്തിനുള്ളിൽ col-sm-6 നാമത്തിനും ഇമെയിലിനുമായി ഞങ്ങൾ ഒരു ലേബലും ഫീൽഡുകളും സൃഷ്ടിച്ചു. അവയിൽ ഓരോന്നിലും ആട്രിബ്യൂട്ടിന് അനുയോജ്യമായ ഒരു ലേബൽ അടങ്ങിയിരിക്കുന്നു, അതിനാൽ ലേബൽ അനുബന്ധ ഫീൽഡുമായി ബന്ധപ്പെട്ടിരിക്കുന്നു.

ഈ കോളങ്ങളിൽ ഓരോന്നിനും താഴെ ഒരു ചെറിയ പാഡിംഗ് സൃഷ്‌ടിച്ച് ലേബലുകളെ അർത്ഥപരമായി ഗ്രൂപ്പുചെയ്യുന്ന ഒരു ഫോം-ഗ്രൂപ്പ് ഉൾപ്പെടുന്നു:

ടൈപ്പോഗ്രാഫി

H1-H6-നുള്ള ക്ലാസുകൾ ഉപയോഗിക്കാൻ ബൂട്ട്സ്ട്രാപ്പ് നിങ്ങളെ അനുവദിക്കുന്നു. അധിക ഫീൽഡുകൾ ചേർക്കാതെയോ സൂപ്പർ AJAX കോൺടാക്റ്റ് ഫോം എലമെൻ്റ് ബ്ലോക്കുകൾ സൃഷ്ടിക്കാതെയോ ഇൻലൈൻ ഘടകങ്ങൾ സ്റ്റൈൽ ചെയ്യാൻ അവ നിങ്ങളെ സഹായിക്കുന്നു. ലേബലുകൾ സ്‌റ്റൈൽ ചെയ്യാനും വലുതാക്കാനും ഞങ്ങൾ H4 ക്ലാസ് ഉപയോഗിച്ചു.

ഓരോ ഇൻപുട്ട് എലമെൻ്റിനും ഫോം-കൺട്രോൾ ക്ലാസ് പ്രയോഗിക്കുന്നു, അങ്ങനെ അത് കണ്ടെയ്നറിൻ്റെ മുഴുവൻ വീതിയും (100% വീതി) നിറയ്ക്കുന്നു. എളുപ്പത്തിൽ വായിക്കാൻ കഴിയുന്ന ഒരു ഫോം ഘടകം (വലിയ വലിപ്പം, വ്യക്തമായ അരികുകൾ മുതലായവ) സൃഷ്ടിക്കാൻ നിങ്ങളെ അനുവദിക്കുന്ന വിവിധ ശൈലികളും ഈ ക്ലാസ് ചേർക്കുന്നു.

ഈ നിരകൾക്ക് ശേഷം ഞങ്ങൾ സന്ദേശത്തിൻ്റെ ബോഡി ഉൾപ്പെടുത്തുന്നു. ഞങ്ങൾ ഇത് ഒരു ഫോം-ഗ്രൂപ്പിൽ പൊതിഞ്ഞ് ലേബലുകൾക്കും ടെക്സ്റ്റ് ഫീൽഡുകൾക്കും സമാനമായ ശൈലികൾ പ്രയോഗിക്കുന്നു.

പ്രതികരണത്തിനായി വിളിക്കുക

നമുക്ക് ഒരു സബ്മിറ്റ് ബട്ടൺ ഉണ്ടാക്കാം. ബൂട്ട്സ്ട്രാപ്പിൽ വിവിധ ബട്ടണുകൾക്കും അവയുടെ അവസ്ഥകൾക്കുമുള്ള ക്ലാസുകൾ അടങ്ങിയിരിക്കുന്നു. സ്ഥിരസ്ഥിതിയായി പച്ചയായ "വിജയം" ബട്ടൺ (btn-success) ഉപയോഗിക്കാൻ ഞങ്ങൾ തീരുമാനിച്ചു.

ബട്ടണിൻ്റെ അടിസ്ഥാന പാരാമീറ്ററുകൾ (ബോർഡർ, പാഡിംഗ്, ടെക്സ്റ്റ് അലൈൻമെൻ്റ്, ഫോണ്ട് സൈസ്) പുനഃസജ്ജമാക്കാൻ നിങ്ങൾ btn ബേസ് ക്ലാസ് ഉപയോഗിക്കേണ്ടതുണ്ട്. ഞങ്ങൾ ഒരു വലിയ ബട്ടൺ സൃഷ്‌ടിക്കുന്ന btn-lg ക്ലാസും തുടർന്ന് ബട്ടൺ ഇടതുവശത്തേക്ക് പൊതിയുന്ന പുൾ-വലത് ക്ലാസും ഉപയോഗിച്ചു.

ബട്ടണിന് ശേഷം, ഞങ്ങൾ #msgSubmit എന്ന ഐഡിയുള്ള ഒരു ഡിവി ഉൾപ്പെടുത്തുകയും ഇനിപ്പറയുന്ന ക്ലാസുകൾ പ്രയോഗിക്കുകയും ചെയ്തു: “h3 ടെക്സ്റ്റ്-സെൻ്റർ മറച്ചിരിക്കുന്നു”. h3 ക്ലാസ് ഒരു വലിയ തലക്കെട്ട് സൃഷ്‌ടിക്കാൻ സഹായിക്കുന്നു, ടെക്‌സ്‌റ്റ്-സെൻ്റർ ടെക്‌സ്‌റ്റ് അലൈൻമെൻ്റ് മധ്യത്തിലേക്ക് സജ്ജീകരിക്കുന്നു, കൂടാതെ മറഞ്ഞിരിക്കുന്ന സെറ്റുകൾ പ്രദർശിപ്പിക്കുന്നു: ഒന്നുമില്ല, ദൃശ്യം: മറച്ചിരിക്കുന്നു:

ഡാറ്റ അയയ്ക്കുന്നതിനുള്ള പ്രവർത്തനം ചേർക്കുന്നു

ഞങ്ങൾ ഒരു അടിസ്ഥാന ബൂട്ട്‌സ്‌ട്രാപ്പ് JQuery AJAX ഫോം സൃഷ്ടിച്ചു, പക്ഷേ അത് ഇതുവരെ ഒന്നും ചെയ്യുന്നില്ല. ഞങ്ങളുടെ അടുത്ത ഘട്ടം ഉപയോക്തൃ ഇൻപുട്ട് എടുത്ത് പിഎച്ച്പിയിലേക്ക് അസമന്വിതമായി അയയ്‌ക്കുന്ന ഒരു ഫംഗ്‌ഷൻ സൃഷ്‌ടിക്കുക എന്നതാണ്.

scripts.js ഫയൽ തുറന്ന് ഇനിപ്പറയുന്ന കോഡ് അതിലേക്ക് പകർത്തുക:

$("#contactForm").submit(function(event)( // ഫോം ഡാറ്റയുടെ സമർപ്പണം റദ്ദാക്കുന്നു event.preventDefault(); submitForm(); ));

#contactForm ഡാറ്റ സമർപ്പിക്കുന്ന ഫംഗ്‌ഷനുകൾ ശ്രദ്ധിക്കുന്ന JQuery കോഡിൻ്റെ ഒരു ഭാഗമാണിത് (നേരത്തെ പറഞ്ഞതുപോലെ). ഈ ഫംഗ്‌ഷന് മുമ്പ്, ഞങ്ങൾ ഇവൻ്റ് വേരിയബിൾ കൈകാര്യം ചെയ്യുന്നു, അത് ഫംഗ്‌ഷനുള്ള ഫോം സമർപ്പിക്കൽ പ്രവർത്തനം സംഭരിക്കുന്നു.

Event.preventDeafult() ഫോമിൽ ഒരു പ്രവർത്തനം തിരഞ്ഞെടുക്കാതെ പേജ് പുതുക്കുമ്പോൾ ഫോം ഡാറ്റ സമർപ്പിക്കുന്നത് നിർത്തുന്നു. അവസാനം ഈ കോഡ് submitForm(); :

ഫംഗ്ഷൻ submitForm())( // ഫോം var name = $("#name").val(); var ഇമെയിൽ = $("#email").val(); var സന്ദേശം = $("#message ").val(); $.ajax(( തരം: "POST", url: "php/form-process.php", ഡാറ്റ: "name=" + name + "&email=" + ഇമെയിൽ + "&message=" + സന്ദേശം, വിജയം: ഫംഗ്‌ഷൻ(ടെക്‌സ്റ്റ്)( (ടെക്‌സ്റ്റ് == "വിജയം")(ഫോംസക്‌സസ്(); ) )); ) ഫംഗ്‌ഷൻ ഫോംസക്‌സസ്())( $("#msgSubmit").removeClas ("മറഞ്ഞിരിക്കുന്നു"); )

മൂന്ന് ഇൻവോക്ക്ഡ് വേരിയബിളുകൾ ഫോമിൻ്റെ ഓരോ ഇൻപുട്ട് ഫീൽഡുകളുടെയും മൂല്യങ്ങൾ പിടിച്ചെടുക്കുകയും പിന്നീടുള്ള ഉപയോഗത്തിനായി ഒരു JavaScript വേരിയബിളിലേക്ക് കൈമാറുകയും ചെയ്യുന്നു.

ഞങ്ങൾ JQuery-ക്കുള്ളിൽ ഒരു AJAX ഒബ്‌ജക്റ്റ് ആരംഭിക്കുകയും പോസ്റ്റിനായുള്ള പാരാമീറ്ററുകൾ, PHP ഫയലിൻ്റെ സ്ഥാനം, ഞങ്ങൾ പോസ്റ്റുചെയ്യാൻ ആഗ്രഹിക്കുന്ന ഡാറ്റ, കോൾബാക്ക് ഫംഗ്‌ഷൻ എന്നിവ സജ്ജമാക്കുകയും ചെയ്യുന്നു. ഡാറ്റയിൽ അനുബന്ധ ഐഡിയുള്ള മൂന്ന് വേരിയബിളുകളും ഉൾപ്പെടുന്നു. AJAX ഒബ്ജക്റ്റിന് PHP സ്ക്രിപ്റ്റിൽ നിന്ന് വിവരങ്ങൾ ലഭിച്ചപ്പോൾ കോൾബാക്ക് ഫംഗ്ഷൻ വിളിക്കുന്നു. ഫംഗ്‌ഷൻ മടങ്ങിയ വാചകം പിടിച്ചെടുക്കുകയും അത് "വിജയം" എന്ന സ്ട്രിംഗിന് തുല്യമാണോ എന്ന് പരിശോധിക്കുകയും ചെയ്യുന്നു. അതെ എങ്കിൽ, അന്തിമ formSuccess ഫംഗ്‌ഷൻ പ്രവർത്തിക്കുന്നു.

ഞങ്ങൾ മുമ്പ് പ്രയോഗിച്ച #msgSubmit DIV-ൽ നിന്ന് മറഞ്ഞിരിക്കുന്ന ക്ലാസ് ഇത് നീക്കംചെയ്യുന്നു, അങ്ങനെ ടെക്‌സ്‌റ്റ് ഔട്ട്‌പുട്ട് ചെയ്യുന്നു.

PHP മെയിൽ ഫംഗ്‌ഷനിലേക്ക് ബന്ധിപ്പിക്കുന്നു

ഇപ്പോൾ നിങ്ങൾ AJAX ഫോമിൽ നിന്ന് ഡാറ്റ സ്വീകരിക്കുന്ന ഒരു സ്ക്രിപ്റ്റ് എഴുതുകയും PHP മെയിൽ ഫംഗ്ഷനിലൂടെ ഉള്ളടക്കം അയയ്ക്കുകയും വേണം. process.php ഫയൽ തുറന്ന് അതിൽ ഇനിപ്പറയുന്ന കോഡ് ചേർക്കുക:

നമ്മൾ ഉപയോഗിക്കാൻ ആഗ്രഹിക്കുന്ന വേരിയബിളുകൾ സംരക്ഷിക്കേണ്ടതുണ്ട്. മെയിൽ ഫംഗ്‌ഷനിൽ നിന്ന് നിങ്ങൾക്ക് മൂന്ന് ഇൻപുട്ട് വേരിയബിളുകൾ ലഭിക്കുകയും അവയ്ക്ക് PHP-യിൽ ഒരേ പേരുകൾ നൽകുകയും ചെയ്യാം. $EmailTo വേരിയബിൾ സ്ക്രിപ്റ്റിൽ സജ്ജമാക്കാൻ കഴിയുന്ന ഒരു ഇമെയിൽ വിലാസമാണ്. ഇമെയിലിൻ്റെ വിഷയം വിവരിക്കുന്ന ഒരു സ്ട്രിംഗ് ആണ് $Subject.

മൂന്ന് സൃഷ്ടിച്ച വേരിയബിളുകൾ ചേർത്ത് അക്ഷരത്തിൻ്റെ ബോഡി ക്രമരഹിതമായി സൃഷ്ടിക്കപ്പെടുന്നു. ആദ്യം ഞങ്ങൾ വിവരണ വാചകം സജ്ജമാക്കുന്നു, ഉദാഹരണത്തിന്, "പേര്:", തുടർന്ന് വേരിയബിൾ വരുന്നു, തുടർന്ന് ന്യൂലൈൻ (/ n). ഞങ്ങൾ അതേ ഘട്ടങ്ങൾ ആവർത്തിക്കുന്നു, എല്ലാ ഡാറ്റയും $body വേരിയബിളുമായി ബന്ധിപ്പിക്കുന്നു.

ഒരു ഇമെയിൽ അയയ്ക്കാൻ, ഞങ്ങൾ അത് മെയിൽ ഫംഗ്ഷനിലേക്ക് അറ്റാച്ചുചെയ്യുന്നു. $success വേരിയബിളിന് ഒരു മൂല്യം നൽകുന്നതിലൂടെ, ഇമെയിൽ അയയ്‌ക്കുന്ന ഇമെയിൽ വിലാസം, ഇമെയിലിൻ്റെ വിഷയം, ബോഡി, അയച്ചയാളുടെ ഇമെയിൽ വിലാസം എന്നിവ ഞങ്ങൾ വ്യക്തമാക്കുന്നു.

ഇമെയിൽ അയയ്‌ക്കൽ പ്രക്രിയ ആരംഭിക്കുന്നതിന്, നിങ്ങൾ അതിനെ if സ്റ്റേറ്റ്‌മെൻ്റിൽ വിളിക്കേണ്ടതുണ്ട്. ഇതുവഴി നിങ്ങൾക്ക് ഫോം ഡാറ്റ സമർപ്പിച്ചിട്ടുണ്ടോ ഇല്ലയോ എന്ന് പരിശോധിക്കാം. മെയിൽ ഫംഗ്‌ഷൻ “ശരി” എന്ന് നൽകുന്നുവെങ്കിൽ, സ്‌ക്രിപ്റ്റ് “വിജയം” നൽകുന്നു, ഫംഗ്‌ഷൻ ഒരു പിശക് വരുത്തിയാൽ, “അസാധുവായത്” തിരികെ നൽകും.

ഈ ഫലം AJAX ഒബ്‌ജക്റ്റിലേക്ക് തിരികെ നൽകുകയും ക്ലയൻ്റ് വശത്ത് പ്രോസസ്സ് ചെയ്യുകയും ചെയ്യും. AJAX-ൻ്റെ പ്രയോജനം, ഇതെല്ലാം ക്ലയൻ്റ് വശത്ത് അസമന്വിതമായി ചെയ്യുന്നു എന്നതാണ്. AJAX ഫോം ഡാറ്റ സമർപ്പിക്കുമ്പോൾ സൈറ്റുമായി സംവദിക്കുന്നത് തുടരാൻ ഇത് ഉപയോക്താവിനെ അനുവദിക്കുന്നു:

നമുക്ക് തിളങ്ങാം

പ്രവർത്തനക്ഷമമാക്കാവുന്ന വിവിധ അധിക ഫീച്ചറുകളിലൂടെ ഉപയോക്തൃ ഫീഡ്‌ബാക്ക് നൽകുന്നതിൽ ഞങ്ങൾ ഇപ്പോൾ ശ്രദ്ധ കേന്ദ്രീകരിക്കും. പ്രത്യേകിച്ചും, ക്ലയൻ്റ് സൈഡും സെർവർ സൈഡും പിശക് കൈകാര്യം ചെയ്യൽ ഉപയോഗിച്ച് ഞങ്ങൾ ഫോം ഫീഡ്‌ബാക്ക് നോക്കും.

ഫോം സാധൂകരിക്കാൻ ഞങ്ങൾ ചില ടൂളുകളും ഉപയോഗിക്കുന്നു:

  • Animate.css: ;
  • ബൂട്ട്സ്ട്രാപ്പ് വാലിഡേറ്റർ.

ഞങ്ങൾ മുമ്പ് Bootstrap, JQuery എന്നിവയിൽ ചെയ്തതുപോലെ നിങ്ങളുടെ പ്രോജക്റ്റിലേക്ക് അവരെ ചേർക്കുക. ഡാറ്റ സമർപ്പിച്ചതിന് ശേഷം ഉപയോക്താവിന് ഫീഡ്‌ബാക്ക് നൽകാൻ ഈ ഉപകരണങ്ങൾ സഹായിക്കും.

പദ്ധതിയുടെ ഘടന ഇപ്പോൾ ഇതുപോലെയായിരിക്കണം:

ഫോം മൂല്യനിർണ്ണയം

AJAX PHP കോൺടാക്റ്റ് ഫോം ഡാറ്റ നൽകിയ ശേഷം വാലിഡേറ്റർ ഇൻസ്റ്റാൾ ചെയ്തുകൊണ്ട് നമുക്ക് ആരംഭിക്കാം. scripts.js ഫയലിലേക്ക് പോയി, ഫോം ഡാറ്റ സമർപ്പിച്ചതിന് ശേഷം SubmitForm() ഫംഗ്‌ഷനെ വിളിക്കുന്ന ആദ്യ കോഡ് എഡിറ്റ് ചെയ്യുക.
ഇത് ഇനിപ്പറയുന്ന രീതിയിൽ മാറ്റേണ്ടതുണ്ട്:

$("#contactForm").validator().on("submit", function (event) ((event.isDefaultPrevented()) (// ഹാൻഡിൽ ഫോം പിശക്... ) വേറെ ( // എല്ലാം ശരിയാണ്! ഇവൻ്റ് .preventDefault(); submitForm(); ) );

ഈ പുതിയ കോഡ് സ്‌നിപ്പെറ്റ് ബൂട്ട്‌സ്‌ട്രാപ്പ് വാലിഡേറ്റർ പ്രശ്‌നങ്ങൾ കണ്ടെത്തി കോഡ് പ്രവർത്തിക്കുന്നത് നിർത്തിയിട്ടുണ്ടോ എന്ന് പരിശോധിക്കുന്നു. ഇല്ലെങ്കിൽ, ഞങ്ങൾ സാധാരണ നിലയിൽ തുടരും. ഫോം ഡാറ്റാ സമർപ്പണ സ്‌ക്രിപ്റ്റിൽ നിന്ന് ഡിഫോൾട്ട് പ്രവർത്തനം (ഫോം പൂരിപ്പിക്കാതെ പേജ് വീണ്ടും ലോഡുചെയ്യുന്നത്) ഞങ്ങൾക്ക് ഇപ്പോഴും ഒഴിവാക്കേണ്ടതുണ്ട്.

ഇപ്പോൾ, എല്ലാ ഫീൽഡുകളും പൂരിപ്പിക്കാതെ, ഫോം സമർപ്പിക്കുക ബട്ടൺ ക്ലിക്ക് ചെയ്താൽ, ശൂന്യമായവ ചുവപ്പിൽ ഹൈലൈറ്റ് ചെയ്യും:


മൂല്യനിർണ്ണയം ചേർക്കുന്ന പ്രക്രിയയിൽ, ഞങ്ങൾ നേറ്റീവ് HTML5 മൂല്യനിർണ്ണയം പ്രവർത്തനരഹിതമാക്കി. പിശക് സന്ദേശങ്ങൾ ഉൾപ്പെടുത്തി മൂല്യനിർണ്ണയത്തിലേക്ക് നിങ്ങൾക്ക് അധിക സന്ദർഭം ചേർക്കാൻ കഴിയും. ഓരോ ഫീൽഡുകൾക്കുമായി പിശക് സന്ദേശങ്ങൾ പ്രദർശിപ്പിക്കാൻ നിങ്ങളെ അനുവദിക്കുന്ന ഒരു ഹാൻഡി ഫീച്ചർ ബൂട്ട്സ്ട്രാപ്പ് വാലിഡേറ്ററിനുണ്ട്. അവ ചേർക്കുന്നതിന്, നിങ്ങൾ HTML മാർക്ക്അപ്പ് പൂർത്തിയാക്കേണ്ടതുണ്ട്.

ഓരോ ഫോം-ഗ്രൂപ്പിനുള്ളിലും, ഡാറ്റാ എൻട്രി ഫീൽഡിന് കീഴിൽ, നിങ്ങൾ ഇനിപ്പറയുന്ന HTML കോഡ് സ്ഥാപിക്കേണ്ടതുണ്ട്:

ഒരു ഉദാഹരണമായി, പേരിലേക്കും ഇമെയിൽ ഫീൽഡുകളിലേക്കും ചേർത്ത ഒരു അധിക ഡിവി താഴെ:

പേര് ഇമെയിൽ

ഇപ്പോൾ, AJAX JQuery ഫോം ഡാറ്റ വീണ്ടും അയയ്ക്കുമ്പോൾ, ഫോം ഫീൽഡുകൾ പൂരിപ്പിച്ചിട്ടില്ലെങ്കിൽ ഒരു പിശക് സന്ദേശം ദൃശ്യമാകും: “ദയവായി ഈ ഫീൽഡിൽ പൂരിപ്പിക്കുക. " "data-error" എന്ന് വിളിക്കുന്ന ഇൻപുട്ട് ഡാറ്റയിലേക്ക് ഒരു ഡാറ്റ ആട്രിബ്യൂട്ട് ചേർക്കുന്നതിലൂടെ, നിങ്ങൾക്ക് ഒരു ഇഷ്‌ടാനുസൃത പിശക് സന്ദേശം ഉൾപ്പെടുത്താം.

ഉദാഹരണത്തിന്:

ഫീഡ്ബാക്ക് ആനിമേഷൻ ചേർക്കുന്നു

ശൂന്യമായ ഫോം ഫീൽഡുകൾ സൂചിപ്പിക്കാൻ ഞങ്ങൾ പ്രവർത്തനം ചേർത്തു. എന്നാൽ എന്താണ് സംഭവിക്കുന്നതെന്ന് ഉപയോക്താവിനെ അറിയിക്കുന്നതിന് ഫോമിലേക്ക് കുറച്ച് അധിക ആനിമേഷനുകളും ചില സന്ദേശങ്ങളും ചേർക്കുന്നത് നന്നായിരിക്കും. നിലവിൽ, ഫോം ഡാറ്റ വിജയകരമായി സമർപ്പിക്കുമ്പോൾ, “സന്ദേശം സമർപ്പിച്ചു! "എന്നാൽ തെറ്റുകളുടെ കാര്യമോ?

നിലവിലുള്ള കോഡ് ഉപയോഗിക്കുന്നതിന്, നിലവിലുള്ള ഡാറ്റാ സമർപ്പണ വിജയ സന്ദേശം ഞങ്ങൾ പരിഷ്കരിക്കും. ഒന്നാമതായി, “സന്ദേശം സമർപ്പിച്ചു! HTML മാർക്ക്അപ്പിൽ നിന്ന് "ഡിവ് ശൂന്യമാക്കുക:

സന്ദേശ നില കൈകാര്യം ചെയ്യുന്നതിന് ഇപ്പോൾ നമുക്ക് ഒരു പുതിയ ഫംഗ്ഷൻ സൃഷ്ടിക്കേണ്ടതുണ്ട്. നിങ്ങളുടെ scripts.js ഫയലിൻ്റെ അടിയിലേക്ക് ഈ ഫംഗ്‌ഷൻ ചേർക്കുക:

ഫംഗ്ഷൻ submitMSG(സാധുവായ, msg)( var msgClasses; if(valid)( msgClasses = "h3 text-center tada animated text-success"; ) else ( msgClasses = "h3 ടെക്സ്റ്റ്-സെൻ്റർ ടെക്സ്റ്റ്-അപകടം"; ) $("# msgSubmit").removeClass().addClass(msgClasses).text(msg); )

ഈ ഫംഗ്‌ഷൻ രണ്ട് ആർഗ്യുമെൻ്റുകൾ എടുക്കുന്നു. സാധുതയുള്ളത് ഒരു ബൂളിയൻ വേരിയബിളായിരിക്കും: അതിൻ്റെ മൂല്യം ശരിയാണെങ്കിൽ, ഡാറ്റ വിജയകരമായി അയച്ചുവെന്ന് സൂചിപ്പിക്കുന്ന ഒരു സന്ദേശം പ്രദർശിപ്പിക്കും. തെറ്റാണെങ്കിൽ, ഒരു പിശക് സന്ദേശം അച്ചടിക്കും. ഡിവി ബ്ലോക്കിൽ നമ്മൾ പ്രദർശിപ്പിക്കുന്ന സന്ദേശമാണ് msg.

ഡാറ്റ വിജയകരമായി അയയ്‌ക്കുന്നതിനെക്കുറിച്ചുള്ള സന്ദേശമാണോ അതോ പിശക് സന്ദേശമാണോ ഞങ്ങൾ കൈകാര്യം ചെയ്യുന്നത് എന്ന് ഈ ഫംഗ്‌ഷൻ പരിശോധിക്കുന്നു. സാധുതയുള്ള വേരിയബിളിൻ്റെ മൂല്യം പരിശോധിച്ചാണ് ഇത് ചെയ്യുന്നത്. ഏതുവിധേനയും, ഉചിതമായ CSS ക്ലാസുകൾ ഉപയോഗിച്ച് ഇത് ഒരു വേരിയബിൾ സജ്ജമാക്കുന്നു (ഞങ്ങൾ അവ നീക്കം ചെയ്യുന്നതിനാൽ h3, ടെക്സ്റ്റ്-സെൻ്റർ എന്നിവ വീണ്ടും ഉൾപ്പെടുത്തേണ്ടതുണ്ട്).

ശ്രദ്ധിക്കുക: വിജയ സന്ദേശ ക്ലാസിനായി ഞങ്ങൾ ചില animate.css ക്ലാസുകൾ ഉപയോഗിക്കുന്നു. AJAX JQuery കോൺടാക്റ്റ് ഫോം ഡാറ്റ വിജയകരമായി സമർപ്പിക്കുമ്പോൾ, ഒരു ടാഡ ആനിമേഷൻ പ്ലേ ചെയ്യും.

അവസാനമായി, ഫംഗ്‌ഷൻ #msgSubmit (ക്ലാസ് ഓവർലാപ്പ് ഒഴിവാക്കാൻ) എന്നതിൽ നിന്ന് എല്ലാ ക്ലാസുകളും നീക്കം ചെയ്യുകയും തുടർന്ന് മുൻഗണനാ ക്ലാസുകൾ സജ്ജമാക്കുകയും സന്ദേശ വാചകം ഡിവിയിലേക്ക് ചേർക്കുകയും ചെയ്യുന്നു.

ഈ വിഭാഗത്തിൻ്റെ തുടക്കത്തിൽ വാലിഡേറ്റർ ഇനീഷ്യലൈസേഷൻ്റെ ഉള്ളിൽ, true എന്ന് മൂല്യനിർണ്ണയം ചെയ്യുമ്പോൾ if സ്റ്റേറ്റ്‌മെൻ്റിനുള്ളിലെ ഇനിപ്പറയുന്ന ഫംഗ്‌ഷനിലേക്ക് ഒരു കോൾ ചേർക്കുന്നതിന് ഞങ്ങൾ കോഡ് അപ്‌ഡേറ്റ് ചെയ്യുന്നു:

submitMSG(തെറ്റ്, "നിങ്ങൾ ഫോം ശരിയായി പൂരിപ്പിച്ചോ?");

ഇപ്പോൾ, നിങ്ങൾ എല്ലാ ഫീൽഡുകളും പൂരിപ്പിച്ചിട്ടില്ലെങ്കിൽ, നിങ്ങൾക്ക് ഒരു പിശക് സന്ദേശം ലഭിക്കും “നിങ്ങൾ ഫോം ശരിയായി പൂരിപ്പിച്ചോ? »

ഈ പുതിയ submitMSG ഫംഗ്‌ഷൻ്റെ അവസാന ഘട്ടം ഫോം ഡാറ്റ വിജയകരമായി സമർപ്പിക്കുമ്പോൾ അതിനെ വിളിക്കുക എന്നതാണ്. formSuccess() ഫംഗ്‌ഷൻ ഇനിപ്പറയുന്ന രീതിയിൽ അപ്‌ഡേറ്റ് ചെയ്യുക:

$("#contactForm").reset(); submitMSG(ശരി, "സന്ദേശം സമർപ്പിച്ചു!")

വിജയകരമായ സമർപ്പിക്കൽ സന്ദേശത്തിനൊപ്പം മുകളിൽ പറഞ്ഞിരിക്കുന്നതുപോലെ submitMSG ഫംഗ്‌ഷനിലേക്ക് വിളിക്കുമ്പോൾ ഫോം പുനഃസജ്ജമാക്കാനും മൂല്യങ്ങൾ മായ്‌ക്കാനും ഞങ്ങൾ ആഗ്രഹിക്കുന്നു. ഇപ്പോൾ, ഫോം ഡാറ്റ വിജയകരമായി സമർപ്പിക്കുമ്പോൾ, animate.css ടാഡ ആനിമേഷനോടുകൂടിയ ഒരു അനുബന്ധ സന്ദേശം പ്രദർശിപ്പിക്കണം:

നമുക്ക് സ്വയം കുലുക്കാം

മുഴുവൻ ഫോമിലേക്കും ഒരു ബഗ് ആനിമേഷൻ ചേർക്കാം, ഒരു സാധാരണ "ഷേക്കിംഗ്" ആനിമേഷൻ ട്രിക്ക് ചെയ്യണം!

formSuccess() കഴിഞ്ഞയുടനെ ഒരു പുതിയ ഫംഗ്‌ഷൻ സൃഷ്‌ടിക്കുകയും അതിനെ formError() എന്ന് വിളിക്കുകയും ചെയ്യുക:

function formError())( $("#contactForm").removeClass().addClass("shake animated").one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend", function())( $(this)removeC); )) ;)

animate.css ഡെമോ പേജിൽ വിവരിച്ചിരിക്കുന്ന സമീപനം ഈ ഫംഗ്ഷൻ ഉപയോഗിക്കുന്നു, ഇത് ഒരു ഘടകത്തിലേക്ക് ഒരു ആനിമേഷൻ ചേർക്കാനും അത് വീണ്ടും ആവശ്യപ്പെടാനും നിങ്ങളെ അനുവദിക്കുന്നു.

CSS ആനിമേഷന് നിർഭാഗ്യകരമായ ഒരു സവിശേഷതയുണ്ട്: ക്ലാസ് നീക്കം ചെയ്‌ത് വീണ്ടും ചേർത്താലും അത് വീണ്ടും പ്ലേ ചെയ്യാൻ കഴിയില്ല. എൻഡ്-ഓഫ്-ആനിമേഷൻ ക്ലാസുകൾ പുനഃസജ്ജമാക്കാൻ ഈ ഫംഗ്‌ഷൻ സഹായിക്കുന്നു, അതിനാൽ നിങ്ങൾക്ക് അവ വീണ്ടും ചേർക്കാനാകും. AJAX ഫീഡ്‌ബാക്ക് ഫോമിൻ്റെ എല്ലാ ഫീൽഡുകളും പൂരിപ്പിക്കാതെ ഉപയോക്താവ് "സമർപ്പിക്കുക" ബട്ടൺ ക്ലിക്കുചെയ്യുമ്പോൾ, ഞങ്ങൾ ഒരു ഷേക്ക് ആനിമേഷൻ പ്ലേ ചെയ്യുന്നു. ഇത് വീണ്ടും എല്ലാ ഫീൽഡുകളും പൂരിപ്പിക്കുന്നില്ലെങ്കിൽ, നിങ്ങൾ ഈ ആനിമേഷൻ വീണ്ടും പ്ലേ ചെയ്യേണ്ടതുണ്ട്.

പിശക് റിപ്പോർട്ടുചെയ്യാൻ ഞങ്ങൾ സൃഷ്‌ടിച്ച submitMSG() ഫംഗ്‌ഷൻ്റെ മുകളിലുള്ള ഈ ഫോംഎറർ() ഫംഗ്‌ഷനെ നിങ്ങൾക്ക് വിളിക്കാം. ഉദാഹരണത്തിന്, ഇതുപോലെ:

formError(); submitMSG(തെറ്റ്, "നിങ്ങൾ ഫോം ശരിയായി പൂരിപ്പിച്ചോ?");

ഇപ്പോൾ, എല്ലാ ഫീൽഡുകളും പൂരിപ്പിക്കാതെ ഉപയോക്താവ് ഫോം ഡാറ്റ സമർപ്പിക്കാൻ ശ്രമിക്കുമ്പോൾ, എന്തോ കുഴപ്പമുണ്ടെന്ന് അവനെ അറിയിക്കാൻ അത് കുലുങ്ങും.

കൂടുതൽ മൂല്യനിർണ്ണയം

ക്ലയൻ്റ് സൈഡ് മൂല്യനിർണ്ണയം നല്ലതാണ്, എന്നാൽ ബ്രൗസറിലെ കോഡ് എഡിറ്റ് ചെയ്യുന്നതിലൂടെ ഏത് ഉപയോക്താവിനും ഇത് പ്രവർത്തനരഹിതമാക്കാനും ശൂന്യമായ ഫീൽഡുകളുള്ള ഒരു ഫോം സമർപ്പിക്കാനും കഴിയും. സെർവർ വശത്ത് ഒരു മൂല്യനിർണ്ണയ സേവനം സൃഷ്ടിക്കേണ്ടത് ആവശ്യമാണ്.

എല്ലാ ഫീൽഡുകളും പരിശോധിച്ചിട്ടുണ്ടെന്ന് ഉറപ്പാക്കാൻ ഞങ്ങൾക്ക് process.php ഫയൽ തുറന്ന് ആവശ്യമായ മാറ്റങ്ങൾ വരുത്തേണ്ടതുണ്ട്. പിശക് സന്ദേശങ്ങൾ പിടിക്കാൻ ഞങ്ങൾ ഒരു $errorMSG വേരിയബിൾ സൃഷ്ടിക്കും, തുടർന്ന് ഒരു അധിക $_POST പരിശോധന പ്രവർത്തനക്ഷമമാക്കും:

ഈ PHP കോഡ് അവയുടെ ഡാറ്റയെ അനുബന്ധ വേരിയബിളുകളായി സജ്ജീകരിക്കുന്നതിന് മുമ്പ് ശൂന്യമായ AJAX ഫോം ഫീൽഡുകൾ നിലവിലുണ്ടോ എന്ന് പരിശോധിക്കുന്നു (നിലവിലുള്ള കോഡ് നിർവചിക്കപ്പെട്ട വേരിയബിളുകൾ $_POST ൽ നിന്ന് മാറ്റിസ്ഥാപിക്കുന്നു). ഫീൽഡുകൾ ശൂന്യമാണെങ്കിൽ, ക്ലയൻ്റിലേക്ക് തിരികെ അയയ്‌ക്കാൻ ഞങ്ങൾ ഒരു പൊതു സന്ദേശം വ്യക്തമാക്കുന്നു.

യഥാർത്ഥ AJAX കോളിന് മറുപടിയായി, ബ്രൗസറിൽ പ്രദർശിപ്പിക്കുന്ന ഒരു പിശക് സന്ദേശം ഞങ്ങൾ അയയ്‌ക്കേണ്ടതുണ്ട്. ഇത് ചെയ്യുന്നതിന്, PHP കോഡിൻ്റെ ചുവടെ ഞങ്ങൾ നേരത്തെ സൃഷ്ടിച്ച if സ്റ്റേറ്റ്മെൻ്റ് എഡിറ്റ് ചെയ്യുക:

if സ്റ്റേറ്റ്‌മെൻ്റിലൂടെ, $errorMSG വേരിയബിൾ ശൂന്യമാണോ (“”), അതുപോലെ തന്നെ $success വേരിയബിളിനായി ഞങ്ങൾ ഉപയോഗിച്ച ബിൽറ്റ്-ഇൻ മെയിൽ ഫംഗ്‌ഷൻ്റെ നിലയും ഞങ്ങൾ പരിശോധിക്കുന്നു. $success പരാജയത്തിൻ്റെ ഫലമാണോ പിശക് എന്നറിയാൻ മറ്റൊരു വ്യവസ്ഥയിൽ ഞങ്ങൾ ഒരു അധിക പരിശോധന ഉൾപ്പെടുത്തിയിട്ടുണ്ട്. അതെ എങ്കിൽ, "എന്തോ കുഴപ്പം സംഭവിച്ചു:" എന്ന സന്ദേശം ഞങ്ങൾ തിരികെ അയയ്ക്കും. അല്ലെങ്കിൽ, ശൂന്യമായ ഫീൽഡുകൾക്കായി ഞങ്ങൾ പരിശോധിച്ചപ്പോൾ സമാഹരിച്ച സന്ദേശം ഞങ്ങൾ പ്രദർശിപ്പിക്കും.

അവസാന ഘട്ടം അജാക്സിൽ ഒരു പുതിയ സന്ദേശം സ്വീകരിച്ച് ഫോമിൽ പ്രദർശിപ്പിക്കുക എന്നതാണ്. scripts.js ഫയലിലെ AJAX ഒബ്‌ജക്റ്റ് നമുക്ക് ഇതുപോലെ അപ്‌ഡേറ്റ് ചെയ്യേണ്ടതുണ്ട്:

$.ajax(( തരം: "POST", url: "php/form-process.php", ഡാറ്റ: "name=" + name + "&email=" + email + "&message=" + message, success: function( വാചകം)(എങ്കിൽ (ടെക്‌സ്റ്റ് == "വിജയം")(ഫോംസക്‌സസ്(); ) വേറെ (ഫോംഎറർ(); സബ്‌മിറ്റ്എംഎസ്‌ജി(തെറ്റ്,ടെക്‌സ്റ്റ്); ) ) );

ടെക്‌സ്‌റ്റ് == വിജയം പരിശോധിക്കുന്ന മറ്റൊരു വ്യവസ്ഥ ഞങ്ങൾ ഇപ്പോൾ അപ്‌ഡേറ്റ് ചെയ്‌തു. മറ്റൊന്നിൽ നമ്മൾ formError() ഫംഗ്‌ഷനെ വിളിക്കുന്നു, അത് ഷേക്കിംഗ് ആനിമേഷൻ പ്രയോഗിക്കുകയും PHP-യിൽ നിന്ന് മടങ്ങിയ ടെക്‌സ്‌റ്റിനായി submitMSG() ഫംഗ്‌ഷൻ ആവശ്യപ്പെടുകയും ചെയ്യുന്നു.

ഉപസംഹാരം

മുഴുവൻ കോഡും കാണുന്നതിന് Github-ലേക്ക് പോകുക. ഇപ്പോൾ AJAX PHP ഫീഡ്ബാക്ക് ഫോം ഉപയോക്താവിന് അവൻ പൂരിപ്പിക്കാത്ത ഫീൽഡുകളെക്കുറിച്ചുള്ള വിവരങ്ങൾ നൽകുന്നു. സ്റ്റാറ്റസും PHP-യിൽ നിന്ന് ലഭിച്ച സന്ദേശവും അടിസ്ഥാനമാക്കി ഞങ്ങൾ സന്ദർഭോചിതമായ സന്ദേശങ്ങൾ ഔട്ട്പുട്ട് ചെയ്യുന്നു. ഫ്രണ്ട്-എൻഡ് മൂല്യനിർണ്ണയം മറികടക്കാൻ ശ്രമിക്കുന്ന ഉപയോക്താക്കൾക്കായി ഞങ്ങൾ സെർവർ-സൈഡ് സ്ഥിരീകരണത്തിൻ്റെ ഒരു അധിക തലവും നടപ്പിലാക്കി.

നിങ്ങൾ ഈ ലേഖനം ആസ്വദിച്ചുവെന്ന് ഞാൻ പ്രതീക്ഷിക്കുന്നു. അഭിപ്രായങ്ങളിൽ നിങ്ങളുടെ ചോദ്യങ്ങളും ഫീഡ്‌ബാക്കും ദയവായി രേഖപ്പെടുത്തുക.

ഈ പ്രസിദ്ധീകരണം "പിഎച്ച്പിയും അജാക്സും ഉപയോഗിച്ച് ഒരു ബൂട്ട്സ്ട്രാപ്പ് കോൺടാക്റ്റ് ഫോം നിർമ്മിക്കുന്നു" എന്ന ലേഖനത്തിൻ്റെ പരിഭാഷയാണ്, ഇത് ഫ്രണ്ട്ലി പ്രോജക്റ്റ് ടീം തയ്യാറാക്കിയതാണ്.


OWASP അനുസരിച്ച് ഏറ്റവും സാധാരണമായ പത്ത് തരം ആക്രമണങ്ങളുടെ പട്ടികയിൽ, ആദ്യ രണ്ട് സ്ഥലങ്ങൾ കോഡ് കുത്തിവയ്പ്പും XSS (ക്രോസ്-സൈറ്റ് സ്ക്രിപ്റ്റിംഗ്) ആക്രമണങ്ങളും ഉൾക്കൊള്ളുന്നു. XSS, മറ്റ് പല തരത്തിലുള്ള ആക്രമണങ്ങളെപ്പോലെ, കുത്തിവയ്പ്പ് ആക്രമണങ്ങളുടെ വിജയത്തെ ആശ്രയിച്ചിരിക്കുന്നതിനാൽ അവ കൈകോർക്കുന്നു. ആക്രമണകാരി ആഗ്രഹിക്കുന്ന രീതിയിൽ ക്ഷുദ്ര കോഡ് എക്സിക്യൂട്ട് ചെയ്യുന്നതിനോ വ്യാഖ്യാനിക്കുന്നതിനോ നിർബന്ധിതമാക്കാൻ ഒരു വെബ് ആപ്ലിക്കേഷനിലേക്ക് ഡാറ്റ കുത്തിവയ്ക്കുന്ന ആക്രമണങ്ങളുടെ ഒരു മുഴുവൻ ക്ലാസ് ഈ പേര് മറയ്ക്കുന്നു. ഈ ആക്രമണങ്ങളിൽ, ഉദാഹരണത്തിന്, XSS, SQL ഇൻജക്ഷൻ, ഹെഡർ ഇഞ്ചക്ഷൻ, കോഡ് ഇഞ്ചക്ഷൻ, ഫുൾ പാത്ത് ഡിസ്‌ക്ലോഷർ എന്നിവ ഉൾപ്പെടുന്നു. കൂടാതെ ഇത് ഒരു ചെറിയ ഭാഗം മാത്രമാണ്.


ഇൻജക്ഷൻ ആക്രമണങ്ങൾ എല്ലാ പ്രോഗ്രാമർമാർക്കും ഒരു ഭീകര കഥയാണ്. വൈവിധ്യം, സ്കെയിൽ, (ചിലപ്പോൾ) അവയിൽ നിന്ന് സംരക്ഷിക്കാനുള്ള ബുദ്ധിമുട്ട് എന്നിവ കാരണം അവ ഏറ്റവും സാധാരണവും വിജയകരവുമാണ്. എല്ലാ ആപ്ലിക്കേഷനുകൾക്കും എവിടെ നിന്നെങ്കിലും ഡാറ്റ ലഭിക്കേണ്ടതുണ്ട്. XSS ഉം UI Redress ഉം വളരെ സാധാരണമാണ്, അതിനാൽ ഞാൻ അവയ്‌ക്കായി പ്രത്യേക അധ്യായങ്ങൾ നീക്കിവയ്ക്കുകയും അവയെ പൊതു ക്ലാസിൽ നിന്ന് വേർതിരിക്കുകയും ചെയ്തു.


കുത്തിവയ്പ്പ് ആക്രമണങ്ങളുടെ ഇനിപ്പറയുന്ന നിർവചനം OWASP വാഗ്ദാനം ചെയ്യുന്നു:


ഇൻജക്ഷൻ അവസരങ്ങൾ - SQL, OS, LDAP എന്നിവ പോലെ - ഒരു കമാൻഡ് അഭ്യർത്ഥനയുടെ ഭാഗമായി വ്യാഖ്യാതാവിന് വിശ്വസനീയമല്ലാത്ത ഡാറ്റ ലഭിക്കുമ്പോൾ സംഭവിക്കുന്നു. ചില കമാൻഡുകൾ നടപ്പിലാക്കുന്നതിനോ അനധികൃത ഡാറ്റ ആക്‌സസ് ചെയ്യുന്നതിനോ ക്ഷുദ്ര ഡാറ്റയ്ക്ക് ഇൻ്റർപ്രെറ്ററെ കബളിപ്പിക്കാൻ കഴിയും.

SQL കുത്തിവയ്പ്പ്

കുത്തിവയ്പ്പ് ആക്രമണത്തിൻ്റെ ഏറ്റവും സാധാരണവും അപകടകരവുമായ രൂപമാണ് SQL കുത്തിവയ്പ്പ്. ഈ ഭീഷണിയുടെ ഗൗരവം അമിതമായി വിലയിരുത്താൻ പ്രയാസമാണ്, അതിനാൽ ആക്രമണങ്ങളുടെ വിജയത്തെ സ്വാധീനിക്കുന്നതെന്താണെന്നും അവയിൽ നിന്ന് എങ്ങനെ സംരക്ഷിക്കാമെന്നും മനസ്സിലാക്കേണ്ടത് വളരെ പ്രധാനമാണ്.


അതിനാൽ, ഡാറ്റ വെബ് ആപ്ലിക്കേഷനിലേക്ക് കുത്തിവയ്ക്കുകയും തുടർന്ന് SQL അന്വേഷണങ്ങളിൽ ഉപയോഗിക്കുകയും ചെയ്യുന്നു. അവ സാധാരണയായി വെബ് ഫോമുകൾ പോലെയുള്ള വിശ്വസനീയമല്ലാത്ത ഇൻപുട്ട് ഉറവിടങ്ങളിൽ നിന്നാണ് വരുന്നത്. എന്നിരുന്നാലും, മറ്റ് സ്ഥലങ്ങളിൽ നിന്നും കുത്തിവയ്പ്പ് നടത്താം, ഡാറ്റാബേസിൽ നിന്ന് തന്നെ പറയുക. പ്രോഗ്രാമർമാർ പലപ്പോഴും അവരുടെ ഡാറ്റാബേസിൻ്റെ സമ്പൂർണ്ണ സുരക്ഷയിൽ വിശ്വസിക്കുന്നു, ഇത് ഒരു സാഹചര്യത്തിൽ സുരക്ഷിതമായിരുന്നെങ്കിൽ, ഭാവിയിൽ ഇത് സുരക്ഷിതമാകുമെന്ന് ഇതിനർത്ഥമില്ല. തെളിയിക്കപ്പെടുന്നതുവരെ, അതായത്, അത് പരിശോധിച്ചുറപ്പിക്കുന്നതുവരെ, ഡാറ്റാബേസിൽ നിന്നുള്ള ഡാറ്റ വിശ്വസനീയമല്ലെന്ന് കണക്കാക്കണം.


ആക്രമണം വിജയകരമാണെങ്കിൽ, ആക്രമണകാരിക്ക് SQL ചോദ്യം കൈകാര്യം ചെയ്യാൻ കഴിയും, അതുവഴി ഡെവലപ്പർമാർ ഉദ്ദേശിച്ചിട്ടില്ലാത്ത ഡാറ്റാബേസിൽ അത് പ്രവർത്തനങ്ങൾ നടത്തുന്നു.


ഈ ചോദ്യം നോക്കുക:


$db = പുതിയ mysqli("localhost", "username", "password", "storedb"); $ഫലം = $db->അന്വേഷണം("തിരഞ്ഞെടുക്കുക * ഇടപാടുകളിൽ നിന്ന് എവിടെയാണ് user_id = " . $_POST["user_id"]);

ഇവിടെ നിരവധി ജാംബുകൾ ഉണ്ട്. ആദ്യം, user_id ശരിയാണെന്ന് ഉറപ്പാക്കാൻ POST ഡാറ്റയുടെ ഉള്ളടക്കം ഞങ്ങൾ പരിശോധിച്ചില്ല. രണ്ടാമതായി, ഏത് user_id ഉപയോഗിക്കണമെന്ന് ഞങ്ങളോട് പറയാൻ ഒരു വിശ്വസനീയമല്ലാത്ത ഉറവിടത്തെ ഞങ്ങൾ അനുവദിക്കുന്നു: ഒരു ആക്രമണകാരിക്ക് സാധുതയുള്ള ഏതൊരു user_id-ലും സ്ലിപ്പ് ചെയ്യാൻ കഴിയും. എഡിറ്റ് ചെയ്യാൻ കഴിയാത്തതിനാൽ സുരക്ഷിതമെന്ന് ഞങ്ങൾ കരുതുന്ന ഒരു ഫോമിലെ മറഞ്ഞിരിക്കുന്ന ഫീൽഡിൽ ഇത് അടങ്ങിയിരിക്കാം (ആക്രമണകാരികൾക്ക് അവർക്കാവശ്യമുള്ള ഏത് ഡാറ്റയും നൽകാമെന്ന കാര്യം മറക്കുമ്പോൾ). മൂന്നാമതായി, ഞങ്ങൾ user_id-ൽ നിന്ന് രക്ഷപ്പെട്ടില്ല, ഒരു ബൗണ്ട് പാരാമീറ്ററായി അഭ്യർത്ഥനയിലേക്ക് അത് കൈമാറിയില്ല, ഇത് SQL ചോദ്യം കൈകാര്യം ചെയ്യുന്ന അനിയന്ത്രിതമായ സ്ട്രിംഗുകൾ കുത്തിവയ്ക്കാൻ ആക്രമണകാരിയെ അനുവദിക്കുന്നു, ഞങ്ങൾക്ക് അത് ആദ്യം പരിശോധിക്കാൻ കഴിഞ്ഞില്ല .


വെബ് ആപ്ലിക്കേഷനുകളിൽ ഈ മൂന്ന് ഒഴിവാക്കലുകൾ വളരെ സാധാരണമാണ്.


ഡാറ്റാബേസ് വിശ്വാസത്തെ സംബന്ധിച്ച്, user_name ഫീൽഡ് ഉപയോഗിച്ച് ഞങ്ങൾ ഇടപാടുകൾ നോക്കിയതായി സങ്കൽപ്പിക്കുക. പേരുകൾ വ്യാപ്തിയിൽ വിശാലമാണ് കൂടാതെ ഉദ്ധരണി ചിഹ്നങ്ങൾ അടങ്ങിയിരിക്കാം. ആക്രമണകാരി ഒരു ഉപയോക്തൃനാമത്തിൽ ഒരു കുത്തിവച്ച സ്ട്രിംഗ് മൂല്യം സംഭരിച്ചുവെന്ന് നമുക്ക് പറയാം. ഇനിപ്പറയുന്ന ചോദ്യങ്ങളിലൊന്നിൽ ഞങ്ങൾ ഈ മൂല്യം വീണ്ടും ഉപയോഗിക്കുമ്പോൾ, ഡാറ്റാബേസ് ഒരു വിശ്വസനീയമായ ഉറവിടമായി ഞങ്ങൾ കണക്കാക്കുകയും വിട്ടുവീഴ്ച ചെയ്ത ചോദ്യം ഒറ്റപ്പെടുത്തുകയോ പരിമിതപ്പെടുത്തുകയോ ചെയ്യാത്തതിനാൽ, അത് അന്വേഷണ സ്ട്രിംഗിനെ കൈകാര്യം ചെയ്യും.


SQL നടപ്പിലാക്കുന്നതിനുള്ള മറ്റൊരു ഘടകം കൂടി ശ്രദ്ധിക്കുക: സ്ഥിരമായ സംഭരണം എല്ലായ്പ്പോഴും സെർവറിൽ സൂക്ഷിക്കേണ്ടതില്ല. HTML 5 ഒരു ക്ലയൻ്റ്-സൈഡ് ഡാറ്റാബേസിൻ്റെ ഉപയോഗത്തെ പിന്തുണയ്ക്കുന്നു, അവിടെ നിങ്ങൾക്ക് SQL, JavaScript എന്നിവ ഉപയോഗിച്ച് ചോദ്യങ്ങൾ അയയ്‌ക്കാൻ കഴിയും. ഇതിനായി രണ്ട് API-കൾ ഉണ്ട്: WebSQL, IndexedDB. 2010-ൽ, WebSQL തിരഞ്ഞെടുക്കാൻ W3C ശുപാർശ ചെയ്തില്ല; SQLite ഒരു ബാക്കെൻഡായി ഉപയോഗിക്കുന്ന WebKit ബ്രൗസറുകൾ ഇതിനെ പിന്തുണയ്ക്കുന്നു. മിക്കവാറും, W3C ശുപാർശ ഉണ്ടായിരുന്നിട്ടും, പിന്നോക്ക അനുയോജ്യതയ്ക്കായി പിന്തുണ നിലനിൽക്കും. അതിൻ്റെ പേര് സൂചിപ്പിക്കുന്നത് പോലെ, ഈ API SQL അന്വേഷണങ്ങൾ സ്വീകരിക്കുന്നു, അതായത് ഇത് കുത്തിവയ്പ്പ് ആക്രമണങ്ങളുടെ ലക്ഷ്യമാകാം. IndexedDB ഒരു പുതിയ ബദലാണ്, ഒരു NoSQL ഡാറ്റാബേസ് (SQL അന്വേഷണങ്ങളുടെ ഉപയോഗം ആവശ്യമില്ല).

SQL കുത്തിവയ്പ്പ് ഉദാഹരണങ്ങൾ

SQL അന്വേഷണങ്ങൾ കൈകാര്യം ചെയ്യുന്നതിന് ഇനിപ്പറയുന്ന ലക്ഷ്യങ്ങൾ ഉണ്ടാകാം:

  • ഡാറ്റ ചോർച്ച.
  • സംഭരിച്ച വിവരങ്ങളുടെ വെളിപ്പെടുത്തൽ.
  • സംഭരിച്ച വിവരങ്ങളുടെ കൃത്രിമത്വം.
  • ഓതറൈസേഷൻ ബൈപാസ്.
  • ക്ലയൻ്റ് സൈഡ് SQL കുത്തിവയ്പ്പ്.
  • SQL കുത്തിവയ്പ്പ് സംരക്ഷണം

    എസ്‌ക്യുഎൽ ഇൻജക്ഷനെതിരെയുള്ള സംരക്ഷണം എച്ചലോണിംഗ് തത്വത്തെ അടിസ്ഥാനമാക്കിയുള്ളതാണ്. ഒരു അന്വേഷണത്തിൽ ഡാറ്റ ഉപയോഗിക്കുന്നതിന് മുമ്പ്, അതിൻ്റെ ഫോം ശരിയാണോ എന്ന് നിങ്ങൾ പരിശോധിക്കണം. അഭ്യർത്ഥനയിൽ ഉൾപ്പെടുത്തുന്നതിന് മുമ്പ് ഡാറ്റ ഒറ്റപ്പെടുത്തുകയോ അല്ലെങ്കിൽ ഒരു പരിവർത്തന പാരാമീറ്ററായി ഉൾപ്പെടുത്തുകയോ ചെയ്യേണ്ടത് ആവശ്യമാണ്.

    പരീക്ഷ

    ഞാൻ അത് ആവർത്തിക്കുന്നു: നിലവിലെ അഭ്യർത്ഥനയുടെ PHP സോഴ്സ് കോഡിൽ വ്യക്തമായി സൃഷ്ടിക്കാത്ത എല്ലാ ഡാറ്റയും വിശ്വസനീയമല്ല. അവ കർശനമായി പരിശോധിക്കുകയും ചെക്കുകളിൽ വിജയിക്കാത്ത എന്തും നിരസിക്കുകയും ചെയ്യുക. ഡാറ്റ "ശരിയാക്കാൻ" ശ്രമിക്കരുത്; ഫോർമാറ്റിൽ ചെറിയ, സൗന്ദര്യവർദ്ധക മാറ്റങ്ങൾ മാത്രമേ ചെയ്യാൻ കഴിയൂ.


    നിലവിലുള്ള ഉപയോഗത്തിനായി ഡാറ്റ സാധൂകരിക്കുന്നതും (പ്രദർശനമോ കണക്കുകൂട്ടലുകളോ പോലുള്ളവ) ഡാറ്റാബേസിലെ ഫീൽഡുകൾ സാധൂകരിക്കാത്തതും ഉൾപ്പെടുന്നു.

    ഷീൽഡിംഗ്

    mysqli വിപുലീകരണം ഉപയോഗിച്ച്, ഒരു SQL അന്വേഷണത്തിൽ ഉൾപ്പെടുത്തിയിരിക്കുന്ന എല്ലാ ഡാറ്റയും നിങ്ങൾക്ക് വേർതിരിച്ചെടുക്കാൻ കഴിയും. mysqli_real_escape_string() ഫംഗ്‌ഷൻ ഇത് ചെയ്യുന്നു. PostgresSQL-നുള്ള pgsql എക്സ്റ്റൻഷൻ pg_escape_bytea() , pg_escape_identifier() , pg_escape_literal() , pg_escape_string() എന്നീ ഫംഗ്ഷനുകൾ വാഗ്ദാനം ചെയ്യുന്നു. mssql വിപുലീകരണത്തിന് (മൈക്രോസോഫ്റ്റ് SQL സെർവർ) ഒറ്റപ്പെടുത്തൽ ഫംഗ്ഷനുകൾ ഇല്ല, കൂടാതെ addslashes() സമീപനം കാര്യക്ഷമമല്ല - നിങ്ങൾക്ക് ഒരു ഇഷ്‌ടാനുസൃത ഫംഗ്‌ഷൻ ആവശ്യമാണ്.


    നിങ്ങളുടെ ജീവിതം കൂടുതൽ ദുഷ്കരമാക്കുന്നതിന്, ഒരു അഭ്യർത്ഥനയിൽ നൽകിയ ഡാറ്റ ഒറ്റപ്പെടുത്തുമ്പോൾ നിങ്ങൾക്ക് തെറ്റ് ചെയ്യാൻ അവകാശമില്ലെന്ന് ഞാൻ പറയും. ഒരു തെറ്റ്, നിങ്ങൾ ആക്രമണത്തിന് ഇരയാകുന്നു.


    സംഗഹിക്കുക. ഷീൽഡിംഗ് മികച്ച സംരക്ഷണ ഓപ്ഷനല്ല. ഇത് അവസാന ആശ്രയമായി ഉപയോഗിക്കണം. നിങ്ങൾ അമൂർത്തീകരണത്തിനായി ഉപയോഗിക്കുന്ന ഡാറ്റാബേസ് ലൈബ്രറി, പാരാമീറ്ററുകൾ ബന്ധിപ്പിക്കാൻ നിർബന്ധിക്കാതെ തന്നെ നഗ്നമായ SQL അന്വേഷണങ്ങളോ ഒരു ചോദ്യത്തിൻ്റെ ഭാഗങ്ങളോ കോൺഫിഗർ ചെയ്യാൻ നിങ്ങളെ അനുവദിക്കുകയാണെങ്കിൽ അത് ആവശ്യമായി വന്നേക്കാം. മറ്റ് സന്ദർഭങ്ങളിൽ, ഒറ്റപ്പെടൽ പൂർണ്ണമായും ഒഴിവാക്കുന്നതാണ് നല്ലത്. ഈ സമീപനം സങ്കീർണ്ണവും പിശക് സാധ്യതയുള്ളതും ഡാറ്റാബേസ് വിപുലീകരണത്തെ ആശ്രയിച്ച് വ്യത്യാസപ്പെടുന്നതുമാണ്.

    പാരാമീറ്റർ ചെയ്ത ചോദ്യങ്ങൾ (തയ്യാറാക്കിയ പദപ്രയോഗങ്ങൾ)

    പാരാമീറ്ററൈസേഷൻ അല്ലെങ്കിൽ പാരാമീറ്റർ ബൈൻഡിംഗ്, SQL അന്വേഷണങ്ങൾ സൃഷ്ടിക്കുന്നതിനുള്ള ശുപാർശിത മാർഗമാണ്. എല്ലാ നല്ല ഡാറ്റാബേസ് ലൈബ്രറികളും സ്ഥിരസ്ഥിതിയായി ഇത് ഉപയോഗിക്കുന്നു. PHP-യ്‌ക്കായി PDO വിപുലീകരണം ഉപയോഗിക്കുന്നതിനുള്ള ഒരു ഉദാഹരണം ഇതാ:


    if(ctype_digit($_POST["id"]) && is_int($_POST["id"])) ($validatedId = $_POST["id"]; $pdo = പുതിയ PDO("mysql:store.db") ; $stmt = $pdo->തയ്യാറ് ("ഇടപാടുകളിൽ നിന്ന് * തിരഞ്ഞെടുക്കുക എവിടെ user_id = :id"); $stmt->bindParam(":id", $validatedId, PDO::PARAM_INT); $stmt->എക്‌സിക്യൂട്ട്() ;) അല്ലെങ്കിൽ (// ഐഡി മൂല്യം നിരസിക്കുകയും പിശകിനെക്കുറിച്ച് ഉപയോക്താവിനെ അറിയിക്കുകയും ചെയ്യുക)

    PDO എക്‌സ്‌പ്രഷനുകൾക്കായി ലഭ്യമായ bindParam() രീതി, മുമ്പ് തയ്യാറാക്കിയ എക്‌സ്‌പ്രഷനിൽ നൽകിയിരിക്കുന്ന "പ്ലെയ്‌സ്‌ഹോൾഡറുകളിലേക്ക്" പാരാമീറ്ററുകളെ ബന്ധിപ്പിക്കാൻ അനുവദിക്കുന്നു. PDO::PARAM_INT , PDO::PARAM_BOOL , PDO::PARAM_LOB, PDO::PARAM_STR എന്നിങ്ങനെയുള്ള അടിസ്ഥാന ഡാറ്റാ തരങ്ങളുടെ പാരാമീറ്ററുകൾ ഈ രീതി സ്വീകരിക്കുന്നു. ഇത് PDO::PARAM_STR-ൻ്റെ സ്ഥിരസ്ഥിതിയാണ്, മറ്റുവിധത്തിൽ വ്യക്തമാക്കിയിട്ടില്ലെങ്കിൽ, മറ്റ് മൂല്യങ്ങളും ഓർക്കുക!


    മാനുവൽ ഐസൊലേഷനിൽ നിന്ന് വ്യത്യസ്തമായി, പാരാമീറ്റർ ബൈൻഡിംഗ് (അല്ലെങ്കിൽ നിങ്ങളുടെ ഡാറ്റാബേസ് ലൈബ്രറി ഉപയോഗിക്കുന്ന ഏത് രീതിയും) ഓട്ടോമാറ്റിക്കായി ബന്ധിപ്പിച്ച ഡാറ്റയെ ശരിയായി വേർതിരിച്ചെടുക്കും, അതിനാൽ ഏത് ഫംഗ്‌ഷൻ ഉപയോഗിക്കണമെന്ന് നിങ്ങൾ ഓർക്കേണ്ടതില്ല. കൂടാതെ, നിങ്ങൾ എല്ലാം സ്വമേധയാ ഒറ്റപ്പെടുത്തേണ്ടതുണ്ടെന്ന് ഓർമ്മിക്കാൻ ശ്രമിക്കുന്നതിനേക്കാൾ സ്ഥിരമായ പാരാമീറ്റർ ബൈൻഡിംഗ് വളരെ വിശ്വസനീയമാണ്.

    മിനിമം പ്രിവിലേജ് എന്ന തത്വം നടപ്പിലാക്കൽ

    വിജയകരമായ ഒരു SQL കുത്തിവയ്പ്പ് അവസാനിപ്പിക്കുന്നത് അത് പൂർണ്ണമായും തടയുന്നത് പോലെ പ്രധാനമാണ്. ഒരു ആക്രമണകാരിക്ക് SQL ചോദ്യങ്ങൾ എക്സിക്യൂട്ട് ചെയ്യാനുള്ള കഴിവ് ലഭിക്കുമ്പോൾ, അവൻ ഒരു നിർദ്ദിഷ്ട ഡാറ്റാബേസ് ഉപയോക്താവായി അത് ചെയ്യും. എല്ലാ ഉപയോക്താക്കൾക്കും അവരുടെ ചുമതലകൾ നിർവഹിക്കുന്നതിന് ആവശ്യമായ പ്രത്യേകാവകാശങ്ങൾ മാത്രമേ ഉള്ളൂ എന്ന് ഏറ്റവും കുറഞ്ഞ പദവി എന്ന തത്വത്തിന് ഉറപ്പാക്കാൻ കഴിയും.


    ഒരു ഉപയോക്താവിന് ഉയർന്ന പ്രത്യേകാവകാശങ്ങളുണ്ടെങ്കിൽ, ഒരു ആക്രമണകാരിക്ക് അവരുടെ പേരിൽ പുതിയ SQL കുത്തിവയ്പ്പുകൾ നടത്തിക്കൊണ്ട് പട്ടികകൾ ഉപേക്ഷിക്കാനും മറ്റ് ഉപയോക്താക്കളുടെ പ്രത്യേകാവകാശങ്ങൾ മാറ്റാനും കഴിയും. ഇത് സംഭവിക്കുന്നത് തടയാൻ, ഒരു റൂട്ട്, അഡ്മിനിസ്ട്രേറ്റർ അല്ലെങ്കിൽ ഉയർന്ന പ്രത്യേകാവകാശങ്ങളുള്ള മറ്റ് ഉപയോക്താവ് എന്ന നിലയിൽ ഒരു വെബ് ആപ്ലിക്കേഷനിൽ നിന്ന് ഡാറ്റാബേസ് ഒരിക്കലും ആക്സസ് ചെയ്യരുത്.


    ഡാറ്റാബേസിലേക്ക് ഡാറ്റ വായിക്കുന്നതിനും എഴുതുന്നതിനുമുള്ള റോളുകൾ വേർതിരിക്കുന്നതാണ് തത്വത്തിൻ്റെ മറ്റൊരു പ്രയോഗം. റൈറ്റ്-ഒൺലി പെർമിഷനുകളുള്ള ഒരു ഉപയോക്താവിനെയും റീഡ്-ഒൺലി പെർമിഷനുകളുള്ള മറ്റൊരു ഉപയോക്താവിനെയും തിരഞ്ഞെടുക്കുക. ആക്രമണം “വായന” ഉപയോക്താവിനെ ലക്ഷ്യമാക്കിയുള്ളതാണെങ്കിൽ, ആക്രമണകാരിക്ക് പട്ടികയിലെ ഡാറ്റ കൈകാര്യം ചെയ്യാനോ എഴുതാനോ കഴിയില്ല. നിങ്ങൾക്ക് കൂടുതൽ ഇടുങ്ങിയ ആക്സസ് പരിമിതപ്പെടുത്താൻ കഴിയും, അതുവഴി വിജയകരമായ SQL കുത്തിവയ്പ്പ് ആക്രമണങ്ങളുടെ ആഘാതം കുറയ്ക്കും.


    പല വെബ് ആപ്ലിക്കേഷനുകളും, പ്രത്യേകിച്ച് ഓപ്പൺ സോഴ്‌സ്, ഒരു ഡാറ്റാബേസ് ഉപയോക്താവിനെ മാത്രം ഉപയോഗിക്കുന്നതിന് രൂപകൽപ്പന ചെയ്‌തിരിക്കുന്നു, അതിൻ്റെ പ്രത്യേകാവകാശ നില ഒരിക്കലും പരിശോധിക്കപ്പെടില്ല. അതിനാൽ ഈ പോയിൻ്റിനെക്കുറിച്ച് മറക്കരുത് കൂടാതെ ഒരു അഡ്മിനിസ്ട്രേറ്റർ അക്കൗണ്ടിന് കീഴിൽ ആപ്ലിക്കേഷനുകൾ പ്രവർത്തിപ്പിക്കാൻ ശ്രമിക്കരുത്.

    കോഡ് ഇഞ്ചക്ഷൻ (റിമോട്ട് ഫയൽ ഇൻക്ലൂഷൻ എന്നറിയപ്പെടുന്നു)

    ഒരു വെബ് ആപ്ലിക്കേഷനിലേക്ക് സോഴ്‌സ് കോഡ് ചേർക്കാൻ ആക്രമണകാരിയെ അനുവദിക്കുന്ന ഏത് സാങ്കേതികതയാണ് കോഡ് കുത്തിവയ്പ്പ്, അത് വ്യാഖ്യാനിക്കാനും നടപ്പിലാക്കാനും കഴിയും. ഈ സാഹചര്യത്തിൽ, ക്ലയൻ്റ് ഭാഗത്തേക്ക് കോഡ് അവതരിപ്പിക്കുന്നതിനെക്കുറിച്ചല്ല ഞങ്ങൾ സംസാരിക്കുന്നത്, ഉദാഹരണത്തിന് ജാവാസ്ക്രിപ്റ്റിൽ, XSS ആക്രമണങ്ങൾ ഇതിനകം ഇവിടെ ഉപയോഗിച്ചിട്ടുണ്ട്.


    നിങ്ങൾക്ക് വിശ്വസനീയമല്ലാത്ത ഇൻപുട്ട് ഉറവിടത്തിൽ നിന്ന് നേരിട്ട് സോഴ്‌സ് കോഡ് കുത്തിവയ്ക്കാം, അല്ലെങ്കിൽ പ്രാദേശിക ഫയൽ സിസ്റ്റത്തിൽ നിന്നോ URL പോലുള്ള ഒരു ബാഹ്യ ഉറവിടത്തിൽ നിന്നോ ലോഡ് ചെയ്യാൻ വെബ് ആപ്ലിക്കേഷനെ നിർബന്ധിക്കുക. ബാഹ്യ ഉറവിട ഉൾപ്പെടുത്തലിൻ്റെ ഫലമായി കോഡ് കുത്തിവയ്ക്കുമ്പോൾ, അതിനെ സാധാരണയായി റിമോട്ട് ഫയൽ ഉൾപ്പെടുത്തൽ (RFI) എന്ന് വിളിക്കുന്നു, എന്നിരുന്നാലും RFI തന്നെ എപ്പോഴും കോഡ് കുത്തിവയ്ക്കാൻ ഉദ്ദേശിച്ചുള്ളതാണ്.


    കോഡ് അവതരിപ്പിക്കുന്നതിനുള്ള പ്രധാന കാരണങ്ങൾ:

    • ഇൻപുട്ട് ഡാറ്റ പരിശോധനയെ മറികടക്കുന്നു,
    • PHP കോഡായി പരിഗണിക്കപ്പെടുന്ന ഏത് സന്ദർഭത്തിലും വിശ്വസനീയമല്ലാത്ത ഇൻപുട്ടിൻ്റെ കുത്തിവയ്പ്പ്,
    • സോഴ്സ് കോഡ് റിപ്പോസിറ്ററികളുടെ സുരക്ഷ ഹാക്ക് ചെയ്യുന്നു,
    • മൂന്നാം കക്ഷി ലൈബ്രറികൾ ലോഡ് ചെയ്യുന്നതിനെക്കുറിച്ചുള്ള മുന്നറിയിപ്പുകൾ പ്രവർത്തനരഹിതമാക്കുക,
    • PHP ഇതര ഫയലുകൾ PHP ഇൻ്റർപ്രെറ്ററിലേക്ക് കൈമാറുന്നതിനായി സെർവർ വീണ്ടും ക്രമീകരിക്കുന്നു.

    അവസാന പോയിൻ്റിൽ പ്രത്യേക ശ്രദ്ധ നൽകുക: ഈ സാഹചര്യത്തിൽ, വിശ്വസനീയമല്ലാത്ത ഉപയോക്താക്കൾക്ക് സെർവറിലേക്ക് ഏത് ഫയലുകളും അപ്ലോഡ് ചെയ്യാൻ കഴിയും.

    കോഡ് കുത്തിവയ്പ്പ് ഉദാഹരണങ്ങൾ

    പിഎച്ച്‌പിക്ക് നിരവധി കോഡ് ഇഞ്ചക്ഷൻ ടാർഗെറ്റുകൾ ഉണ്ട്, അതിനാൽ ഇത്തരത്തിലുള്ള ആക്രമണം ഏതൊരു പ്രോഗ്രാമറുടെയും വാച്ച് ലിസ്റ്റിൽ ഒന്നാമതാണ്.

    ഒരു ഫയൽ ഉൾപ്പെടെ

    കോഡ് കുത്തിവയ്പ്പിനുള്ള ഏറ്റവും വ്യക്തമായ ലക്ഷ്യങ്ങൾ ഉൾപ്പെടുന്നു() , ഉൾപ്പെടുത്തിയ_ഒന്ന്() , ആവശ്യം() , ആവശ്യകത_ഒന്ന്() എന്നീ ഫംഗ്ഷനുകളാണ്. വിശ്വസനീയമല്ലാത്ത ഇൻപുട്ട് ഡാറ്റ ഈ ഫംഗ്‌ഷനുകളിലേക്ക് പാസാക്കിയ പാത്ത് പാരാമീറ്റർ നിർണ്ണയിക്കാൻ നിങ്ങളെ അനുവദിക്കുകയാണെങ്കിൽ, ഏത് ഫയലാണ് ഉൾപ്പെടുത്തേണ്ടതെന്ന് നിങ്ങൾക്ക് വിദൂരമായി നിയന്ത്രിക്കാനാകും. ഉൾപ്പെടുത്തിയ ഫയൽ ഒരു യഥാർത്ഥ PHP ഫയൽ ആയിരിക്കണമെന്നില്ല എന്നത് ശ്രദ്ധിക്കേണ്ടതാണ്; ടെക്സ്റ്റ് ഡാറ്റ സംഭരിക്കുന്നതിന് കഴിവുള്ള ഏത് ഫയൽ ഫോർമാറ്റും ഉപയോഗിക്കാം (അതായത്, മിക്കവാറും നിയന്ത്രണങ്ങളില്ലാതെ).


    ഡയറക്‌ടറി ട്രാവേഴ്സൽ അല്ലെങ്കിൽ റിമോട്ട് ഫയൽ ഉൾപ്പെടുത്തൽ ആക്രമണങ്ങൾക്ക് പാത്ത് പാരാമീറ്റർ ദുർബലമായേക്കാം. പാതയിലെ ../ അല്ലെങ്കിൽ... പ്രതീക കോമ്പിനേഷനുകൾ ഉപയോഗിക്കുന്നത് PHP പ്രോസസ്സിന് ആക്‌സസ് ഉള്ള മിക്കവാറും എല്ലാ ഫയലുകളിലേക്കും നാവിഗേറ്റ് ചെയ്യാൻ ഒരു ആക്രമണകാരിയെ അനുവദിക്കുന്നു. അതേ സമയം, സ്ഥിരസ്ഥിതി PHP കോൺഫിഗറേഷനിൽ, allow_url_include അപ്രാപ്‌തമാക്കിയിട്ടില്ലെങ്കിൽ മുകളിലുള്ള ഫംഗ്‌ഷനുകൾ ഒരു URL സ്വീകരിക്കുന്നു.

    പരീക്ഷ

    PHP eval() ഫംഗ്‌ഷൻ നിർവ്വഹണത്തിനായി PHP കോഡിൻ്റെ ഒരു വരി സ്വീകരിക്കുന്നു.

    റെഗുലർ എക്സ്പ്രഷനുകൾ നടപ്പിലാക്കുന്നു

    PHP-യിലെ PCRE (Perl Compatible Regular Expression) ഫംഗ്‌ഷൻ preg_replace() ഇ മോഡിഫയർ (PREG_REPLACE_EVAL) ഉപയോഗിക്കാൻ അനുവദിക്കുന്നു. ഇതിനർത്ഥം ഒരു പകരം വയ്ക്കൽ സ്ട്രിംഗ് ആണ്, അത് മാറ്റിസ്ഥാപിച്ചതിന് ശേഷം PHP കോഡായി കണക്കാക്കും. ആ വരിയിൽ വിശ്വസനീയമല്ലാത്ത ഇൻപുട്ട് ഉണ്ടെങ്കിൽ, എക്സിക്യൂട്ടബിൾ PHP കോഡ് കുത്തിവയ്ക്കാൻ അവർക്ക് കഴിയും.

    വികലമായ ഫയൽ ഉൾപ്പെടുത്തൽ യുക്തി

    വെബ് ആപ്ലിക്കേഷനുകൾ, നിർവചനം അനുസരിച്ച്, ഏതെങ്കിലും അഭ്യർത്ഥനകൾ നൽകുന്നതിന് ആവശ്യമായ ഫയലുകൾ ഉൾപ്പെടുന്നു. റൂട്ടിംഗ് ലോജിക്, ഡിപൻഡൻസി മാനേജ്മെൻ്റ്, ഓട്ടോലോഡിംഗ്, മറ്റ് പ്രോസസ്സുകൾ എന്നിവയിലെ തകരാറുകൾ നിങ്ങൾ പ്രയോജനപ്പെടുത്തുകയാണെങ്കിൽ, അഭ്യർത്ഥന പാതയോ അതിൻ്റെ പാരാമീറ്ററുകളോ കൈകാര്യം ചെയ്യുന്നത് സെർവറിനെ നിർദ്ദിഷ്ട പ്രാദേശിക ഫയലുകൾ ഉൾപ്പെടുത്താൻ നിർബന്ധിതമാക്കും. അത്തരം കൃത്രിമങ്ങൾ കൈകാര്യം ചെയ്യാൻ വെബ് ആപ്ലിക്കേഷൻ രൂപകൽപ്പന ചെയ്തിട്ടില്ലാത്തതിനാൽ, അനന്തരഫലങ്ങൾ പ്രവചനാതീതമായിരിക്കും. ഉദാഹരണത്തിന്, കമാൻഡ് ലൈനിലെ ഉപയോഗത്തിനായി മാത്രം ഉദ്ദേശിച്ചിട്ടുള്ള റൂട്ടുകൾ ആപ്ലിക്കേഷൻ അറിയാതെ തുറന്നുകാട്ടും. അല്ലെങ്കിൽ കൺസ്ട്രക്‌ടർമാർ ചുമതലകൾ നിർവഹിക്കുന്ന മറ്റ് ക്ലാസുകൾ ഇത് വെളിപ്പെടുത്തും (ക്ലാസുകൾ ഈ രീതിയിൽ രൂപകൽപ്പന ചെയ്യാതിരിക്കുന്നതാണ് നല്ലത്, പക്ഷേ ഇത് ഇപ്പോഴും സംഭവിക്കുന്നു). ഈ സാഹചര്യങ്ങളിലേതെങ്കിലും ആപ്ലിക്കേഷൻ്റെ ബാക്കെൻഡ് പ്രവർത്തനങ്ങളെ തടസ്സപ്പെടുത്താം, നേരിട്ടുള്ള ആക്‌സസ് ഉൾപ്പെടാത്ത റിസോഴ്‌സ്-ഇൻ്റൻസീവ് ഓപ്പറേഷനുകളിൽ ഡാറ്റ കൃത്രിമത്വം അല്ലെങ്കിൽ ഡോസ് ആക്രമണങ്ങൾ അനുവദിക്കുന്നു.

    കോഡ് കുത്തിവയ്പ്പ് വെല്ലുവിളികൾ

    ടാസ്‌ക്കുകളുടെ ശ്രേണി വളരെ വിശാലമാണ്, കാരണം ആക്രമണകാരി തിരഞ്ഞെടുക്കുന്ന ഏത് പിഎച്ച്‌പി കോഡും എക്‌സിക്യൂട്ട് ചെയ്യാൻ ഇത്തരത്തിലുള്ള ആക്രമണം നിങ്ങളെ അനുവദിക്കുന്നു.

    കോഡ് ഇൻജക്ഷൻ കമാൻഡ് കുത്തിവയ്പ്പിനെതിരെയുള്ള പ്രതിരോധങ്ങൾ കമാൻഡ് ഇൻജക്ഷൻ്റെ ഉദാഹരണങ്ങൾ കമാൻഡ് ഇൻജക്ഷൻ ലോഗ് ഇഞ്ചക്ഷനിനെതിരായ പ്രതിരോധം (ലോഗ് ഫയൽ ഇഞ്ചക്ഷൻ എന്നറിയപ്പെടുന്നു)

    പല ആപ്ലിക്കേഷനുകളും ലോഗുകൾ ശേഖരിക്കുന്നു, അംഗീകൃത ഉപയോക്താക്കൾ പലപ്പോഴും ഒരു HTML ഇൻ്റർഫേസിലൂടെ അവ കാണാറുണ്ട്. അതിനാൽ, മറ്റ് ആക്രമണങ്ങൾ മറച്ചുവെക്കാനും ലോഗുകൾ കാണുന്നവരെ കബളിപ്പിക്കാനും തുടർന്ന് ലോഗുകൾ വായിക്കുകയും വിശകലനം ചെയ്യുകയും ചെയ്യുന്ന മോണിറ്ററിംഗ് ആപ്ലിക്കേഷൻ്റെ ഉപയോക്താക്കളെ ആക്രമിക്കാൻ ആഗ്രഹിക്കുന്ന ആക്രമണകാരികളുടെ പ്രധാന ലക്ഷ്യങ്ങളിലൊന്നാണ് ലോഗുകൾ.


    ലോഗുകളുടെ അപകടസാധ്യത ലോഗ് റെക്കോർഡിംഗിലെ നിയന്ത്രണ സംവിധാനങ്ങളെ ആശ്രയിച്ചിരിക്കുന്നു, അതുപോലെ തന്നെ ലോഗുകൾ കാണുമ്പോഴും വിശകലനം ചെയ്യുമ്പോഴും ലോഗ് ഡാറ്റയെ വിശ്വസനീയമല്ലാത്ത ഉറവിടമായി കണക്കാക്കുന്നു.


    ഒരു ലളിതമായ ലോഗിംഗ് സിസ്റ്റത്തിന് file_put_contents() ഉപയോഗിച്ച് ഒരു ഫയലിലേക്ക് ടെക്സ്റ്റ് സ്ട്രിംഗുകൾ എഴുതാൻ കഴിയും. ഉദാഹരണത്തിന്, ഒരു പ്രോഗ്രാമർ ഇനിപ്പറയുന്ന ഫോർമാറ്റിൻ്റെ സ്ട്രിംഗുകളായി പരാജയപ്പെട്ട അംഗീകാര ശ്രമങ്ങൾ ലോഗ് ചെയ്യുന്നു:


    sprintf("%s-ൻ്റെ ലോഗിൻ ശ്രമം പരാജയപ്പെട്ടു", $username);

    ആക്രമണകാരി ഫോമിൽ "AdminnSuccessful login by Adminn" എന്ന പേര് ഉപയോഗിച്ചാലോ?


    വിശ്വസനീയമല്ലാത്ത ഇൻപുട്ട് ഡാറ്റയിൽ നിന്നാണ് ഈ ലൈൻ ലോഗിൽ ചേർത്തിട്ടുള്ളതെങ്കിൽ, അഡ്‌മിൻ പാസ്‌വേഡ് നൽകുന്നതിൽ നിരപരാധിയായ ഒരു പരാജയം ഉപയോഗിച്ച് ആക്രമണകാരി പരാജയപ്പെട്ട അംഗീകാര ശ്രമം വിജയകരമായി മറച്ചുവെക്കും. നിങ്ങൾ വിജയകരമായ ഒരു അംഗീകാര ശ്രമം ചേർത്താൽ, ഡാറ്റയുടെ സംശയാസ്പദത ഇനിയും കുറയും.


    ലോഗിലേക്ക് എല്ലാത്തരം എൻട്രികളും ചേർക്കാൻ ആക്രമണകാരിക്ക് കഴിയും എന്നതാണ് ഇവിടെ മുഴുവൻ പോയിൻ്റ്. നിങ്ങൾക്ക് എക്സ്എസ്എസ് വെക്റ്ററുകളും ലോഗ് എൻട്രികൾ കൺസോളിൽ വായിക്കാൻ ബുദ്ധിമുട്ടുള്ള പ്രതീകങ്ങളും കുത്തിവയ്ക്കാനും കഴിയും.

    കുത്തിവയ്പ്പ് ജോലികൾ ലോഗ് ചെയ്യുക

    നടപ്പാക്കലിൻ്റെ ലക്ഷ്യങ്ങളിലൊന്ന് ലോഗ് ഫോർമാറ്റ് ഇൻ്റർപ്രെറ്ററുകൾ ആണ്. ലോഗ് എൻട്രികളെ വ്യത്യസ്‌ത ഫീൽഡുകളിലേക്ക് വേർതിരിക്കുന്നതിന് ഒരു വിശകലന ഉപകരണം പാഴ്‌സ് ചെയ്യുന്നതിന് റെഗുലർ എക്‌സ്‌പ്രഷനുകൾ ഉപയോഗിക്കുകയാണെങ്കിൽ, ശരിയായവയ്‌ക്ക് പകരം കുത്തിവച്ച ഫീൽഡുകൾ തിരഞ്ഞെടുക്കുന്നതിന് റെഗുലർ എക്‌സ്‌പ്രഷനു കാരണമാകുന്ന ഒരു സ്‌ട്രിംഗ് സൃഷ്‌ടിക്കാനും കുത്തിവയ്ക്കാനും കഴിയും. ഉദാഹരണത്തിന്, ഈ എൻട്രി നിരവധി പ്രശ്നങ്ങൾ ഉണ്ടാക്കാം:


    $username = "iamnothacker! ജനുവരി 01 00:00:00 +1000 2009"; sprintf("%s-ൽ %s നടത്തിയ ലോഗിൻ ശ്രമം പരാജയപ്പെട്ടു", $username,)

    ബ്രൗസറിൽ ലോഗ് പ്രദർശിപ്പിക്കുന്നതിന് കൂടുതൽ സങ്കീർണ്ണമായ ലോഗ് ഇഞ്ചക്ഷൻ ആക്രമണങ്ങൾ ഡയറക്‌ടറി ട്രാവെർസൽ ആക്രമണങ്ങളെ ആശ്രയിക്കുന്നു. ശരിയായ സാഹചര്യങ്ങളിൽ, ഒരു ലോഗ് സന്ദേശത്തിലേക്ക് PHP കോഡ് കുത്തിവയ്ക്കുകയും ബ്രൗസറിൽ ലോഗ് ഫയൽ തുറക്കുകയും ചെയ്യുന്നത് വിജയകരമായ കോഡ് കുത്തിവയ്പ്പിന് കാരണമാകും, അത് ആക്രമണകാരിയുടെ അഭ്യർത്ഥനപ്രകാരം ഭംഗിയായി ഫോർമാറ്റ് ചെയ്യുകയും നടപ്പിലാക്കുകയും ചെയ്യും. സെർവറിൽ ക്ഷുദ്രകരമായ PHP എക്സിക്യൂട്ട് ചെയ്യുകയാണെങ്കിൽ, കേടുപാടുകൾ കുറയ്ക്കാൻ കഴിയുന്ന പ്രതിരോധ പാളികളുടെ ഫലപ്രാപ്തി മാത്രമേ നമുക്ക് പ്രതീക്ഷിക്കാനാകൂ.

    ലോഗ് ഇൻജക്ഷൻ സംരക്ഷണം

    എല്ലാ ബാഹ്യ ലോഗ് സന്ദേശങ്ങളും ഫിൽട്ടർ ചെയ്യുന്നതിനുള്ള ഏറ്റവും എളുപ്പ മാർഗം ഒരു വൈറ്റ്‌ലിസ്റ്റ് ഉപയോഗിക്കുക എന്നതാണ്. അക്കങ്ങൾ, അക്ഷരങ്ങൾ, സ്‌പെയ്‌സുകൾ എന്നിവയിൽ മാത്രം ഞങ്ങൾ പ്രതീക സെറ്റ് പരിമിതപ്പെടുത്തുന്നു. അനധികൃത പ്രതീകങ്ങൾ അടങ്ങിയ സന്ദേശങ്ങൾ കേടായതായി കണക്കാക്കുന്നു. അപ്പോൾ ഒരു ലോഗ് ഫയൽ കുത്തിവയ്ക്കാനുള്ള സാധ്യതയുള്ള ശ്രമത്തെക്കുറിച്ച് ലോഗിൽ ഒരു എൻട്രി ദൃശ്യമാകുന്നു. വിശ്വസനീയമല്ലാത്ത ഇൻപുട്ട് ഡാറ്റ ഉൾപ്പെടുത്തുന്നതിൽ നിന്ന് സന്ദേശങ്ങൾ ഒഴിവാക്കാൻ കഴിയാത്ത ലളിതമായ ടെക്സ്റ്റ് ലോഗുകൾക്കുള്ള ലളിതമായ സുരക്ഷാ രീതിയാണിത്.


    അടിസ്ഥാന 64 പോലുള്ള ഒരു സിസ്റ്റം ഉപയോഗിച്ച് വിശ്വസനീയമല്ലാത്ത ഇൻപുട്ട് ഡാറ്റയുടെ ഭാഗങ്ങൾ പരിവർത്തനം ചെയ്യുക എന്നതാണ് സംരക്ഷണത്തിൻ്റെ രണ്ടാമത്തെ രീതി, ഇത് പരിമിതമായ ഒരു കൂട്ടം പ്രതീകങ്ങളെ പിന്തുണയ്ക്കുന്നു, അതേസമയം നിരവധി വിവരങ്ങൾ ടെക്സ്റ്റ് രൂപത്തിൽ സൂക്ഷിക്കാൻ അനുവദിക്കുന്നു.

    പാത്ത് ട്രാവെർസൽ (ഡയറക്‌ടറി ട്രാവേഴ്‌സൽ എന്നറിയപ്പെടുന്നു)

    ഒരു വെബ് ആപ്ലിക്കേഷൻ്റെ ബാക്കെൻഡിലെ ഫയൽ റീഡ് അല്ലെങ്കിൽ റൈറ്റ് പ്രവർത്തനങ്ങളെ ബാധിക്കാനുള്ള ശ്രമങ്ങളാണ് പാത്ത് ട്രാവേർസൽ ആക്രമണങ്ങൾ. ബാക്കെൻഡ് ഓപ്പറേഷനുകളിൽ ഉൾപ്പെട്ടിരിക്കുന്ന ഫയലുകളുടെ പാഥുകൾ കൈകാര്യം ചെയ്യാൻ നിങ്ങളെ അനുവദിക്കുന്ന പാരാമീറ്ററുകൾ അവതരിപ്പിച്ചുകൊണ്ടാണ് ഇത് ചെയ്യുന്നത്. അതിനാൽ ഇത്തരത്തിലുള്ള ആക്രമണം വിവര വെളിപ്പെടുത്തലും ലോക്കൽ/റിമോട്ട് ഫയൽ കുത്തിവയ്പ്പും സുഗമമാക്കുന്നു.


    അത്തരം ആക്രമണങ്ങളെ ഞങ്ങൾ പ്രത്യേകം പരിഗണിക്കും, പക്ഷേ അവയുടെ വിജയത്തിൻ്റെ അടിസ്ഥാനം കൃത്യമായി പാതയിലൂടെയാണ്. ചുവടെ വിവരിച്ചിരിക്കുന്ന ഫംഗ്‌ഷനുകൾ ഫയൽ പാഥുകൾ കൈകാര്യം ചെയ്യുന്നതിന് പ്രത്യേകമായതിനാൽ, പല PHP ഫംഗ്‌ഷനുകളും വാക്കിൻ്റെ സാധാരണ അർത്ഥത്തിൽ ഫയൽ പാത്തുകൾ സ്വീകരിക്കുന്നില്ലെന്ന് പരാമർശിക്കുന്നത് അർത്ഥമാക്കുന്നു. പകരം, ഉൾപ്പെടുന്നു() അല്ലെങ്കിൽ ഫയൽ() പോലുള്ള ഫംഗ്‌ഷനുകൾ ഒരു URI അംഗീകരിക്കുന്നു.


    ഇത് തികച്ചും പ്രകൃതിവിരുദ്ധമായി കാണപ്പെടുന്നു. എന്നാൽ ഇതിനർത്ഥം ഇനിപ്പറയുന്ന രണ്ട് ഫംഗ്‌ഷൻ കോളുകൾ തുല്യമാണ്, അവ കേവല പാതകൾ ഉപയോഗിക്കുന്നു (ഉദാഹരണത്തിന്, ആപേക്ഷിക പാതകളെ യാന്ത്രികമായി ലോഡുചെയ്യുന്നതിൽ ആശ്രയിക്കാതെ).


    ഉൾപ്പെടുത്തുക('/var/www/vendor/library/Class.php'); ഉൾപ്പെടുത്തുക ('file:///var/www/vendor/library/Class.php');

    ആപേക്ഷിക പാത്ത് വശത്ത് പ്രോസസ്സ് ചെയ്യുന്നു എന്നതാണ് കാര്യം (php.ini-ലെ ഉൾപ്പെടുത്തിയ_പാത്ത് ക്രമീകരണവും ലഭ്യമായ ഓട്ടോലോഡറുകളും). അത്തരം സന്ദർഭങ്ങളിൽ, ഫയൽ യുആർഐ സ്കീം സബ്സ്റ്റിറ്റ്യൂഷൻ ഉൾപ്പെടെയുള്ള പല തരത്തിലുള്ള പാരാമീറ്റർ കൃത്രിമത്വത്തിന് PHP ഫംഗ്ഷനുകൾ പ്രത്യേകിച്ച് അപകടസാധ്യതയുണ്ട്, ഫയൽ പാതയുടെ തുടക്കത്തിൽ വിശ്വസനീയമല്ലാത്ത ഡാറ്റ ഉൾപ്പെടുത്തിയാൽ ഒരു ആക്രമണകാരിക്ക് HTTP അല്ലെങ്കിൽ FTP URI കുത്തിവയ്ക്കാൻ കഴിയും. റിമോട്ട് ഫയൽ ഉൾപ്പെടുത്തൽ ആക്രമണങ്ങളെക്കുറിച്ചുള്ള വിഭാഗത്തിൽ ഞങ്ങൾ ഇതിനെക്കുറിച്ച് കൂടുതൽ വിശദമായി സംസാരിക്കും, എന്നാൽ ഇപ്പോൾ ഞങ്ങൾ ഫയൽ സിസ്റ്റം പാഥുകൾ മറികടക്കുന്നതിൽ ശ്രദ്ധ കേന്ദ്രീകരിക്കും.


    മറ്റൊരു ഫയൽ ആക്‌സസ് ചെയ്യുന്നതിനുള്ള പാത മാറ്റുന്നത് ഈ ദുർബലതയിൽ ഉൾപ്പെടുന്നു. ഒരു ആർഗ്യുമെൻ്റിലേക്ക് ../ സീക്വൻസുകളുടെ ഒരു ശ്രേണി കുത്തിവയ്ക്കുന്നതിലൂടെയാണ് ഇത് സാധാരണയായി നേടിയെടുക്കുന്നത്, അത് ഫംഗ്ഷനുകളിലേക്ക് കൂട്ടിച്ചേർക്കുകയോ ഉൾപ്പെടുത്തുക() , ആവശ്യം() , file_get_contents() , കൂടാതെ സംശയാസ്പദമായ (ചിലർക്ക്) ഫംഗ്ഷനുകൾ പോലെയുള്ള ഫംഗ്ഷനുകളിലേക്ക് പൂർണ്ണമായി ചേർക്കുകയോ ചെയ്യുന്നു. DOMDocument പോലെ: :load() .


    ../ സീക്വൻസ് ഉപയോഗിച്ച്, ആക്രമണകാരി സിസ്റ്റത്തെ പാരൻ്റ് ഡയറക്ടറിയിലേക്ക് മടങ്ങാൻ പ്രേരിപ്പിക്കുന്നു. അതിനാൽ /var/www/public/../vendor എന്ന പാത യഥാർത്ഥത്തിൽ /var/www/vendor എന്നതിലേക്ക് പോകുന്നു. /പൊതുവിന് ശേഷം ../ എന്ന ക്രമം നമ്മെ പാരൻ്റ് ഡയറക്ടറിയിലേക്ക് തിരികെ കൊണ്ടുപോകുന്നു, അതായത് /var/www. വെബ് സെർവറിൽ നിന്ന് ആക്‌സസ് ചെയ്യാവുന്ന /പബ്ലിക് ഡയറക്‌ടറിക്ക് പുറത്തുള്ള ഫയലുകളിലേക്ക് ആക്‌സസ് നേടാൻ ഇത് ആക്രമണകാരിയെ അനുവദിക്കുന്നു.


    തീർച്ചയായും, ഒരു പാതയിലൂടെ സഞ്ചരിക്കുന്നത് തിരിച്ചുവരുന്നതിൽ മാത്രം ഒതുങ്ങുന്നില്ല. .htaccess-ലെ നിയന്ത്രണ ക്രമീകരണങ്ങൾ കാരണം ബ്രൗസറിൽ നിന്ന് ആക്‌സസ് ചെയ്യാനാകാത്ത ചൈൽഡ് ഡയറക്‌ടറികളിലേക്ക് ആക്‌സസ് നേടുന്നതിന് നിങ്ങൾക്ക് പുതിയ പാത്ത് ഘടകങ്ങൾ നടപ്പിലാക്കാം. വെബ് സെർവറിലെ നോൺ-പബ്ലിക് ഫയലുകളുടെയും ഡയറക്‌ടറികളുടെയും ആക്‌സസ് കൺട്രോൾ കോൺഫിഗറേഷനെക്കുറിച്ച് PHP ഫയൽ സിസ്റ്റം പ്രവർത്തനങ്ങൾ ശ്രദ്ധിക്കുന്നില്ല.

    പാത്ത് ട്രാവേഴ്സൽ എക്സ്എംഎൽ കുത്തിവയ്പ്പിനെതിരായ പാത്ത് ട്രാവേഴ്സൽ ഡിഫൻസുകളുടെ ഉദാഹരണങ്ങൾ

    സെർവറിനും ക്ലയൻ്റിനുമിടയിൽ ഡാറ്റ കൈമാറ്റം ചെയ്യുന്നതിനുള്ള ഒരു ഭാരം കുറഞ്ഞ മാർഗമായി JSON അവതരിപ്പിച്ചിട്ടും, XML ഒരു ജനപ്രിയ ബദലായി തുടരുന്നു, കൂടാതെ വെബ് സേവന API-കൾ പലപ്പോഴും JSON-ന് സമാന്തരമായി അതിനെ പിന്തുണയ്ക്കുന്നു. XML സ്കീമകൾ ഉപയോഗിച്ച് ഡാറ്റ കൈമാറ്റം ചെയ്യാനും XML ഉപയോഗിക്കുന്നു: RSS, Atom, SOAP, RDF മുതലായവ.


    XML സർവ്വവ്യാപിയാണ്: വെബ് ആപ്ലിക്കേഷൻ സെർവറുകൾ, ബ്രൗസറുകൾ (XMLHttpRequest അഭ്യർത്ഥനകൾക്കും പ്രതികരണങ്ങൾക്കും മുൻഗണനയുള്ള ഫോർമാറ്റ് ആയി), ബ്രൗസർ വിപുലീകരണങ്ങൾ എന്നിവയിൽ ഇത് കണ്ടെത്താനാകും. DOM-ലും SimpleXML, XMLReader വിപുലീകരണങ്ങളിലും PHP ഉപയോഗിക്കുന്ന libxml2 പോലുള്ള ജനപ്രിയ പാഴ്‌സറുകൾ വഴിയുള്ള അതിൻ്റെ വ്യാപനവും ഡിഫോൾട്ട് പ്രോസസ്സിംഗും കണക്കിലെടുക്കുമ്പോൾ, XML കുത്തിവയ്പ്പ് ആക്രമണങ്ങളുടെ ലക്ഷ്യമായി മാറിയിരിക്കുന്നു. XML എക്സ്ചേഞ്ചിൽ ബ്രൗസർ സജീവമായി പങ്കെടുക്കുമ്പോൾ, XSS മുഖേന, അംഗീകൃത ഉപയോക്താക്കൾക്ക് ആക്രമണകാരികൾ സൃഷ്ടിച്ച XML അഭ്യർത്ഥനകൾ കൈമാറാൻ കഴിയുമെന്നത് കണക്കിലെടുക്കേണ്ടതാണ്.

    എക്സ്എംഎൽ എക്സ്റ്റേണൽ എൻ്റിറ്റി എംബഡിംഗ് (XXE)

    എക്‌സ്എംഎൽ പാഴ്‌സിംഗ് ലൈബ്രറികൾ ഇഷ്‌ടാനുസൃത എൻ്റിറ്റി റഫറൻസുകളുടെ ഉപയോഗത്തെ പിന്തുണയ്ക്കുന്നതിനാലാണ് ഈ ആക്രമണങ്ങൾ നിലനിൽക്കുന്നത്. സാധാരണ XML എൻ്റിറ്റി പൂർത്തീകരണത്തെക്കുറിച്ച് നിങ്ങൾ പഠിക്കും, അത് > , < ; ഒപ്പം '. XML ഡോക്യുമെൻ്റിലൂടെ തന്നെ ഇഷ്‌ടാനുസൃത എൻ്റിറ്റികൾ നിർവചിച്ച് സ്റ്റാൻഡേർഡ് എൻ്റിറ്റികളുടെ സെറ്റ് വികസിപ്പിക്കാൻ XML നിങ്ങളെ അനുവദിക്കുന്നു. ഓപ്‌ഷണൽ ഡോക്‌ടൈപ്പിൽ നേരിട്ട് ഉൾപ്പെടുത്തി അവയെ നിർവചിക്കാം. അവ പ്രതിനിധീകരിക്കുന്ന വിപുലീകൃത മൂല്യം ഉൾപ്പെടുത്തേണ്ട ഒരു ബാഹ്യ ഉറവിടത്തെ പരാമർശിച്ചേക്കാം. എക്‌സ്എക്‌സ് ഇ ആക്രമണങ്ങൾ പ്രചാരത്തിലായത്, എക്‌സ്‌റ്റേണൽ എക്‌സ്എംഎല്ലിൻ്റെ കഴിവ് കാരണം എക്‌സ്‌റ്റേണൽ റിസോഴ്‌സുകളുടെ ഉള്ളടക്കം കാരണം വിപുലീകരിക്കാൻ കഴിയുന്ന ഇഷ്‌ടാനുസൃത ലിങ്കുകൾ സംഭരിക്കാനാണ്. സാധാരണ സാഹചര്യങ്ങളിൽ, വിശ്വസനീയമല്ലാത്ത ഇൻപുട്ടുകൾ ഒരിക്കലും ഞങ്ങളുടെ സിസ്റ്റവുമായി അപ്രതീക്ഷിതമായ രീതിയിൽ ഇടപെടരുത്. കൂടാതെ മിക്ക XXE പ്രോഗ്രാമർമാരും തീർച്ചയായും XXE ആക്രമണങ്ങൾ മുൻകൂട്ടി കാണുന്നില്ല, അത് പ്രത്യേക ആശങ്കയാണ്.


    ഉദാഹരണത്തിന്, ഒരു പുതിയ ഇഷ്‌ടാനുസൃത എൻ്റിറ്റി നിരുപദ്രവകാരിയെ നിർവചിക്കാം:



    ഈ നിർവചനമുള്ള ഒരു XML ഡോക്യുമെൻ്റിന് ഇപ്പോൾ എൻ്റിറ്റികൾ പൊതുവായി അനുവദിച്ചിരിക്കുന്നിടത്തെല്ലാം ഒരു എൻ്റിറ്റിയെ പരാമർശിക്കാൻ കഴിയും:


    ഈ ഫലം

    PHP DOM പോലെയുള്ള ഒരു XML പാഴ്‌സർ ഈ XML വ്യാഖ്യാനിക്കുമ്പോൾ, പ്രമാണം ലോഡ് ചെയ്‌ത ഉടൻ തന്നെ അത് ഈ ഇഷ്‌ടാനുസൃത എൻ്റിറ്റിയെ പ്രോസസ്സ് ചെയ്യും. അതിനാൽ, അനുബന്ധ വാചകം അഭ്യർത്ഥിക്കുമ്പോൾ, അത് ഇനിപ്പറയുന്നവ നൽകും:


    ഈ ഫലം പൂർണ്ണമായും നിരുപദ്രവകരമാണ്


    വ്യക്തമായും, ഇഷ്‌ടാനുസൃത എൻ്റിറ്റികൾക്ക് ആവർത്തിച്ചുള്ള ടെക്‌സ്‌റ്റിനെയും ചെറിയ എൻ്റിറ്റി പേരുകളുള്ള XML നെയും പ്രതിനിധീകരിക്കുന്നതിൻ്റെ പ്രയോജനമുണ്ട്. എക്‌സ്എംഎൽ ഒരു നിശ്ചിത വ്യാകരണം പിന്തുടരേണ്ടതും ഇഷ്‌ടാനുസൃത എൻ്റിറ്റികൾ എഡിറ്റിംഗ് എളുപ്പമാക്കുന്നതും പലപ്പോഴും സംഭവിക്കാറുണ്ട്. എന്നിരുന്നാലും, ബാഹ്യ ഇൻപുട്ടിനെക്കുറിച്ചുള്ള നമ്മുടെ അവിശ്വാസം കണക്കിലെടുക്കുമ്പോൾ, ഞങ്ങളുടെ ആപ്ലിക്കേഷൻ ഉപയോഗിക്കുന്ന ഏതൊരു XML-ലും ഞങ്ങൾ വളരെ ശ്രദ്ധാലുവായിരിക്കണം. ഉദാഹരണത്തിന്, ഇതൊരു സുരക്ഷിത ഇനമല്ല:


    &harmless;

    അഭ്യർത്ഥിച്ച ലോക്കൽ ഫയലിൻ്റെ ഉള്ളടക്കത്തെ ആശ്രയിച്ച്, എൻ്റിറ്റി വികസിപ്പിക്കുമ്പോൾ ഡാറ്റ ഉപയോഗിച്ചേക്കാം. തുടർന്ന് എക്സ്എംഎൽ പാർസറിൽ നിന്ന് വിപുലീകരിച്ച ഉള്ളടക്കം എക്‌സ്‌ട്രാക്‌റ്റുചെയ്യാനും ആക്രമണകാരിയുടെ വിശകലനത്തിനായി വെബ് ആപ്ലിക്കേഷൻ്റെ ഔട്ട്‌ഗോയിംഗ് ഡാറ്റയിൽ ഉൾപ്പെടുത്താനും കഴിയും. ഉദാഹരണത്തിന്, വിവരങ്ങൾ വെളിപ്പെടുത്താൻ. എക്‌സ്‌ട്രാക്‌റ്റുചെയ്‌ത ഫയൽ എക്‌സ്എംഎൽ ആയി വ്യാഖ്യാനിക്കപ്പെടും, എന്നിരുന്നാലും ഈ വ്യാഖ്യാനം പ്രവർത്തനക്ഷമമാക്കുന്നതിന് പ്രത്യേക പ്രതീകങ്ങളൊന്നുമില്ല. ലോക്കൽ ഫയലിൻ്റെ ഉള്ളടക്കം എത്രത്തോളം തുറന്നുകാട്ടാം എന്നതിനെ ഇത് പരിമിതപ്പെടുത്തുന്നു. ഫയൽ XML ആയി വ്യാഖ്യാനിക്കപ്പെടുന്നു, എന്നാൽ സാധുതയുള്ള XML അടങ്ങിയിട്ടില്ലെങ്കിൽ, ഞങ്ങൾക്ക് മിക്കവാറും ഒരു പിശക് ലഭിക്കും, അത് ഉള്ളടക്കം വെളിപ്പെടുത്തുന്നതിൽ നിന്ന് തടയും. എന്നിരുന്നാലും, സ്കോപ്പ് പരിധി മറികടക്കാൻ PHP-ക്ക് ഒരു വൃത്തികെട്ട ട്രിക്ക് ലഭ്യമാണ്, അതിനാൽ റിമോട്ട് HTTP അഭ്യർത്ഥനകൾ വെബ് ആപ്ലിക്കേഷനെ ബാധിക്കും, തിരിച്ചുവന്ന പ്രതികരണം ആക്രമണകാരിക്ക് കൈമാറാൻ കഴിയില്ലെങ്കിലും.


    PHP-ൽ XML പാഴ്‌സ് ചെയ്യുന്നതിനും ഉപയോഗിക്കുന്നതിനും സാധാരണയായി ഉപയോഗിക്കുന്ന മൂന്ന് രീതികളുണ്ട്: PHP DOM, SimpleXML, XMLReader. അവയെല്ലാം libxml2 വിപുലീകരണം ഉപയോഗിക്കുന്നു, കൂടാതെ ബാഹ്യ എൻ്റിറ്റികൾക്കുള്ള പിന്തുണ സ്ഥിരസ്ഥിതിയായി പ്രവർത്തനക്ഷമമാക്കുന്നു. അനന്തരഫലമായി, PHP സ്ഥിരസ്ഥിതിയായി XXE ആക്രമണങ്ങൾക്ക് ഇരയാകുന്നു, XML ഉപയോഗിക്കുന്ന ഒരു വെബ് ആപ്ലിക്കേഷൻ്റെയോ ലൈബ്രറിയുടെയോ സുരക്ഷ പരിഗണിക്കുമ്പോൾ ഇത് വളരെ എളുപ്പമാണ്.


    XHTML, HTML 5 എന്നിവ സാധുവായ XML ആയി സീരിയലൈസ് ചെയ്യാമെന്നതും മറക്കരുത്. ഇതിനർത്ഥം ചില XHTML പേജുകൾ അല്ലെങ്കിൽ XML-സീരിയലൈസ് ചെയ്ത HTML 5, DOMDocument::loadHTML() എന്നതിന് പകരം DOMDocument::loadXML() ഉപയോഗിച്ച് XML ആയി പാഴ്‌സ് ചെയ്യാവുന്നതാണ്. എക്‌സ്എംഎൽ പാർസറിൻ്റെ ഈ ഉപയോഗവും എക്‌സ്‌റ്റേണൽ എക്‌സ്എംഎൽ എൻ്റിറ്റികളുടെ കുത്തിവയ്‌പ്പിന് അപകടകരമാണ്. libxml2 ഇതുവരെ HTML 5 ഡോക്‌ടൈപ്പ് പോലും തിരിച്ചറിഞ്ഞിട്ടില്ല, അതിനാൽ ഇത് XHTML ഡോക്‌ടൈപ്പുകളായി സാധൂകരിക്കാൻ കഴിയില്ല.

    ബാഹ്യ XML എൻ്റിറ്റികൾ നടപ്പിലാക്കുന്നതിനുള്ള ഉദാഹരണങ്ങൾഫയൽ ഉള്ളടക്കവും വെളിപ്പെടുത്തലും

    ഒരു ഇഷ്‌ടാനുസൃത XML എൻ്റിറ്റിക്ക് ഒരു ബാഹ്യ ഫയലിനെ പരാമർശിക്കാൻ കഴിയുമെന്ന് സൂചിപ്പിച്ചുകൊണ്ട് ഞങ്ങൾ മുകളിലുള്ള വിവര വെളിപ്പെടുത്തലിൻ്റെ ഒരു ഉദാഹരണം പരിശോധിച്ചു.


    &harmless;

    ഈ സാഹചര്യത്തിൽ, ഫയലുകളുടെ ഉള്ളടക്കം ഉപയോഗിച്ച് ഇഷ്‌ടാനുസൃത എൻ്റിറ്റി വിപുലീകരിക്കും. അത്തരം എല്ലാ അഭ്യർത്ഥനകളും പ്രാദേശികമായി നടപ്പിലാക്കുന്നതിനാൽ, ആപ്ലിക്കേഷന് വായിക്കാൻ കഴിയുന്ന എല്ലാ ഫയലുകളുടെയും ഉള്ളടക്കം വെളിപ്പെടുത്താൻ ഇത് അനുവദിക്കുന്നു. അതായത്, ആപ്ലിക്കേഷൻ്റെ ഔട്ട്‌ഗോയിംഗ് ഡാറ്റയിൽ വിപുലീകൃത എൻ്റിറ്റി ഉൾപ്പെടുത്തുമ്പോൾ, ആക്‌സസ് ചെയ്യാനാകാത്ത ഫയലുകൾ പരിശോധിക്കാൻ ആക്രമണകാരിക്ക് കഴിയും. എന്നിരുന്നാലും, ഈ സാഹചര്യത്തിൽ ഗുരുതരമായ ഒരു പരിമിതിയുണ്ട്: ഫയലുകൾ ഒന്നുകിൽ XML ഫോർമാറ്റിലോ അല്ലെങ്കിൽ XML പാഴ്സർ പിശകിലേക്ക് നയിക്കാത്ത ഫോർമാറ്റിലോ ആയിരിക്കണം. എന്നാൽ ഈ പരിമിതി PHP-യിൽ പൂർണ്ണമായും അവഗണിക്കാം എന്നതാണ് കാര്യം.


    &harmless;

    സ്റ്റാൻഡേർഡ് ഫയൽ സിസ്റ്റം ഫംഗ്‌ഷനുകൾ അംഗീകരിച്ച പ്രോട്ടോക്കോളുകളിൽ ഒന്നായ ഒരു യുആർഐ ആയി റാപ്പറിലേക്ക് PHP ആക്‌സസ് നൽകുന്നു: file_get_contents(), require(), require_once(), file(), copy() കൂടാതെ മറ്റു പലതും. PHP റാപ്പർ ഒരു നിർദ്ദിഷ്ട റിസോഴ്സിലേക്ക് പ്രയോഗിക്കാൻ കഴിയുന്ന നിരവധി ഫിൽട്ടറുകളെ പിന്തുണയ്ക്കുന്നു, അതിലൂടെ ഒരു ഫംഗ്ഷൻ വിളിച്ച് ഫലങ്ങൾ തിരികെ ലഭിക്കും. മുകളിലുള്ള ഉദാഹരണത്തിൽ, നമ്മൾ വായിക്കാൻ ആഗ്രഹിക്കുന്ന ടാർഗെറ്റ് ഫയലിലേക്ക് convert.base-64-എൻകോഡ് ഫിൽട്ടർ പ്രയോഗിക്കുന്നു.


    ടെക്സ്റ്റ് ഫോർമാറ്റ് പരിഗണിക്കാതെ തന്നെ ഒരു ആക്രമണകാരിക്ക് PHP-യിൽ ലഭ്യമായ ഏത് ഫയലും വായിക്കാൻ കഴിയുമെന്നാണ് ഇതിനർത്ഥം. ആപ്ലിക്കേഷനിൽ നിന്ന് വരുന്ന ഡാറ്റ കേവലം ഡീകോഡ് ചെയ്താൽ മതി, തുടർന്ന് അത് ശിക്ഷാരഹിതമായി വിച്ഛേദിക്കുക. ഇത് അന്തിമ ഉപയോക്താക്കളെയോ ആപ്ലിക്കേഷൻ്റെ ബാക്കെൻഡിനെയോ നേരിട്ട് ദോഷകരമായി ബാധിക്കില്ലെങ്കിലും, മറ്റ് കേടുപാടുകൾ കണ്ടെത്താനുള്ള ശ്രമത്തിൽ ആപ്ലിക്കേഷൻ ഘടനയെ നന്നായി പഠിക്കാൻ ഇത് ആക്രമണകാരികളെ അനുവദിക്കുന്നു. മാത്രമല്ല, ആക്രമണകാരികളെ കണ്ടെത്താനുള്ള സാധ്യത വളരെ കുറവാണ്.

    ആക്സസ് കൺട്രോൾ ബൈപാസ്

    പ്രവേശനം വ്യത്യസ്ത രീതികളിൽ നിയന്ത്രിക്കപ്പെടുന്നു. XXE ആക്രമണങ്ങൾ വെബ് ആപ്ലിക്കേഷൻ്റെ ബാക്കെൻഡിൽ നടക്കുന്നതിനാൽ, നിലവിലെ ഉപയോക്താവിൻ്റെ സെഷൻ ഉപയോഗിക്കാൻ കഴിയില്ല. എന്നാൽ ലോക്കൽ സെർവറിൽ നിന്നുള്ള അഭ്യർത്ഥനകൾ ഉപയോഗിച്ച് ആക്രമണകാരിക്ക് ബാക്കെൻഡിലേക്കുള്ള ആക്സസ് നിയന്ത്രണം മറികടക്കാൻ കഴിയും. ഈ പ്രാകൃത പ്രവേശന നിയന്ത്രണം പരിഗണിക്കുക:


    എങ്കിൽ (ഇസെറ്റ്($_SERVER["HTTP_CLIENT_IP"]) || isset($_SERVER["HTTP_X_FORWARDED_FOR"]) || !in_array(@$_SERVER["REMOTE_ADDR"], അറേ("127.0.0.1" ",))) (ഹെഡർ("HTTP/1.0 403 വിലക്കിയിരിക്കുന്നു"); പുറത്തുകടക്കുക("നിങ്ങൾക്ക് ഈ ഫയൽ ആക്സസ് ചെയ്യാൻ അനുവാദമില്ല."); )

    PHP-യുടെ ഈ ഭാഗം, ഇത് പോലെ എണ്ണമറ്റ മറ്റുള്ളവയെപ്പോലെ, പ്രാദേശിക സെർവറിലെ ചില PHP ഫയലുകളിലേക്കുള്ള ആക്‌സസ് പരിമിതപ്പെടുത്തുന്നു, അതായത് ലോക്കൽ ഹോസ്റ്റ്. എന്നിരുന്നാലും, ആപ്ലിക്കേഷൻ്റെ മുൻവശത്തുള്ള ഒരു XXE ആക്രമണം ആക്രമണകാരിക്ക് ഈ ആക്സസ് നിയന്ത്രണങ്ങൾ മറികടക്കാൻ ആവശ്യമായ കൃത്യമായ ക്രെഡൻഷ്യലുകൾ നൽകുന്നു, കാരണം XML പാഴ്സറിലേക്കുള്ള എല്ലാ HTTP അഭ്യർത്ഥനകളും ലോക്കൽഹോസ്റ്റിൽ നിന്നായിരിക്കും.


    &harmless;

    ലോഗ് കാണൽ പ്രാദേശിക അഭ്യർത്ഥനകൾക്ക് മാത്രമായി പരിമിതപ്പെടുത്തിയാലും, ആക്രമണകാരിക്ക് ലോഗുകൾ നേടാനാകും. മെയിൻ്റനൻസ് അല്ലെങ്കിൽ അഡ്മിനിസ്ട്രേഷൻ ഇൻ്റർഫേസുകൾക്കും ഇത് ബാധകമാണ്, ഈ രീതിയിൽ ആക്സസ് പരിമിതമാണ്.

    DOS ആക്രമണങ്ങൾ

    സെർവർ ഉറവിടങ്ങളുടെ ഉപഭോഗം നിർദ്ദേശിക്കുന്ന മിക്കവാറും എന്തും ഡോസ് ആക്രമണങ്ങൾക്കായി ഉപയോഗിക്കാം. ഒരു ബാഹ്യ XML എൻ്റിറ്റി കുത്തിവയ്ക്കുന്നതിലൂടെ, ഒരു ആക്രമണകാരിക്ക് അനിയന്ത്രിതമായ HTTP അഭ്യർത്ഥനകൾ നടത്താൻ കഴിയും, അത് ശരിയായ സാഹചര്യങ്ങളിൽ, സെർവർ ഉറവിടങ്ങൾ കളയുന്നു.


    XML എൻ്റിറ്റി വിപുലീകരണത്തിൻ്റെ അടിസ്ഥാനത്തിൽ XXE ആക്രമണങ്ങളുടെ മറ്റ് സാധ്യതയുള്ള DOS ഉപയോഗങ്ങളെക്കുറിച്ച് ഞങ്ങൾ പിന്നീട് സംസാരിക്കും.

    എക്‌സ്‌റ്റേണൽ എക്‌സ്എംഎൽ എൻ്റിറ്റികളുടെ കുത്തിവയ്‌പ്പിനെതിരെയുള്ള സംരക്ഷണം

    ഈ ആക്രമണങ്ങൾ വളരെ ജനപ്രിയമാണ്, അതിനാൽ അവയെ പ്രതിരോധിക്കുന്നത് എത്ര എളുപ്പമാണെന്ന് നിങ്ങൾ ആശ്ചര്യപ്പെടും. DOM, SimpleXML, XMLReader എന്നിവ libxml2-നെ ആശ്രയിക്കുന്നതിനാൽ, ബാഹ്യ എൻ്റിറ്റികളുടെ ഉപയോഗം പ്രവർത്തനരഹിതമാക്കാൻ നിങ്ങൾക്ക് libxml_disable_entity_loader() ഫംഗ്ഷൻ ഉപയോഗിക്കാം. എന്നിരുന്നാലും, DOCTYPE-ൽ മുൻകൂട്ടി നിശ്ചയിച്ചിട്ടുള്ള ഇഷ്‌ടാനുസൃത എൻ്റിറ്റികളെ ഇത് പ്രവർത്തനരഹിതമാക്കില്ല, കാരണം അവ ഒരു HTTP അഭ്യർത്ഥനയോ ഫയൽ സിസ്റ്റം പ്രവർത്തനമോ ആവശ്യമുള്ള ബാഹ്യ ഉറവിടങ്ങൾ ഉപയോഗിക്കില്ല.


    $oldValue = libxml_disable_entity_loader(true); $dom = പുതിയ DOMDocument(); $dom->loadXML($xml); libxml_disable_entity_loader($oldValue);

    സ്ട്രിംഗുകളിൽ നിന്നോ ഫയലുകളിൽ നിന്നോ റിമോട്ട് യുആർഐകളിൽ നിന്നോ XML ലോഡുചെയ്യുന്നത് ഉൾപ്പെടുന്ന എല്ലാ പ്രവർത്തനങ്ങൾക്കും ഇത് ചെയ്യണം.


    ഒരു അപ്ലിക്കേഷന് ഒരിക്കലും ബാഹ്യ എൻ്റിറ്റികൾ ആവശ്യമില്ലാത്തിടത്ത്, അതിൻ്റെ മിക്ക അഭ്യർത്ഥനകൾക്കും, ബാഹ്യ ഉറവിടങ്ങൾ ലോഡ് ചെയ്യുന്നത് കൂടുതൽ ആഗോള തലത്തിൽ പൂർണ്ണമായും പ്രവർത്തനരഹിതമാക്കാം. മിക്ക കേസുകളിലും, എല്ലാ XML ലോഡിംഗ് പോയിൻ്റുകളും നിർവചിക്കുന്നതിന് ഇത് വളരെ അഭികാമ്യമാണ്, കാരണം പല ലൈബ്രറികൾക്കും XXE ആക്രമണങ്ങൾക്ക് അന്തർലീനമായ കേടുപാടുകൾ ഉണ്ട്:


    libxml_disable_entity_loader(true);

    ബാഹ്യ ഉറവിടങ്ങൾ ലോഡുചെയ്യുന്നതിനുള്ള ഓരോ താൽക്കാലിക പ്രവർത്തനക്ഷമമാക്കിയതിനുശേഷവും TRUE തിരികെ നൽകാൻ ഓർമ്മിക്കുക. ഡോക്ബുക്ക് XML-നെ HTML-ലേക്ക് പരിവർത്തനം ചെയ്യുന്നത് പോലെയുള്ള നിരുപദ്രവകരമായ കാര്യത്തിന് നിങ്ങൾക്ക് ഇത് ആവശ്യമായി വന്നേക്കാം, ഇവിടെ XSL ശൈലികളുടെ പ്രയോഗം ബാഹ്യ എൻ്റിറ്റികളെ ആശ്രയിച്ചിരിക്കുന്നു.


    എന്നിരുന്നാലും, libxml2 പ്രവർത്തനരഹിതമാക്കൽ ഫംഗ്‌ഷൻ ഒരു പനേഷ്യയല്ല. എക്‌സ്‌റ്റേണൽ എൻ്റിറ്റികൾ ഉപയോഗിക്കുന്നതിനുള്ള "സ്വിച്ചുകൾ" കണ്ടെത്താൻ XML പാഴ്‌സ് ചെയ്യുന്നതോ അല്ലെങ്കിൽ പ്രോസസ്സ് ചെയ്യുന്നതോ ആയ മറ്റ് വിപുലീകരണങ്ങളും PHP ലൈബ്രറികളും വിശകലനം ചെയ്യുക.


    ഇത് സാധ്യമല്ലെങ്കിൽ, XML പ്രമാണം DOCTYPE പ്രഖ്യാപിക്കുന്നുണ്ടോയെന്ന് പരിശോധിക്കുക. അങ്ങനെയാണെങ്കിൽ, ബാഹ്യ എൻ്റിറ്റികൾ അപ്രാപ്‌തമാക്കിയാൽ, XML ഡോക്യുമെൻ്റ് വലിച്ചെറിയുക, അപകടസാധ്യതയുള്ള പാർസറിലേക്കുള്ള വിശ്വസനീയമല്ലാത്ത XML ആക്‌സസ് നിരസിക്കുകയും ആക്രമണത്തിന് സാധ്യതയുള്ളതായി ലോഗിൻ ചെയ്യുകയും ചെയ്യുക. ഇത് ആവശ്യമായ നടപടിയാണ്, കാരണം മറ്റ് അടയാളങ്ങളൊന്നും ഉണ്ടാകില്ല - പിശകുകളോ ഒഴിവാക്കലുകളോ ഇല്ല. നിങ്ങളുടെ പതിവ് ഇൻപുട്ട് മൂല്യനിർണ്ണയത്തിലേക്ക് ഈ ചെക്ക് നിർമ്മിക്കുക. എന്നാൽ ഈ രീതി ആദർശത്തിൽ നിന്ന് വളരെ അകലെയാണ്, അതിനാൽ ബാഹ്യ എൻ്റിറ്റികളുടെ പ്രശ്നം അടിസ്ഥാനപരമായി പരിഹരിക്കാൻ ഇത് വളരെ ശുപാർശ ചെയ്യുന്നു.


    /** * ഒരു ദ്രുത കണ്ടെത്തൽ ശ്രമിക്കുക */ $collapsedXML = preg_replace("/[:space:]/", "", $xml); എങ്കിൽ(preg_match("/