හරස් අඩවි ඉල්ලීම් ව්යාජ ප්රහාර (CSRF) වැළැක්වීම සඳහා සත්යතා ටෝකනය භාවිතා කරයි. සත්යතා ටෝකනය අවබෝධ කර ගැනීම සඳහා, ඔබ මුලින්ම CSRF ප්රහාර තේරුම් ගත යුතුය.
CSRF
ඔබ කර්තෘ යැයි සිතමු bank.com
. GET ඉල්ලීමක් සමඟ වෙනත් ගිණුමකට මුදල් මාරු කිරීමට භාවිතා කරන පෝරමයක් ඔබේ වෙබ් අඩවියේ ඇත:
හැකර්වරයෙකුට සේවාදායකයට HTTP ඉල්ලීමක් යැවිය හැකිය GET /transfer?amount=$1000000&account-to=999999
, නේද?
වැරදි. හැකර් ප්රහාරය සාර්ථක නොවනු ඇත. සේවාදායකයා මූලික වශයෙන් සිතනු ඇත?
හහ්? මාරුවීමක් ආරම්භ කිරීමට උත්සාහ කරන මේ පුද්ගලයා කවුද? එය ගිණුමේ හිමිකරු නොවේ, එය නිසැකවම.
සේවාදායකයා මෙය දන්නේ කෙසේද? session_id
ඉල්ලුම්කරු සත්යාපනය කරන කුකියක් නොමැති නිසා .
ඔබගේ පරිශීලක නාමය සහ මුරපදය සමඟ ඔබ පුරනය වන විට, සේවාදායකය session_id
ඔබගේ බ්රව්සරයේ කුකියක් සකසයි . ඒ ආකාරයෙන්, ඔබගේ පරිශීලක නාමය සහ මුරපදය සමඟ එක් එක් ඉල්ලීම සත්යාපනය කිරීමට ඔබට අවශ්ය නැත. ඔබගේ බ්රව්සරය session_id
කුකිය යවන විට , සේවාදායකයා දනී:
ඔහ්, ඒ ජෝන් ඩෝ. මිනිත්තු 2.5 කට පෙර ඔහු සාර්ථකව පුරනය විය. ඔහු යන්න හොඳයි.
හැකර් කෙනෙකු සිතිය හැකිය:
හ්ම්. සාමාන්ය HTTP ඉල්ලීමක් ක්රියාත්මක නොවනු ඇත, නමුත් මට එම session_id
කුකියට අත තැබිය හැකි නම් , මම රන්වන් වනු ඇත.
පරිශීලක බ්රව්සරයේ bank.com
වසම සඳහා කුකීස් සමූහයක් ඇත. පරිශීලකයා bank.com
වසමට ඉල්ලීමක් කරන සෑම අවස්ථාවකම , සියලු කුකීස් එවනු ලැබේ. session_id
කුකිය ඇතුළුව .
ඒ නිසා හැකර් ලබා ගත හැකි නම්, ඔබ ඔහුගේ ගිණුමට මුදල් මාරු කර යවයි බව ලබා ගන්න ඉල්ලීමක් කළ, ඔහු සාර්ථක විය කැමතියි. එසේ කිරීමට ඔහු ඔබව රැවටෙන්නේ කෙසේද? හරස් අඩවි ඉල්ලීම් වංචාව සමඟ.
ඇත්තෙන්ම එය ඉතා සරල ය. හැකර්ට ඔබව ඔහුගේ වෙබ් අඩවියට පිවිසිය හැකිය. ඔහුගේ වෙබ් අඩවියේ, ඔහුට පහත රූප ටැගය තිබිය හැකිය:
<img src="http://bank.com/transfer?amount=$1000000&account-to=999999">
පරිශීලක බ්රව්සරය එම රූප ටැගය හරහා පැමිණි විට, එය එම යූආර්එල් වෙත GET ඉල්ලීමක් කරනු ඇත. ඔහුගේ බ්රව්සරයෙන් ඉල්ලීම පැමිණෙන බැවින්, එය සම්බන්ධ සියලු කුකීස් ඒ සමඟ යවනු ඇත bank.com
. පරිශීලකයා මෑතකදී පුරනය වී ඇත්නම් bank.com
... session_id
කුකිය සැකසෙනු ඇති අතර, සේවාදායකයා සිතන්නේ පරිශීලකයා ඩොලර් 1,000,000 ක් 999999 ගිණුමට මාරු කිරීමට අදහස් කරන බවයි!
හොඳයි, භයානක අඩවි වෙත නොයන්න, ඔබ හොඳින් වනු ඇත.
එය ප්රමාණවත් නොවේ. කවුරුහරි එම රූපය ෆේස්බුක් වෙත පළ කර එය ඔබේ බිත්තියේ දිස්වන්නේ නම් කුමක් කළ යුතුද? XSS ප්රහාරයකින් ඔබ පිවිසෙන වෙබ් අඩවියකට එය එන්නත් කළහොත් කුමක් කළ යුතුද?
එය එතරම් නරක නැත. අවදානමට ලක්විය හැක්කේ GET ඉල්ලීම් පමණි.
සත්ය නොවේ. POST ඉල්ලීමක් යවන පෝරමයක් ගතිකව ජනනය කළ හැකිය. ආරක්ෂාව පිළිබඳ රේල්ස් මාර්ගෝපදේශයේ උදාහරණය මෙන්න :
<a href="http://www.harmless.com/" onclick="
var f = document.createElement('form');
f.style.display = 'none';
this.parentNode.appendChild(f);
f.method = 'POST';
f.action = 'http://www.example.com/account/destroy';
f.submit();
return false;">To the harmless survey</a>
සත්යතා ටෝකනය
ඔබට ApplicationController
මෙය ඇති විට :
protect_from_forgery with: :exception
මෙය:
<%= form_tag do %>
Form contents
<% end %>
මේ සඳහා සම්පාදනය කර ඇත:
<form accept-charset="UTF-8" action="/" method="post">
<input name="utf8" type="hidden" value="✓" />
<input name="authenticity_token" type="hidden" value="J7CBxfHalt49OSHp27hblqK20c9PgwJ108nDHX/8Cts=" />
Form contents
</form>
විශේෂයෙන් පහත සඳහන් දෑ ජනනය වේ:
<input name="authenticity_token" type="hidden" value="J7CBxfHalt49OSHp27hblqK20c9PgwJ108nDHX/8Cts=" />
CSRF ප්රහාර වලින් ආරක්ෂා වීම සඳහා, ඉල්ලීමක් සමඟ යවන ලද සත්යතා ටෝකනය රේල්ස් නොදකිනවා නම්, එය ඉල්ලීම ආරක්ෂිත යැයි නොසැලකේ.
මෙම ටෝකනය කුමක්දැයි ප්රහාරකයෙකු දැන ගන්නේ කෙසේද? පෝරමය ජනනය කරන සෑම අවස්ථාවකම අහඹු ලෙස වෙනස් අගයක් ජනනය වේ:
හරස් අඩවි ස්ක්රිප්ටින් (XSS) ප්රහාරයක් - එය එසේ ය. නමුත් එය වෙනස් දවසක් සඳහා වෙනස් අවදානමක් ඇත.