ÐÑака Ñипа clickjacking (англ. Â«Ð·Ð°Ñ Ð²Ð°Ñ ÐºÐ»Ð¸ÐºÐ°Â») позволÑÐµÑ Ð²ÑедоноÑной ÑÑÑаниÑе кликнÑÑÑ Ð¿Ð¾ ÑайÑÑ-жеÑÑве Ð¾Ñ Ð¸Ð¼ÐµÐ½Ð¸ поÑеÑиÑелÑ.
Ðногие ÑайÑÑ Ð±Ñли Ð²Ð·Ð»Ð¾Ð¼Ð°Ð½Ñ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ñм ÑпоÑобом, вклÑÑÐ°Ñ Twitter, Facebook, Paypal и дÑÑгие. ÐÑе они, конеÑно же, ÑейÑÐ°Ñ Ð·Ð°ÑиÑенÑ.
ÐдеÑ
ÐÐ´ÐµÑ ÑÑой аÑаки оÑÐµÐ½Ñ Ð¿ÑоÑÑа.
ÐÐ¾Ñ ÐºÐ°Ðº clickjacking-аÑака бÑла пÑоведена на Facebook:
- ÐоÑеÑиÑÐµÐ»Ñ Ð·Ð°Ð¼Ð°Ð½Ð¸Ð²Ð°ÑÑ Ð½Ð° вÑедоноÑнÑÑ ÑÑÑаниÑÑ (неважно как).
- Ðа ÑÑÑаниÑе еÑÑÑ ÑÑÑлка, коÑоÑÐ°Ñ Ð²ÑглÑÐ´Ð¸Ñ Ð±ÐµÐ·Ð¾Ð±Ð¸Ð´Ð½Ð¾ (напÑимеÑ, «РазбогаÑей пÑÑмо ÑейÑаÑ» или «Ðажми здеÑÑ, ÑÑо оÑÐµÐ½Ñ ÑмеÑно»).
- ÐовеÑÑ
ÑÑой ÑÑÑлки вÑедоноÑÐ½Ð°Ñ ÑÑÑаниÑа ÑазмеÑÐ°ÐµÑ Ð¿ÑозÑаÑнÑй
<iframe>ÑsrcÑ ÑайÑа facebook.com Ñаким обÑазом, ÑÑо кнопка «like» Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑ Ð¿ÑÑмо над ÑÑой ÑÑÑлкой. ÐбÑÑно ÑÑо делаеÑÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑz-indexв CSS. - ÐÑи попÑÑке клика на ÑÑÑ ÑÑÑÐ»ÐºÑ Ð¿Ð¾ÑеÑиÑÐµÐ»Ñ Ð½Ð° Ñамом деле Ð½Ð°Ð¶Ð¸Ð¼Ð°ÐµÑ Ð½Ð° кнопкÑ.
ÐемонÑÑÑаÑиÑ
ÐÐ¾Ñ ÐºÐ°Ðº вÑглÑÐ´Ð¸Ñ Ð²ÑедоноÑÐ½Ð°Ñ ÑÑÑаниÑа. ÐÐ»Ñ Ð½Ð°Ð³Ð»ÑдноÑÑи <iframe> полÑпÑозÑаÑнÑй (на ÑеалÑнÑÑ
вÑедоноÑнÑÑ
ÑÑÑаниÑаÑ
он полноÑÑÑÑ Ð¿ÑозÑаÑен):
<style>
iframe { /* иÑÑейм Ñ ÑайÑа-жеÑÑÐ²Ñ */
width: 400px;
height: 100px;
position: absolute;
top:0; left:-20px;
opacity: 0.5; /* в ÑеалÑноÑÑи opacity:0 */
z-index: 1;
}
</style>
<div>Ðажми, ÑÑÐ¾Ð±Ñ ÑазбогаÑеÑÑ:</div>
<!-- Url Ñ ÑайÑа-жеÑÑÐ²Ñ -->
<iframe src="/clickjacking/facebook.html"></iframe>
<button>ÐажмиÑе ÑÑда!</button>
<div>...РвÑÑ Ð±ÑÐ´ÐµÑ ÑÑÐ¿ÐµÑ (Ñ Ð¼ÐµÐ½Ñ, Ñ
акеÑа)!</div>
ÐÐ¾Ð»Ð½Ð°Ñ Ð´ÐµÐ¼Ð¾Ð½ÑÑÑаÑÐ¸Ñ Ð°Ñаки:
<!DOCTYPE HTML>
<html>
<body style="margin:10px;padding:10px">
<input type="button" onclick="alert('ÐÑ Ð½Ð°Ð¶Ð°Ð»Ð¸ Like на ÑайÑе facebook.html!')" value="I LIKE IT !">
</body>
</html><!doctype html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<style>
iframe {
width: 400px;
height: 100px;
position: absolute;
top: 5px;
left: -14px;
opacity: 0.5;
z-index: 1;
}
</style>
<div>Ðажми, ÑÑÐ¾Ð±Ñ ÑазбогаÑеÑÑ:</div>
<!-- Url Ñ ÑайÑа-жеÑÑÐ²Ñ -->
<iframe src="facebook.html"></iframe>
<button>ÐажмиÑе ÑÑда!</button>
<div>...РвÑÑ Ð±ÑÐ´ÐµÑ ÑÑÐ¿ÐµÑ (Ñ Ð¼ÐµÐ½Ñ, Ñ
акеÑа)!</div>
</body>
</html>ÐдеÑÑ Ñ Ð½Ð°Ñ ÐµÑÑÑ Ð¿Ð¾Ð»ÑпÑозÑаÑнÑй <iframe src="facebook.html">, и в пÑимеÑе Ð¼Ñ Ð²Ð¸Ð´Ð¸Ð¼ его виÑÑÑим повеÑÑ
кнопки. Ðлик на ÐºÐ½Ð¾Ð¿ÐºÑ ÑакÑиÑеÑки ÐºÐ»Ð¸ÐºÐ°ÐµÑ Ð½Ð° иÑÑейм, но ÑÑого не видно полÑзоваÑелÑ, поÑÐ¾Ð¼Ñ ÑÑо иÑÑейм пÑозÑаÑнÑй.
Ð ÑезÑлÑÑаÑе, еÑли полÑзоваÑÐµÐ»Ñ Ð°Ð²ÑоÑизован на ÑайÑе Facebook («ÐапомниÑÑ Ð¼ÐµÐ½Ñ» обÑÑно акÑивиÑовано), Ñо он добавлÑÐµÑ Â«Ð»Ð°Ð¹ÐºÂ». Ð Twitter ÑÑо бÑÐ´ÐµÑ ÐºÐ½Ð¾Ð¿ÐºÐ° «ÑиÑаÑÑ», и Ñ.п.
ÐÐ¾Ñ ÑÐ¾Ñ Ð¶Ðµ пÑимеÑ, но более пÑиближеннÑй к ÑеалÑноÑÑи Ñ opacity:0 Ð´Ð»Ñ <iframe>:
<!DOCTYPE HTML>
<html>
<body style="margin:10px;padding:10px">
<input type="button" onclick="alert('ÐÑ Ð½Ð°Ð¶Ð°Ð»Ð¸ Like на ÑайÑе facebook.html!')" value="I LIKE IT !">
</body>
</html><!doctype html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<style>
iframe {
width: 400px;
height: 100px;
position: absolute;
top: 5px;
left: -14px;
opacity: 0;
z-index: 1;
}
</style>
<div>Ðажми, ÑÑÐ¾Ð±Ñ ÑазбогаÑеÑÑ:</div>
<!-- Url Ñ ÑайÑа жеÑÑÐ²Ñ -->
<iframe src="facebook.html"></iframe>
<button>ÐажмиÑе ÑÑда!</button>
<div>...Ð ÑÑ ÐºÑÑÑой (вообÑе-Ñо Ñ ÐºÑÑÑой Ñ
акеÑ)!</div>
</body>
</html>ÐÑÑ, ÑÑо нам необÑ
одимо Ð´Ð»Ñ Ð°Ñаки â ÑÑо ÑаÑположиÑÑ <iframe> на вÑедоноÑной ÑÑÑаниÑе Ñак, ÑÑÐ¾Ð±Ñ ÐºÐ½Ð¾Ð¿ÐºÐ° наÑ
одилаÑÑ Ð¿ÑÑмо над ÑÑÑлкой. Так ÑÑо полÑзоваÑелÑ, кликаÑÑий по ÑÑÑлке, на Ñамом деле бÑÐ´ÐµÑ Ð½Ð°Ð¶Ð¸Ð¼Ð°ÑÑ Ð½Ð° ÐºÐ½Ð¾Ð¿ÐºÑ Ð² <iframe>. ÐбÑÑно ÑÑо можно ÑделаÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ CSS-позиÑиониÑованиÑ.
ÐÑа аÑака ÑÑабаÑÑÐ²Ð°ÐµÑ ÑолÑко на дейÑÑÐ²Ð¸Ñ Ð¼ÑÑи (или аналогиÑнÑе, вÑоде нажаÑÐ¸Ñ Ð¿Ð°Ð»ÑÑем на мобилÑном ÑÑÑÑойÑÑве).
ÐлавиаÑÑÑнÑй ввод гоÑаздо Ñложнее пеÑенапÑавиÑÑ. Ð¢ÐµÑ Ð½Ð¸ÑеÑки, еÑли Ñ Ð½Ð°Ñ ÐµÑÑÑ ÑекÑÑовое поле Ð´Ð»Ñ Ð²Ð·Ð»Ð¾Ð¼Ð°, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ ÑаÑположиÑÑ Ð¸ÑÑейм Ñаким обÑазом, ÑÑÐ¾Ð±Ñ ÑекÑÑовÑе Ð¿Ð¾Ð»Ñ Ð¿ÐµÑекÑÑвали дÑÑг дÑÑга. Тогда поÑеÑиÑÐµÐ»Ñ Ð¿Ñи попÑÑке ÑÑокÑÑиÑоваÑÑÑÑ Ð½Ð° ÑекÑÑовом поле, коÑоÑое он Ð²Ð¸Ð´Ð¸Ñ Ð½Ð° ÑÑÑаниÑе, ÑакÑиÑеÑки бÑÐ´ÐµÑ ÑокÑÑиÑоваÑÑÑÑ Ð½Ð° ÑекÑÑовом поле внÑÑÑи иÑÑейм.
Ðо еÑÑÑ Ð¾Ð´Ð½Ð° пÑоблема. ÐÑÑ, ÑÑо поÑеÑиÑÐµÐ»Ñ Ð¿ÐµÑаÑаеÑ, бÑÐ´ÐµÑ ÑкÑÑÑо, поÑÐ¾Ð¼Ñ ÑÑо иÑÑейм не виден.
ÐбÑÑно лÑди пеÑеÑÑаÑÑ Ð¿ÐµÑаÑаÑÑ, когда не видÑÑ Ð½Ð° ÑкÑане новÑÑ Ñимволов.
ÐÑимеÑÑ Ñлабой заÑиÑÑ
СамÑм ÑÑаÑÑм ваÑианÑом заÑиÑÑ ÑвлÑеÑÑÑ ÐºÐ¾Ð´ JavaScript, запÑеÑаÑÑий оÑкÑÑÑие ÑÑÑаниÑÑ Ð²Ð¾ ÑÑейме (ÑÑо назÑваÑÑ Â«framebusting»).
ÐÑглÑÐ´Ð¸Ñ Ð¾Ð½ Ð²Ð¾Ñ Ñак:
if (top != window) {
top.location = window.location;
}
Ð ÑÑом ÑлÑÑае, еÑли окно обнаÑÑживаеÑ, ÑÑо оно оÑкÑÑÑо во ÑÑейме, оно авÑомаÑиÑеÑки ÑаÑÐ¿Ð¾Ð»Ð°Ð³Ð°ÐµÑ ÑÐµÐ±Ñ ÑвеÑÑ Ñ.
ÐÑÐ¾Ñ Ð¼ÐµÑод не ÑвлÑеÑÑÑ Ð½Ð°Ð´Ñжной заÑиÑой, поÑколÑÐºÑ Ð¿Ð¾ÑвилоÑÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑво ÑпоÑобов его обойÑи. РаÑÑмоÑÑим некоÑоÑÑе из Ð½Ð¸Ñ .
ÐлокиÑовка top-навигаÑии
ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ заблокиÑоваÑÑ Ð¿ÐµÑеÑ
од, вÑзваннÑй Ñменой top.location в обÑабоÑÑике ÑобÑÑÐ¸Ñ beforeunload.
ÐнеÑнÑÑ ÑÑÑаниÑа (пÑинадлежаÑÐ°Ñ Ñ Ð°ÐºÐµÑÑ) ÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ð¾Ð±ÑабоÑÑик на ÑÑо ÑобÑÑие, оÑменÑÑÑий его, напÑимеÑ, Ñакой:
window.onbeforeunload = function() {
return false;
};
Ðогда iframe пÑÑаеÑÑÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸ÑÑ top.location, поÑеÑиÑÐµÐ»Ñ ÑÐ²Ð¸Ð´Ð¸Ñ ÑообÑение Ñ Ð²Ð¾Ð¿ÑоÑом дейÑÑвиÑелÑно ли он Ñ
оÑÐµÑ Ð¿Ð¾ÐºÐ¸Ð½ÑÑÑ ÑÑÑ ÑÑÑаниÑÑ. РболÑÑинÑÑве ÑлÑÑаев поÑеÑиÑÐµÐ»Ñ Ð¾ÑвеÑÐ¸Ñ Ð¾ÑÑиÑаÑелÑно, поÑколÑÐºÑ Ð¾Ð½ не Ð·Ð½Ð°ÐµÑ Ð¾Ð± иÑÑейме: вÑÑ, ÑÑо он Ð²Ð¸Ð´Ð¸Ñ â ÑÑо веÑÑ
нÑÑ ÑÑÑаниÑÑ, коÑоÑÑÑ Ð½ÐµÑ Ð¿ÑиÑин покидаÑÑ. ÐоÑÑÐ¾Ð¼Ñ top.location не измениÑÑÑ!
РдейÑÑвии:
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<div>Ðамена top.location на javascript.info</div>
<script>
top.location = 'https://javascript.info';
</script>
</body>
</html><!doctype html>
<html>
<head>
<meta charset="UTF-8">
<style>
iframe {
width: 400px;
height: 100px;
position: absolute;
top: 0;
left: -20px;
opacity: 0;
z-index: 1;
}
</style>
<script>
function attack() {
window.onbeforeunload = function() {
window.onbeforeunload = null;
return false;
};
document.body.insertAdjacentHTML('beforeend', '<iframe src="iframe.html">');
}
</script>
</head>
<body>
<p>ÐоÑле клика на ÐºÐ½Ð¾Ð¿ÐºÑ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð¿Ð¾Ð»ÑÑÐ°ÐµÑ "ÑÑÑаннÑй" вопÑÐ¾Ñ Ð¾ Ñом, Ñ
оÑÐµÑ Ð»Ð¸ он покинÑÑÑ Ð´Ð°Ð½Ð½ÑÑ ÑÑÑаниÑÑ.</p>
<p>СкоÑее вÑего, он оÑвеÑÐ¸Ñ "неÑ", и заÑиÑа иÑÑейм бÑÐ´ÐµÑ Ð²Ð·Ð»Ð¾Ð¼Ð°Ð½Ð°.</p>
<button onclick="attack()">ÐобавиÑÑ "заÑиÑÑннÑй" иÑÑейм</button>
</body>
</html>ÐÑÑибÑÑ Â«sandbox»
Ðдним из дейÑÑвий, коÑоÑÑе можно огÑаниÑиÑÑ Ð°ÑÑибÑÑом sandbox, ÑвлÑеÑÑÑ Ð½Ð°Ð²Ð¸Ð³Ð°ÑиÑ. СооÑвеÑÑÑвенно иÑÑейм внÑÑÑи sandbox не Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ top.location.
ÐоÑÑÐ¾Ð¼Ñ Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ добавиÑÑ Ð¸ÑÑейм Ñ sandbox="allow-scripts allow-forms". ÐÑо ÑÐ½Ð¸Ð¼ÐµÑ Ð½ÐµÐºÐ¾ÑоÑÑе огÑаниÑениÑ, ÑазÑеÑÐ°Ñ Ð¿Ñи ÑÑом иÑполÑзование ÑкÑипÑов и ÑоÑм. Ðо Ð¼Ñ Ð¾Ð¿ÑÑкаем allow-top-navigation, ÑÑÐ¾Ð±Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ðµ top.location бÑло запÑеÑено.
ÐÐ¾Ñ ÐºÐ¾Ð´ ÑÑого пÑимеÑа:
<iframe sandbox="allow-scripts allow-forms" src="facebook.html"></iframe>
ÐÑÑÑ Ð¸ дÑÑгие ÑпоÑÐ¾Ð±Ñ Ð¾Ð±Ð¾Ð¹Ñи ÑÑÑ Ð¿ÑоÑÑÑÑ Ð·Ð°ÑиÑÑ.
Ðаголовок X-Frame-Options
Ðаголовок X-Frame-Options Ñо ÑÑоÑÐ¾Ð½Ñ ÑеÑвеÑа Ð¼Ð¾Ð¶ÐµÑ ÑазÑеÑаÑÑ Ð¸Ð»Ð¸ запÑеÑаÑÑ Ð¾ÑобÑажение ÑÑÑаниÑÑ Ð²Ð½ÑÑÑи ÑÑейма.
ÐÑо должен бÑÑÑ Ð¸Ð¼ÐµÐ½Ð½Ð¾ HTTP-заголовок: бÑаÑÐ·ÐµÑ Ð¿ÑоигноÑиÑÑÐµÑ ÐµÐ³Ð¾, еÑли найдÑÑ Ð² HTML-Ñеге <meta>. ÐоÑÑÐ¾Ð¼Ñ Ð¿Ñи <meta http-equiv="X-Frame-Options"...> ниÑего не пÑоизойдÑÑ.
Ðаголовок Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð¼ÐµÑÑ 3 знаÑениÑ:
DENY- Ðикогда не показÑваÑÑ ÑÑÑаниÑÑ Ð²Ð½ÑÑÑи ÑÑейма.
SAMEORIGIN- РазÑеÑиÑÑ Ð¾ÑкÑÑÑие ÑÑÑаниÑÑ Ð²Ð½ÑÑÑи ÑÑейма ÑолÑко в Ñом ÑлÑÑае, еÑли ÑодиÑелÑÑкий докÑÐ¼ÐµÐ½Ñ Ð¸Ð¼ÐµÐµÑ ÑÐ¾Ñ Ð¶Ðµ иÑÑоÑник.
ALLOW-FROM domain- РазÑеÑиÑÑ Ð¾ÑкÑÑÑие ÑÑÑаниÑÑ Ð²Ð½ÑÑÑи ÑÑейма ÑолÑко в Ñом ÑлÑÑае, еÑли ÑодиÑелÑÑкий докÑÐ¼ÐµÐ½Ñ Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑ Ð½Ð° Ñказанном в заголовке домене.
ÐапÑимеÑ, Twitter иÑполÑзÑÐµÑ X-Frame-Options: SAMEORIGIN.
ÐÐ¾Ñ ÑезÑлÑÑаÑ:
<iframe src="https://twitter.com"></iframe>
РзавиÑимоÑÑи Ð¾Ñ Ñого, какой бÑаÑÐ·ÐµÑ Ð²Ñ Ð¸ÑполÑзÑеÑе, iframe вÑÑе либо бÑÐ´ÐµÑ Ð¿ÑÑÑÑм, либо оповеÑÑÐ¸Ñ Ð²Ð°Ñ Ð¾ Ñом, ÑÑо его невозможно оÑобÑазиÑÑ.
ÐÑобÑажение Ñ Ð¾Ð³ÑаниÑеннÑми возможноÑÑÑми
У заголовка X-Frame-Options еÑÑÑ Ð¿Ð¾Ð±Ð¾ÑнÑй ÑÑÑекÑ. ÐÑÑгие ÑайÑÑ Ð½Ðµ ÑмогÑÑ Ð¾ÑобÑазиÑÑ Ð½Ð°ÑÑ ÑÑÑаниÑÑ Ð²Ð¾ ÑÑейме, даже еÑли Ñ Ð½Ð¸Ñ
бÑдÑÑ Ð½Ð° Ñо веÑкие пÑиÑинÑ.
Так ÑÑо еÑÑÑ Ð´ÑÑгие ÑеÑениÑ⦠ÐапÑимеÑ, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ «накÑÑÑÑ» ÑÑÑаниÑÑ Ð±Ð»Ð¾ÐºÐ¾Ð¼ <div> Ñо ÑÑилÑми height: 100%; width: 100%;, ÑÑÐ¾Ð±Ñ Ð¾Ð½ пеÑеÑ
ваÑÑвал вÑе клики. ÐÑÐ¾Ñ <div> бÑдем ÑбиÑаÑÑ, еÑли window == top или еÑли Ð¼Ñ Ð¿Ð¾Ð¹Ð¼Ñм, ÑÑо заÑиÑа нам не нÑжна.
ÐÑимеÑно Ñак:
<style>
#protector {
height: 100%;
width: 100%;
position: absolute;
left: 0;
top: 0;
z-index: 99999999;
}
</style>
<div id="protector">
<a href="/" target="_blank">ÐеÑейÑи к ÑайÑÑ</a>
</div>
<script>
// ÐдеÑÑ Ð±ÑÐ´ÐµÑ Ð¾ÑобÑажаÑÑÑÑ Ð¾Ñибка, еÑли веÑÑ
нее окно Ð¸Ð¼ÐµÐµÑ Ð´ÑÑгое пÑоиÑÑ
ождение
// а здеÑÑ Ð±ÑÐ´ÐµÑ ÐºÐ¾Ð´, еÑли вÑÑ Ð² поÑÑдке
if (top.document.domain == document.domain) {
protector.remove();
}
</script>
ÐемонÑÑÑаÑиÑ:
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<style>
#protector {
height: 100%;
width: 100%;
position: absolute;
left: 0;
top: 0;
z-index: 99999999;
}
</style>
</head>
<body>
<div id="protector">
<a href="/" target="_blank">ÐеÑейÑи к ÑайÑÑ</a>
</div>
<script>
if (top.document.domain == document.domain) {
protector.remove();
}
</script>
ÐÑÐ¾Ñ ÑекÑÑ Ð²Ñегда виден.
Ðо еÑли ÑÑÑаниÑа бÑла оÑкÑÑÑа внÑÑÑи докÑменÑа, пÑинадлежаÑего дÑÑÐ³Ð¾Ð¼Ñ Ð´Ð¾Ð¼ÐµÐ½Ñ, div повеÑÑ
Ð½ÐµÑ Ð¿ÑедоÑвÑаÑÐ¸Ñ Ð»ÑбÑе дейÑÑвиÑ.
<button onclick="alert(1)">Рданном ÑлÑÑае клик не ÑÑабоÑаеÑ</button>
</body>
</html><!doctype html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<iframe src="iframe.html"></iframe>
</body>
</html>ÐÑÑибÑÑ cookie: samesite
ÐÑÑибÑÑ samesite Ñакже Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð¼Ð¾ÑÑ Ð¸Ð·Ð±ÐµÐ¶Ð°ÑÑ clickjacking-аÑаки.
Файл кÑки Ñ Ñаким аÑÑибÑÑом оÑпÑавлÑеÑÑÑ Ð½Ð° ÑÐ°Ð¹Ñ ÑолÑко в Ñом ÑлÑÑае, еÑли он оÑкÑÑÑ Ð½Ð°Ð¿ÑÑмÑÑ, не ÑеÑез ÑÑейм или каким-либо дÑÑгим ÑпоÑобом. ÐодÑобно об ÑÑом â в главе ÐÑки, document.cookie.
ÐÑли ÑайÑ, Ñакой как Facebook, пÑи ÑÑÑановке авÑоÑизÑÑÑего кÑки ÑÑÐ°Ð²Ð¸Ñ Ð°ÑÑибÑÑ samesite:
Set-Cookie: authorization=secret; samesite
⦠Тогда Ñакие кÑки не бÑдÑÑ Ð¾ÑпÑавлÑÑÑÑÑ, когда Facebook бÑÐ´ÐµÑ Ð¾ÑкÑÑÑ Ð² иÑÑейме Ñ Ð´ÑÑгого ÑайÑа. Так ÑÑо аÑака не ÑдаÑÑÑÑ.
ÐÑÑибÑÑ samesite не игÑÐ°ÐµÑ Ð½Ð¸ÐºÐ°ÐºÐ¾Ð¹ Ñоли, еÑли кÑки не иÑполÑзÑÑÑÑÑ. Так ÑÑо дÑÑгие веб-ÑайÑÑ ÑмогÑÑ Ð¾ÑобÑажаÑÑ Ð¿ÑблиÑнÑе, не ÑÑебÑÑÑие авÑоÑизаÑии, ÑÑÑаниÑÑ Ð² иÑÑейме.
Ðднако, ÑÑо даÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð² некоÑоÑÑÑ ÑиÑÑаÑиÑÑ Ð¾ÑÑÑеÑÑвиÑÑ clickjacking-аÑакÑ, напÑимеÑ, на ÑÐ°Ð¹Ñ Ð´Ð»Ñ Ð°Ð½Ð¾Ð½Ð¸Ð¼Ð½ÑÑ Ð¾Ð¿ÑоÑов, коÑоÑÑй пÑедоÑвÑаÑÐ°ÐµÑ Ð¿Ð¾Ð²ÑоÑное голоÑование полÑзоваÑÐµÐ»Ñ Ð¿ÑÑÑм пÑовеÑки IP-адÑеÑа. Ðн оÑÑанеÑÑÑ ÑÑзвимÑм к аÑаке, поÑÐ¾Ð¼Ñ ÑÑо не аÑÑенÑиÑиÑиÑÑÐµÑ Ð¿Ð¾Ð»ÑзоваÑелей Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÑки.
ÐÑого
ÐÑака Ñlickjacking â ÑÑо ÑпоÑоб Ñ Ð¸ÑÑоÑÑÑÑ Â«Ð·Ð°ÑÑавиÑÑ» полÑзоваÑелей кликнÑÑÑ Ð½Ð° ÑайÑе-жеÑÑве, без пониманиÑ, ÑÑо пÑоиÑÑ Ð¾Ð´Ð¸Ñ. Ðна опаÑна, еÑли по ÐºÐ»Ð¸ÐºÑ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ Ð¿ÑÐ¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ñ Ð²Ð°Ð¶Ð½Ñе дейÑÑвиÑ.
Ð¥Ð°ÐºÐµÑ Ð¼Ð¾Ð¶ÐµÑ ÑазмеÑÑиÑÑ ÑÑÑÐ»ÐºÑ Ð½Ð° ÑÐ²Ð¾Ñ Ð²ÑедоноÑнÑÑ ÑÑÑаниÑÑ Ð² ÑообÑении или найÑи дÑÑгие ÑпоÑобÑ, как заманиÑÑ Ð¿Ð¾Ð»ÑзоваÑелей. ÐаÑианÑов множеÑÑво.
С одной ÑÑоÑÐ¾Ð½Ñ â ÑÑа аÑака «неглÑбокаÑ», Ð²ÐµÐ´Ñ Ñ Ð°ÐºÐµÑ Ð¿ÐµÑÐµÑ Ð²Ð°ÑÑÐ²Ð°ÐµÑ ÑолÑко один клик. Ðо Ñ Ð´ÑÑгой ÑÑоÑонÑ, еÑли Ñ Ð°ÐºÐµÑ Ð·Ð½Ð°ÐµÑ, ÑÑо поÑле ÑÑого клика поÑвÑÑÑÑ Ð´ÑÑгие ÑлеменÑÑ ÑпÑавлениÑ, Ñо он Ð¼Ð¾Ð¶ÐµÑ Ñ Ð¸ÑÑоÑÑÑÑ Ð·Ð°ÑÑавиÑÑ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ ÐºÐ»Ð¸ÐºÐ½ÑÑÑ Ð½Ð° Ð½Ð¸Ñ .
ÐÑÐ¾Ñ Ð²Ð¸Ð´ аÑаки доволÑно опаÑен, Ð²ÐµÐ´Ñ Ð¿Ñи ÑазÑабоÑке инÑеÑÑейÑов Ð¼Ñ Ð½Ðµ пÑедполагаем, ÑÑо Ñ Ð°ÐºÐµÑ Ð¼Ð¾Ð¶ÐµÑ ÐºÐ»Ð¸ÐºÐ½ÑÑÑ Ð¾Ñ Ð¸Ð¼ÐµÐ½Ð¸ полÑзоваÑелÑ. ÐоÑÑÐ¾Ð¼Ñ ÑÑзвимоÑÑи могÑÑ Ð±ÑÑÑ Ð¾Ð±Ð½Ð°ÑÑÐ¶ÐµÐ½Ñ Ð² ÑовеÑÑенно неожиданнÑÑ Ð¼ÐµÑÑÐ°Ñ .
- ÐÐ»Ñ Ð·Ð°ÑиÑÑ Ð¾Ñ ÑÑой аÑаки ÑекомендÑеÑÑÑ Ð¸ÑполÑзоваÑÑ
X-Frame-Options: SAMEORIGINна ÑÑÑаниÑÐ°Ñ Ð¸Ð»Ð¸ даже Ñеликом ÑайÑÐ°Ñ , коÑоÑÑе не пÑедназнаÑÐµÐ½Ñ Ð´Ð»Ñ Ð¿ÑоÑмоÑÑа во ÑÑейме. - Ðли, еÑли Ð¼Ñ Ñ
оÑим ÑазÑеÑиÑÑ Ð¾ÑобÑажение ÑÑÑаниÑÑ Ð²Ð¾ ÑÑейме и пÑи ÑÑом оÑÑаваÑÑÑÑ Ð² безопаÑноÑÑи, Ñо можно иÑполÑзоваÑÑ Ð¿ÐµÑекÑÑваÑÑий блок
<div>.
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)