SameSite
属性を設定できません。SameSite
パラメーターは、リクエストがファーストパーティまたは同じサイトのコンテキストから生成された場合にのみリクエストに追加するよう cookie の範囲を制限します。これは、Cross-Site Request Forgery (CSRF) 攻撃から cookie を保護するのに役立ちます。SameSite
パラメーターの値は、次の 3 つのうちのいずれかになります。Strict
に設定した場合、cookie はトップレベル ナビゲーションのリクエストとともにのみ送信されます。Lax
に設定した場合、cookie は、同じホストからのトップレベル ナビゲーションだけでなく、サードパーティ サイトからホストへの GET リクエストとともに送信されます。たとえば、ホスト サイトにリンクする、iframe
タグか href
タグを持つサードパーティ サイトがあるとします。ユーザーがリンクをたどると、リクエストには cookie が含まれます。SameSite
属性を None
に設定しています。
...
Cookie cookie = new Cookie('name', 'Foo', path, -1, true, 'None');
...
SameSite
属性の設定に失敗します。SameSite
属性は、リクエストがファーストパーティまたは同じサイトのコンテキストから生成された場合にのみリクエストに追加するよう cookie の範囲を制限します。これは、Cross-Site Request Forgery (CSRF) 攻撃から cookie を保護するのに役立ちます。SameSite
属性の値は、次の 3 つのうちのいずれかになります。Strict
に設定した場合、cookie はトップレベル ナビゲーションのリクエストとともにのみ送信されます。Lax
に設定した場合、Cookie は、同じホストからのトップレベル ナビゲーションだけでなく、サードパーティ サイトからの GET リクエスト (ホスト サイトにリンクする iframe
タグまたは href
タグを持つリクエストを含む) とともに送信されます。ユーザーがリンクをたどると、リクエストには cookie が含まれます。SameSite
属性を無効にしています。
...
CookieOptions opt = new CookieOptions()
{
SameSite = SameSiteMode.None;
};
context.Response.Cookies.Append("name", "Foo", opt);
...
SameSite
属性の設定に失敗します。SameSite
属性は、リクエストがファーストパーティまたは同じサイトのコンテキストから生成された場合にのみリクエストに追加するよう Cookie の範囲を制限します。これは、Cross-Site Request Forgery (CSRF) 攻撃から cookie を保護するのに役立ちます。SameSite
属性の値は、次の 3 つのうちのいずれかになります。Strict
に設定した場合、cookie はトップレベル ナビゲーションのリクエストとともにのみ送信されます。Lax
に設定した場合、cookie は、同じホストからのトップレベル ナビゲーションだけでなく、サードパーティ サイトからホストへの GET リクエストとともに送信されます。たとえば、ホスト サイトにリンクする、iframe
タグか href
タグを持つサードパーティ サイトがあるとします。ユーザーがリンクをたどると、リクエストには cookie が含まれます。SameSite
属性を無効にしています。
c := &http.Cookie{
Name: "cookie",
Value: "samesite-none",
SameSite: http.SameSiteNoneMode,
}
SameSite
属性の設定に失敗します。SameSite
属性は、リクエストがファーストパーティまたは同じサイトのコンテキストから生成された場合にのみリクエストに追加するよう Cookie の範囲を制限します。これは、Cross-Site Request Forgery (CSRF) 攻撃から cookie を保護するのに役立ちます。SameSite
属性の値は、次の 3 つのうちのいずれかになります。Strict
に設定した場合、cookie はトップレベル ナビゲーションのリクエストとともにのみ送信されます。Lax
に設定した場合、Cookie は、同じホストからのトップレベル ナビゲーションだけでなく、サードパーティ サイトからの GET リクエスト (ホスト サイトにリンクする iframe
タグまたは href
タグを持つリクエストを含む) とともに送信されます。たとえば、ホスト サイトにリンクする、iframe
タグか href
タグを持つサードパーティ サイトがあるとします。ユーザーがリンクをたどると、リクエストには cookie が含まれます。SameSite
属性を無効にしています。
ResponseCookie cookie = ResponseCookie.from("myCookie", "myCookieValue")
...
.sameSite("None")
...
SameSite
属性の設定に失敗します。SameSite
属性は、リクエストがファーストパーティまたは同じサイトのコンテキストから生成された場合にのみリクエストに追加するよう Cookie の範囲を制限します。これは、Cross-Site Request Forgery (CSRF) 攻撃から cookie を保護するのに役立ちます。SameSite
属性の値は、次の 3 つのうちのいずれかになります。Strict
に設定した場合、cookie はトップレベル ナビゲーションのリクエストとともにのみ送信されます。Lax
に設定した場合、Cookie は、同じホストからのトップレベル ナビゲーションだけでなく、サードパーティ サイトからの GET リクエスト (ホスト サイトにリンクする iframe
タグまたは href
タグを持つリクエストを含む) とともに送信されます。たとえば、ホスト サイトにリンクする、iframe
タグか href
タグを持つサードパーティ サイトがあるとします。ユーザーがリンクをたどると、リクエストには cookie が含まれます。SameSite
属性を無効にしています。
app.get('/', function (req, res) {
...
res.cookie('name', 'Foo', { sameSite: false });
...
}
SameSite
属性の設定に失敗します。SameSite
属性は、リクエストがファーストパーティまたは同じサイトのコンテキストから生成された場合にのみリクエストに追加するよう cookie の範囲を制限します。これは、クロスサイト リクエスト フォージェリ (CSRF) 攻撃から cookie を保護するのに役立ちます。SameSite
属性の値は、次の 3 つのうちのいずれかになります。Strict
に設定した場合、cookie はトップレベル ナビゲーションのリクエストとともにのみ送信されます。Lax
に設定した場合、cookie は、同じホストからのトップレベル ナビゲーションだけでなく、サードパーティ サイトからホストへの GET リクエストとともに送信されます。たとえば、ホスト サイトにリンクする、iframe
タグか href
タグを持つサードパーティ サイトがあるとします。ユーザーがリンクをたどると、リクエストには cookie が含まれます。SameSite
属性を無効にしています。
ini_set("session.cookie_samesite", "None");
SameSite
属性の設定に失敗します。samesite
パラメーターは、リクエストがファーストパーティまたは同じサイトのコンテキストから生成された場合にのみリクエストに追加するよう Cookie の範囲を制限します。これは、Cross-Site Request Forgery (CSRF) 攻撃から cookie を保護するのに役立ちます。samesite
パラメーターの値は、次の 3 つのうちのいずれかになります。Strict
に設定した場合、cookie はトップレベル ナビゲーションのリクエストとともにのみ送信されます。Lax
に設定した場合、cookie は、同じホストからのトップレベル ナビゲーションだけでなく、サードパーティ サイトからホストへの GET リクエストとともに送信されます。たとえば、ホスト サイトにリンクする、iframe
タグか href
タグを持つサードパーティ サイトがあるとします。ユーザーがリンクをたどると、リクエストには cookie が含まれます。SameSite
属性を無効にしています。
response.set_cookie("cookie", value="samesite-none", samesite=None)
.example.com
" などのベース ドメインにわたってアクティブになるように cookie を設定する傾向にあります。 この方法では同じベースドメインおよびサブドメイン上にあるすべての Web アプリケーションがその cookie にアクセスできてしまいます。 cookie にはセッション ID などの重要な情報が保存されていることが多いため、アプリケーション間で cookie を共有すると、1 個のアプリケーションの脆弱性が別のアプリケーションに影響を及ぼす可能性があります。http://secure.example.com/
に安全なアプリケーションを配置していると考えてみましょう。このアプリケーションでは、ユーザーがログインすると、ドメインが「.example.com
」であるセッション ID の cookie が設定されます。
HttpCookie cookie = new HttpCookie("sessionID", sessionID);
cookie.Domain = ".example.com";
http://insecure.example.com/
に配置されていて、このアプリケーションにクロスサイト スクリプティングの脆弱性が存在するとします。 http://secure.example.com
に認証されているユーザーが http://insecure.example.com
にアクセスすると、http://secure.example.com
から送信されるセッション cookie が漏洩する可能性があります。insecure.example.com
を使用してパスが広範にわたる cookie を独自に作成し、secure.example.com
から送信される cookie を上書きします。.example.com
" などのベース ドメインにわたってアクティブになるように cookie を設定する傾向にあります。この方法では同じベースドメインおよびサブドメイン上にあるすべての Web アプリケーションがその cookie にアクセスできてしまいます。cookie にはセッション ID などの重要な情報が保存されていることが多いため、アプリケーション間で cookie を共有すると、1 個のアプリケーションの脆弱性が別のアプリケーションに影響を及ぼす可能性があります。http://secure.example.com/
に安全なアプリケーションを配置していると考えてみましょう。このアプリケーションでは、ユーザーがログインすると、ドメインが「.example.com
」であるセッション ID の cookie が設定されます。
cookie := http.Cookie{
Name: "sessionID",
Value: getSessionID(),
Domain: ".example.com",
}
...
http://insecure.example.com/
に配置されていて、このアプリケーションにクロスサイト スクリプティングの脆弱性が存在するとします。http://secure.example.com
に認証されているユーザーが http://insecure.example.com
にアクセスすると、http://secure.example.com
から送信されるセッション cookie が漏洩する可能性があります。insecure.example.com
を使用して、パスがあまりに広範にわたっている cookie を独自に作成し、Secure.example.com
からの cookie を上書きします。.example.com
" などのベース ドメインにわたってアクティブになるように cookie を設定する傾向にあります。 この方法では同じベースドメインおよびサブドメイン上にあるすべての Web アプリケーションがその cookie にアクセスできてしまいます。 cookie にはセッション ID などの重要な情報が保存されていることが多いため、アプリケーション間で cookie を共有すると、1 個のアプリケーションの脆弱性が別のアプリケーションに影響を及ぼす可能性があります。http://secure.example.com/
に安全なアプリケーションを配置していると考えてみましょう。このアプリケーションでは、ユーザーがログインすると、ドメインが「.example.com
」であるセッション ID の cookie が設定されます。
Cookie cookie = new Cookie("sessionID", sessionID);
cookie.setDomain(".example.com");
http://insecure.example.com/
に配置されていて、このアプリケーションに Cross-Site Scripting の脆弱性が存在するとします。http://secure.example.com
に認証されているユーザーが http://insecure.example.com
にアクセスすると、http://secure.example.com
から送信されるセッション cookie が漏洩する可能性があります。insecure.example.com
を使用してパスが広範にわたる cookie を独自に作成し、secure.example.com
から送信される cookie を上書きします。.example.com
" などのベース ドメインにわたってアクティブになるように cookie を設定する傾向にあります。 この方法では同じベースドメインおよびサブドメイン上にあるすべての Web アプリケーションがその cookie にアクセスできてしまいます。 cookie にはセッション ID などの重要な情報が保存されていることが多いため、アプリケーション間で cookie を共有すると、1 個のアプリケーションの脆弱性が別のアプリケーションに影響を及ぼす可能性があります。http://secure.example.com/
に安全なアプリケーションを配置していると考えてみましょう。このアプリケーションでは、ユーザーがログインすると、ドメインが「.example.com
」であるセッション ID の cookie が設定されます。
cookie_options = {};
cookie_options.domain = '.example.com';
...
res.cookie('important_cookie', info, cookie_options);
http://insecure.example.com/
に配置されていて、このアプリケーションに Cross-Site Scripting の脆弱性が存在するとします。http://secure.example.com
に認証されているユーザーが http://insecure.example.com
にアクセスすると、http://secure.example.com
から送信されるセッション cookie が漏洩する可能性があります。insecure.example.com
を使用してパスが広範にわたる cookie を独自に作成し、secure.example.com
から送信される cookie を上書きします。.example.com
" などのベース ドメインにわたってアクティブになるように cookie を設定する傾向にあります。 この方法では同じベースドメインおよびサブドメイン上にあるすべての Web アプリケーションがその cookie にアクセスできてしまいます。 cookie にはセッション ID などの重要な情報が保存されていることが多いため、アプリケーション間で cookie を共有すると、1 個のアプリケーションの脆弱性が別のアプリケーションに影響を及ぼす可能性があります。http://secure.example.com/
に安全なアプリケーションを配置していると考えてみましょう。このアプリケーションでは、ユーザーがログインすると、ドメインが「.example.com
」であるセッション ID の cookie が設定されます。
...
NSDictionary *cookieProperties = [NSDictionary dictionary];
...
[cookieProperties setValue:@".example.com" forKey:NSHTTPCookieDomain];
...
NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:cookieProperties];
...
http://insecure.example.com/
に配置されていて、このアプリケーションに Cross-Site Scripting の脆弱性が存在するとします。http://secure.example.com
に認証されているユーザーが http://insecure.example.com
にアクセスすると、http://secure.example.com
から送信されるセッション cookie が漏洩する可能性があります。insecure.example.com
を使用してパスが広範にわたる cookie を独自に作成し、secure.example.com
から送信される cookie を上書きします。.example.com
" などのベース ドメインにわたってアクティブになるように cookie を設定する傾向にあります。 この方法では同じベースドメインおよびサブドメイン上にあるすべての Web アプリケーションがその cookie にアクセスできてしまいます。 cookie にはセッション ID などの重要な情報が保存されていることが多いため、アプリケーション間で cookie を共有すると、1 個のアプリケーションの脆弱性が別のアプリケーションに影響を及ぼす可能性があります。http://secure.example.com/
に安全なアプリケーションを配置していると考えてみましょう。このアプリケーションでは、ユーザーがログインすると、ドメインが「.example.com
」であるセッション ID の cookie が設定されます。
setcookie("mySessionId", getSessionID(), 0, "/", ".example.com", true, true);
http://insecure.example.com/
に配置されていて、このアプリケーションに Cross-Site Scripting の脆弱性が存在するとします。http://secure.example.com
に認証されているユーザーが http://insecure.example.com
にアクセスすると、http://secure.example.com
から送信されるセッション cookie が漏洩する可能性があります。insecure.example.com
を使用してパスが広範にわたる cookie を独自に作成し、secure.example.com
から送信される cookie を上書きします。.example.com
" などのベース ドメインにわたってアクティブになるように cookie を設定する傾向にあります。 この方法では同じベースドメインおよびサブドメイン上にあるすべての Web アプリケーションがその cookie にアクセスできてしまいます。 cookie にはセッション ID などの重要な情報が保存されていることが多いため、アプリケーション間で cookie を共有すると、1 個のアプリケーションの脆弱性が別のアプリケーションに影響を及ぼす可能性があります。http://secure.example.com/
に安全なアプリケーションを配置していると考えてみましょう。このアプリケーションでは、ユーザーがログインすると、ドメインが「.example.com
」であるセッション ID の cookie が設定されます。
from django.http.response import HttpResponse
...
def view_method(request):
res = HttpResponse()
res.set_cookie("mySessionId", getSessionID(), domain=".example.com")
return res
...
http://insecure.example.com/
に配置されていて、このアプリケーションに Cross-Site Scripting の脆弱性が存在するとします。http://secure.example.com
に認証されているユーザーが http://insecure.example.com
にアクセスすると、http://secure.example.com
から送信されるセッション cookie が漏洩する可能性があります。insecure.example.com
を使用してパスが広範にわたる cookie を独自に作成し、secure.example.com
から送信される cookie を上書きします。.example.com
" などのベース ドメインにわたってアクティブになるように cookie を設定する傾向にあります。 この方法では同じベースドメインおよびサブドメイン上にあるすべての Web アプリケーションがその cookie にアクセスできてしまいます。 cookie にはセッション ID などの重要な情報が保存されていることが多いため、アプリケーション間で cookie を共有すると、1 個のアプリケーションの脆弱性が別のアプリケーションに影響を及ぼす可能性があります。http://secure.example.com/
に安全なアプリケーションを配置していると考えてみましょう。このアプリケーションでは、ユーザーがログインすると、ドメインが「.example.com
」であるセッション ID の cookie が設定されます。
Ok(Html(command)).withCookies(Cookie("sessionID", sessionID, domain = Some(".example.com")))
http://insecure.example.com/
に配置されていて、このアプリケーションにCross-site Scriptingの脆弱性が存在するとします。 http://secure.example.com
に認証されているユーザーが http://insecure.example.com
にアクセスすると、http://secure.example.com
から送信されるセッション cookie が漏洩する可能性があります。insecure.example.com
を使用してパスが広範にわたる cookie を独自に作成し、secure.example.com
から送信される cookie を上書きします。.example.com
" などのベース ドメインにわたってアクティブになるように cookie を設定する傾向にあります。 この方法では同じベースドメインおよびサブドメイン上にあるすべての Web アプリケーションがその cookie にアクセスできてしまいます。 cookie にはセッション ID などの重要な情報が保存されていることが多いため、アプリケーション間で cookie を共有すると、1 個のアプリケーションの脆弱性が別のアプリケーションに影響を及ぼす可能性があります。http://secure.example.com/
に安全なアプリケーションを配置していると考えてみましょう。このアプリケーションでは、ユーザーがログインすると、ドメインが「.example.com
」であるセッション ID の cookie が設定されます。
...
let properties = [
NSHTTPCookieDomain: ".example.com",
NSHTTPCookiePath: "/service",
NSHTTPCookieName: "foo",
NSHTTPCookieValue: "bar",
NSHTTPCookieSecure: true
]
let cookie : NSHTTPCookie? = NSHTTPCookie(properties:properties)
...
http://insecure.example.com/
に配置されていて、このアプリケーションに Cross-Site Scripting の脆弱性が存在するとします。http://secure.example.com
に認証されているユーザーが http://insecure.example.com
にアクセスすると、http://secure.example.com
から送信されるセッション cookie が漏洩する可能性があります。insecure.example.com
を使用してパスが広範にわたる cookie を独自に作成し、secure.example.com
から送信される cookie を上書きします。/
") からアクセスできるように設定する傾向にあります。この方法ではドメイン名を同じくするすべての Web アプリケーションがその cookie にアクセスできてしまいます。cookie にはセッション ID などの重要な情報が保存されていることが多いため、アプリケーション間で cookie を共有すると、1 個のアプリケーションの脆弱性が別のアプリケーションに影響を及ぼす可能性があります。http://communitypages.example.com/MyForum
にフォーラム アプリケーションを配置している例を考えてみましょう。このアプリケーションでは、ユーザーがフォーラムにログインすると、"/
" というパスを持つセッション ID の cookie が設定されます。例:
...
String path = '/';
Cookie cookie = new Cookie('sessionID', sessionID, path, maxAge, true, 'Strict');
...
http://communitypages.example.com/EvilSite
に別のアプリケーションを作成し、このサイトへのリンクをフォーラムに掲載したとします。フォーラムのユーザーがこのリンクをクリックすると、ユーザーのブラウザーは /MyForum
によって設定された cookie を /EvilSite
で実行されているアプリケーションに送信することになります。攻撃者はセッション ID を盗むことにより、/EvilSite
にアクセスしたフォーラム ユーザーのアカウントであれば、危険にさらされることがあります。/EvilSite
を使用してパスが広範にわたる cookie を独自に作成し、/MyForum
から送信される cookie を上書きします。/
」に設定する傾向にありますが、この方法では同じドメイン上のすべての Web アプリケーションがその cookie にアクセスできてしまいます。cookie にはセッション ID などの重要な情報が保存されていることが多いため、アプリケーション間で cookie を共有すると、1 個のアプリケーションの脆弱性が別のアプリケーションに影響を及ぼす可能性があります。http://communitypages.example.com/MyForum
にフォーラム アプリケーションを配置している例を考えてみましょう。このアプリケーションでは、ユーザーがフォーラムにログインすると、"/
" というパスを持つセッション ID の cookie が設定されます。
HttpCookie cookie = new HttpCookie("sessionID", sessionID);
cookie.Path = "/";
http://communitypages.example.com/EvilSite
に別のアプリケーションを作成し、このサイトへのリンクをフォーラムに掲載したとします。 フォーラムのユーザーがこのリンクをクリックすると、ユーザーのブラウザーは /MyForum
によって設定された cookie を /EvilSite
で実行されているアプリケーションに送信することになります。 攻撃者はセッション ID を盗むことにより、/EvilSite
にアクセスした任意のフォーラム ユーザーのアカウントを乗っ取ることができます。/EvilSite
を使用してパスが広範にわたる cookie を独自に作成し、/MyForum
から送信される cookie を上書きします。/
") からアクセスできるように設定する傾向にあります。この方法ではドメイン名を同じくするすべての Web アプリケーションがその cookie にアクセスできてしまいます。cookie にはセッション ID などの重要な情報が保存されていることが多いため、アプリケーション間で cookie を共有すると、1 個のアプリケーションの脆弱性が別のアプリケーションに影響を及ぼす可能性があります。http://communitypages.example.com/MyForum
にフォーラム アプリケーションを配置していると考えてみましょう。このアプリケーションでは、ユーザーがフォーラムにログインすると、「/
」というパスを持つセッション ID の cookie が設定されます。
cookie := http.Cookie{
Name: "sessionID",
Value: sID,
Expires: time.Now().AddDate(0, 0, 1),
Path: "/",
}
...
http://communitypages.example.com/EvilSite
に別のアプリケーションを作成し、このサイトへのリンクをフォーラムに掲載したとします。フォーラム ユーザーがこのリンクをクリックすると、ユーザーのブラウザーは /MyForum
によって設定された cookie を /EvilSite
で実行されているアプリケーションへ送信します。攻撃者はセッション ID を盗むことにより、/EvilSite
にアクセスしたフォーラム ユーザーのアカウントであれば、危険にさらされることがあります。/EvilSite
を使用して、パスがあまりに広範にわたっている cookie を独自に作成し、/MyForum
からの cookie を上書きします。/
") からアクセスできるように設定する傾向にあります。 この方法ではドメイン名を同じくするすべての Web アプリケーションがその cookie にアクセスできてしまいます。 cookie にはセッション ID などの重要な情報が保存されていることが多いため、アプリケーション間で cookie を共有すると、1 個のアプリケーションの脆弱性が別のアプリケーションに影響を及ぼす可能性があります。http://communitypages.example.com/MyForum
にフォーラム アプリケーションを配置している例を考えてみましょう。このアプリケーションでは、ユーザーがフォーラムにログインすると、"/
" というパスを持つセッション ID の cookie が設定されます。
Cookie cookie = new Cookie("sessionID", sessionID);
cookie.setPath("/");
http://communitypages.example.com/EvilSite
に別のアプリケーションを作成し、このサイトへのリンクをフォーラムに掲載したとします。 フォーラムのユーザーがこのリンクをクリックすると、ユーザーのブラウザーは /MyForum
によって設定された cookie を /EvilSite
で実行されているアプリケーションに送信することになります。 攻撃者はセッション ID を盗むことにより、/EvilSite
にアクセスした任意のフォーラム ユーザーのアカウントを乗っ取ることができます。/EvilSite
を使用してパスが広範にわたる cookie を独自に作成し、/MyForum
から送信される cookie を上書きします。/
") からアクセスできるように設定する傾向にあります。 この方法ではドメイン名を同じくするすべての Web アプリケーションがその cookie にアクセスできてしまいます。 cookie にはセッション ID などの重要な情報が保存されていることが多いため、アプリケーション間で cookie を共有すると、1 個のアプリケーションの脆弱性が別のアプリケーションに影響を及ぼす可能性があります。http://communitypages.example.com/MyForum
にフォーラム アプリケーションを配置している例を考えてみましょう。このアプリケーションでは、ユーザーがフォーラムにログインすると、"/
" というパスを持つセッション ID の cookie が設定されます。
cookie_options = {};
cookie_options.path = '/';
...
res.cookie('important_cookie', info, cookie_options);
http://communitypages.example.com/EvilSite
に別のアプリケーションを作成し、このサイトへのリンクをフォーラムに掲載したとします。 フォーラムのユーザーがこのリンクをクリックすると、ユーザーのブラウザーは /MyForum
によって設定された cookie を /EvilSite
で実行されているアプリケーションに送信することになります。 攻撃者はセッション ID を盗むことにより、/EvilSite
にアクセスした任意のフォーラム ユーザーのアカウントを乗っ取ることができます。/EvilSite
を使用してパスが広範にわたる cookie を独自に作成し、/MyForum
から送信される cookie を上書きします。/
") からアクセスできるように設定する傾向にあります。 この方法ではドメイン名を同じくするすべての Web アプリケーションがその cookie にアクセスできてしまいます。 cookie にはセッション ID などの重要な情報が保存されていることが多いため、アプリケーション間で cookie を共有すると、1 個のアプリケーションの脆弱性が別のアプリケーションに影響を及ぼす可能性があります。http://communitypages.example.com/MyForum
にフォーラム アプリケーションを配置している例を考えてみましょう。このアプリケーションでは、ユーザーがフォーラムにログインすると、"/
" というパスを持つセッション ID の cookie が設定されます。
...
NSDictionary *cookieProperties = [NSDictionary dictionary];
...
[cookieProperties setValue:@"/" forKey:NSHTTPCookiePath];
...
NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:cookieProperties];
...
http://communitypages.example.com/EvilSite
に別のアプリケーションを作成し、このサイトへのリンクをフォーラムに掲載したとします。 フォーラムのユーザーがこのリンクをクリックすると、ユーザーのブラウザーは /MyForum
によって設定された cookie を /EvilSite
で実行されているアプリケーションに送信することになります。 攻撃者はセッション ID を盗むことにより、/EvilSite
にアクセスした任意のフォーラム ユーザーのアカウントを乗っ取ることができます。/EvilSite
を使用してパスが広範にわたる cookie を独自に作成し、/MyForum
から送信される cookie を上書きします。/
") からアクセスできるように設定する傾向にあります。 この方法ではドメイン名を同じくするすべての Web アプリケーションがその cookie にアクセスできてしまいます。 cookie にはセッション ID などの重要な情報が保存されていることが多いため、アプリケーション間で cookie を共有すると、1 個のアプリケーションの脆弱性が別のアプリケーションに影響を及ぼす可能性があります。http://communitypages.example.com/MyForum
にフォーラム アプリケーションを配置している例を考えてみましょう。このアプリケーションでは、ユーザーがフォーラムにログインすると、"/
" というパスを持つセッション ID の cookie が設定されます。
setcookie("mySessionId", getSessionID(), 0, "/", "communitypages.example.com", true, true);
http://communitypages.example.com/EvilSite
に別のアプリケーションを作成し、このサイトへのリンクをフォーラムに掲載したとします。 フォーラムのユーザーがこのリンクをクリックすると、ユーザーのブラウザーは /MyForum
によって設定された cookie を /EvilSite
で実行されているアプリケーションに送信することになります。 攻撃者はセッション ID を盗むことにより、/EvilSite
にアクセスした任意のフォーラム ユーザーのアカウントを乗っ取ることができます。/EvilSite
を使用してパスが広範にわたる cookie を独自に作成し、/MyForum
から送信される cookie を上書きします。/
") からアクセスできるように設定する傾向にあります。 この方法ではドメイン名を同じくするすべての Web アプリケーションがその cookie にアクセスできてしまいます。 cookie にはセッション ID などの重要な情報が保存されていることが多いため、アプリケーション間で cookie を共有すると、1 個のアプリケーションの脆弱性が別のアプリケーションに影響を及ぼす可能性があります。http://communitypages.example.com/MyForum
にフォーラム アプリケーションを配置している例を考えてみましょう。このアプリケーションでは、ユーザーがフォーラムにログインすると、"/
" というパスを持つセッション ID の cookie が設定されます。
from django.http.response import HttpResponse
...
def view_method(request):
res = HttpResponse()
res.set_cookie("sessionid", value) # Path defaults to "/"
return res
...
http://communitypages.example.com/EvilSite
に別のアプリケーションを作成し、このサイトへのリンクをフォーラムに掲載したとします。 フォーラムのユーザーがこのリンクをクリックすると、ユーザーのブラウザーは /MyForum
によって設定された cookie を /EvilSite
で実行されているアプリケーションに送信することになります。 攻撃者はセッション ID を盗むことにより、/EvilSite
にアクセスした任意のフォーラム ユーザーのアカウントを乗っ取ることができます。/EvilSite
を使用してパスが広範にわたる cookie を独自に作成し、/MyForum
から送信される cookie を上書きします。/
") からアクセスできるように設定する傾向にあります。 この方法ではドメイン名を同じくするすべての Web アプリケーションがその cookie にアクセスできてしまいます。 cookie にはセッション ID などの重要な情報が保存されていることが多いため、アプリケーション間で cookie を共有すると、1 個のアプリケーションの脆弱性が別のアプリケーションに影響を及ぼす可能性があります。http://communitypages.example.com/MyForum
にフォーラム アプリケーションを配置している例を考えてみましょう。このアプリケーションでは、ユーザーがフォーラムにログインすると、"/
" というパスを持つセッション ID の cookie が設定されます。
Ok(Html(command)).withCookies(Cookie("sessionID", sessionID, path = "/"))
http://communitypages.example.com/EvilSite
に別のアプリケーションを作成し、このサイトへのリンクをフォーラムに掲載したとします。 フォーラムのユーザーがこのリンクをクリックすると、ユーザーのブラウザーは /MyForum
によって設定された cookie を /EvilSite
で実行されているアプリケーションに送信することになります。 攻撃者はセッション ID を盗むことにより、/EvilSite
にアクセスした任意のフォーラム ユーザーのアカウントを乗っ取ることができます。/EvilSite
を使用してパスが広範にわたる cookie を独自に作成し、/MyForum
から送信される cookie を上書きします。/
") からアクセスできるように設定する傾向にあります。 この方法ではドメイン名を同じくするすべての Web アプリケーションがその cookie にアクセスできてしまいます。 cookie にはセッション ID などの重要な情報が保存されていることが多いため、アプリケーション間で cookie を共有すると、1 個のアプリケーションの脆弱性が別のアプリケーションに影響を及ぼす可能性があります。http://communitypages.example.com/MyForum
にフォーラム アプリケーションを配置している例を考えてみましょう。このアプリケーションでは、ユーザーがフォーラムにログインすると、"/
" というパスを持つセッション ID の cookie が設定されます。
...
let properties = [
NSHTTPCookieDomain: "www.example.com",
NSHTTPCookiePath: "/",
NSHTTPCookieName: "foo",
NSHTTPCookieValue: "bar",
NSHTTPCookieSecure: true
]
let cookie : NSHTTPCookie? = NSHTTPCookie(properties:properties)
...
http://communitypages.example.com/EvilSite
に別のアプリケーションを作成し、このサイトへのリンクをフォーラムに掲載したとします。 フォーラムのユーザーがこのリンクをクリックすると、ユーザーのブラウザーは /MyForum
によって設定された cookie を /EvilSite
で実行されているアプリケーションに送信することになります。 攻撃者はセッション ID を盗むことにより、/EvilSite
にアクセスした任意のフォーラム ユーザーのアカウントを乗っ取ることができます。/EvilSite
を使用してパスが広範にわたる cookie を独自に作成し、/MyForum
から送信される cookie を上書きします。.example.com
」などのセッション cookie を設定する傾向にあります。しかし、この方法では同じベースドメイン名およびサブドメイン上にあるすべての Web アプリケーションがそのセッション cookie にアクセスできてしまいます。セッション cookie が漏洩すると、アカウントが悪用される可能性があります。http://secure.example.com/
に安全なアプリケーションを配置していると考えてみましょう。このアプリケーションでは、ユーザーがログインすると、ドメインが「.example.com
」であるセッションの cookie が設定されます。
server.servlet.session.cookie.domain=.example.com
http://insecure.example.com/
に配置されていて、このアプリケーションに Cross-Site Scripting 脆弱性が存在するとします。http://secure.example.com
に認証されているユーザーが http://insecure.example.com
にアクセスすると、http://secure.example.com
から送信されるセッション cookie が漏洩する可能性があります。.example.com
」などのセッション cookie を設定する傾向にあります。この方法では同じベース ドメインおよびサブドメイン上にあるすべての Web アプリケーションがそのセッション cookie にアクセスできてしまいます。アプリケーション間でセッション cookie を共有すると、1 個のアプリケーションに存在する脆弱性が別のアプリケーションに影響を及ぼす可能性があります。http://secure.example.com/
に安全なアプリケーションを配置していると考えてみましょう。このアプリケーションでは、ユーザーがログインすると、ドメインが「.example.com
」であるセッションの cookie が設定されます。
session_set_cookie_params(0, "/", ".example.com", true, true);
http://insecure.example.com/
に配置されていて、このアプリケーションに Cross-Site Scripting の脆弱性が存在するとします。http://secure.example.com
に認証されているユーザーが http://insecure.example.com
にアクセスすると、http://secure.example.com
から送信されるセッション cookie が漏洩する可能性があります。/
」) に設定する傾向にあります。この方法では同じドメイン上にあるすべての Web アプリケーションがその cookie にアクセスできてしまいます。セッション cookie が漏えいすると、攻撃者はそのドメイン上の任意のアプリケーションに存在する脆弱性を利用してセッション cookie を盗むことができるため、アカウントが悪用される可能性があります。http://communitypages.example.com/MyForum
にフォーラム アプリケーションを配置している例を考えてみましょう。このアプリケーションでは、ユーザーがフォーラムにログインすると、「/
」というパスを持つセッションの cookie が設定されます。例:
server.servlet.session.cookie.path=/
http://communitypages.example.com/EvilSite
に別のアプリケーションを作成し、このサイトへのリンクをフォーラムに掲載したとします。フォーラム ユーザーがこのリンクをクリックすると、ユーザーのブラウザーは /MyForum
によって設定されたセッション cookie を /EvilSite
で実行されているアプリケーションに送信します。攻撃者は、ユーザーによって /MyForum
に設定されるセッション cookie を使用することにより、/EvilSite
にアクセスするフォーラム ユーザーのアカウントを危険にさらすことがあります。/
」) に設定する傾向にあります。この方法では同じドメイン上にあるすべての Web アプリケーションがその cookie にアクセスできてしまいます。セッション cookie が漏えいすると、攻撃者はそのドメイン上の任意のアプリケーションに存在する脆弱性を利用してセッション cookie を盗むことができるため、アカウントが悪用される可能性があります。http://communitypages.example.com/MyForum
にフォーラム アプリケーションを配置している例を考えてみましょう。このアプリケーションでは、ユーザーがフォーラムにログインすると、「/
」というパスを持つセッションの cookie が設定されます。
session_set_cookie_params(0, "/", "communitypages.example.com", true, true);
http://communitypages.example.com/EvilSite
に別のアプリケーションを作成し、このサイトへのリンクをフォーラムに掲載したとします。フォーラム ユーザーがこのリンクをクリックすると、ユーザーのブラウザーは /MyForum
によって設定されたセッション cookie を /EvilSite
で実行されているアプリケーションに送信します。攻撃者はセッション cookie を盗むことにより、/EvilSite
にアクセスしたフォーラム ユーザーのアカウントを侵害できてしまいます。SameSite
パラメーターが Strict
に設定されていません。SameSite
パラメーターは、リクエストがファーストパーティまたは同じサイトのコンテキストから生成された場合にのみリクエストに追加するよう cookie の範囲を制限します。これは、Cross-Site Request Forgery (CSRF) 攻撃から cookie を保護するのに役立ちます。SameSite
パラメーターの値は、次の 3 つのうちのいずれかになります。Strict
に設定した場合、cookie はトップレベル ナビゲーションのリクエストとともにのみ送信されます。Lax
に設定した場合、cookie は、同じホストからのトップレベル ナビゲーションだけでなく、サードパーティ サイトからホストへの GET リクエストとともに送信されます。たとえば、ホスト サイトにリンクする、iframe
タグか href
タグを持つサードパーティ サイトがあるとします。ユーザーがリンクをたどると、リクエストには cookie が含まれます。SameSite
パラメーターを Lax
に設定します。
...
Cookie cookie = new Cookie('name', 'Foo', path, -1, true, 'Lax');
...
SameSite
属性は Strict
に設定されていません。SameSite
属性は、Cross-Site Request Forgery (CSRF) などの攻撃から Cookie を保護します。セッション Cookie はサイトに対してユーザーを表しているため、ユーザーは承認されたアクションを実行できるようになります。ただし、ブラウザーはリクエストとともに自動的に Cookie を送信するため、ユーザーと Web サイトは認証について暗黙的にブラウザーを信頼することになります。攻撃者はこの信頼を悪用して、攻撃者が制御するサードパーティ サイトのページにある link
や iframe
などのタグの href
や src
属性内にリンクを埋め込むことで、ユーザーの代わりにサイトにリクエストを行うことができます。疑いを持たないユーザーを攻撃者が制御するサードパーティのサイトにおびき寄せることができれば、攻撃者はユーザーを認証するセッション Cookie を自動的に含めるリクエストを行うことができ、攻撃者がユーザーであるかのように効果的に認証されることになります。SameSite
属性の値を Strict
に設定します。これにより、トップレベル ナビゲーションまたは同じサイトからのリクエストにのみ Cookie を追加するよう、ブラウザーが制限されます。iframe
, img
, and form
などのさまざまなタグにおけるリンク経由のサードパーティ サイトからのリクエストにはこれらの Cookie がないため、ユーザーが認証されていない可能性がある場合にサイトでの処理が回避されます。SameSite
属性の値を Lax
に設定しています。
...
CookieOptions opt = new CookieOptions()
{
SameSite = SameSiteMode.Lax;
};
context.Response.Cookies.Append("name", "Foo", opt);
...
SameSite
属性は SameSiteStrictMode
に設定されていません。SameSite
属性は、クロスサイト リクエスト フォージェリ (CSRF) などの攻撃から Cookie を保護します。セッション Cookie はサイトに対してユーザーを表しているため、ユーザーは承認されたアクションを実行できるようになります。ただし、ブラウザーはリクエストとともに自動的に Cookie を送信するため、ユーザーと Web サイトは認証について暗黙的にブラウザーを信頼することになります。攻撃者はこの信頼を悪用して、攻撃者が制御するサードパーティ サイトのページにある link
や iframe
などのタグの href
や src
属性内にリンクを埋め込むことで、ユーザーの代わりにサイトにリクエストを行うことができます。疑いを持たないユーザーを攻撃者が制御するサードパーティのサイトにおびき寄せることができれば、攻撃者はユーザーを認証するセッション Cookie を自動的に含めるリクエストを行うことができ、攻撃者がユーザーであるかのように効果的に認証されることになります。SameSite
属性のセッション Cookie を SameSiteStrictMode
に設定すると、トップレベル ナビゲーションまたは同じサイトからのリクエストにのみ Cookie を追加するよう、ブラウザーを制限できます。iframe
, img
, and form
などのさまざまなタグにおけるリンク経由のサードパーティ サイトからのリクエストにはこれらの Cookie がないため、ユーザーが認証されていない可能性がある場合にサイトでの処理が回避されます。SameSite
属性の SameSiteLaxMode
を有効にしています。
c := &http.Cookie{
Name: "cookie",
Value: "samesite-lax",
SameSite: http.SameSiteLaxMode,
}
SameSite
属性は Strict
に設定されていません。SameSite
属性は、Cross-Site Request Forgery (CSRF) などの攻撃から Cookie を保護します。セッション Cookie はサイトに対してユーザーを表しているため、ユーザーは承認されたアクションを実行できるようになります。ただし、ブラウザーはリクエストとともに自動的に Cookie を送信するため、ユーザーと Web サイトは認証について暗黙的にブラウザーを信頼することになります。攻撃者はこの信頼を悪用して、攻撃者が制御するサードパーティ サイトのページにある link
や iframe
などのタグの href
や src
属性内にリンクを埋め込むことで、ユーザーの代わりにサイトにリクエストを行うことができます。疑いを持たないユーザーを攻撃者が制御するサードパーティのサイトにおびき寄せることができれば、攻撃者はユーザーを認証するセッション Cookie を自動的に含めるリクエストを行うことができ、攻撃者がユーザーであるかのように効果的に認証されることになります。SameSite
属性の値を Strict
に設定します。これにより、トップレベル ナビゲーションまたは同じサイトからのリクエストにのみ Cookie を追加するよう、ブラウザーが制限されます。iframe
, img
, and form
などのさまざまなタグにおけるリンク経由のサードパーティ サイトからのリクエストにはこれらの Cookie がないため、ユーザーが認証されていない可能性がある場合にサイトでの処理が回避されます。SameSite
属性の値を Lax
に設定しています。
ResponseCookie cookie = ResponseCookie.from("myCookie", "myCookieValue")
...
.sameSite("Lax")
...
}
SameSite
属性は Strict
に設定されていません。SameSite
属性は、Cross-Site Request Forgery (CSRF) などの攻撃から Cookie を保護します。セッション Cookie はサイトに対してユーザーを表しているため、ユーザーは承認されたアクションを実行できるようになります。ただし、ブラウザーはリクエストとともに自動的に Cookie を送信するため、ユーザーと Web サイトは認証について暗黙的にブラウザーを信頼することになります。攻撃者はこの信頼を悪用して、攻撃者が制御するサードパーティ サイトのページにある link
や iframe
などのタグの href
や src
属性内にリンクを埋め込むことで、ユーザーの代わりにサイトにリクエストを行うことができます。疑いを持たないユーザーを攻撃者が制御するサードパーティのサイトにおびき寄せることができれば、攻撃者はユーザーを認証するセッション Cookie を自動的に含めるリクエストを行うことができ、攻撃者がユーザーであるかのように効果的に認証されることになります。SameSite
属性の値を Strict
に設定します。これにより、トップレベル ナビゲーションまたは同じサイトからのリクエストにのみ Cookie を追加するよう、ブラウザーが制限されます。iframe
, img
, and form
などのさまざまなタグにおけるリンク経由のサードパーティ サイトからのリクエストにはこれらの Cookie がないため、ユーザーが認証されていない可能性がある場合にサイトでの処理が回避されます。SameSite
属性の値を Lax
に設定しています。
app.get('/', function (req, res) {
...
res.cookie('name', 'Foo', { sameSite: "Lax" });
...
}
SameSite
属性は Strict
に設定されていません。SameSite
属性は、クロスサイト リクエスト フォージェリ (CSRF) などの攻撃から Cookie を保護します。セッション Cookie はサイトに対してユーザーを表しているため、ユーザーは承認されたアクションを実行できるようになります。ただし、ブラウザーはリクエストとともに自動的に Cookie を送信するため、ユーザーと Web サイトは認証について暗黙的にブラウザーを信頼することになります。攻撃者はこの信頼を悪用して、攻撃者が制御するサードパーティ サイトのページにある link
や iframe
などのタグの href
や src
属性内にリンクを埋め込むことで、ユーザーの代わりにサイトにリクエストを行うことができます。疑いを持たないユーザーを攻撃者が制御するサードパーティのサイトにおびき寄せることができれば、攻撃者はユーザーを認証するセッション Cookie を自動的に含めるリクエストを行うことができ、攻撃者がユーザーであるかのように効果的に認証されることになります。SameSite
属性のセッション Cookie を Strict
に設定すると、トップレベル ナビゲーションまたは同じサイトからのリクエストにのみ Cookie を追加するよう、ブラウザーを制限できます。iframe
, img
, and form
などのさまざまなタグにおけるリンク経由のサードパーティ サイトからのリクエストにはこれらの Cookie がないため、ユーザーが認証されていない可能性がある場合にサイトでの処理が回避されます。SameSite
属性の Lax
モードを有効にしています。
ini_set("session.cookie_samesite", "Lax");
SameSite
属性は Strict
に設定されていません。SameSite
属性は、Cross-Site Request Forgery (CSRF) などの攻撃から Cookie を保護します。セッション Cookie はサイトに対してユーザーを表しているため、ユーザーは承認されたアクションを実行できるようになります。ただし、ブラウザーはリクエストとともに自動的に Cookie を送信するため、ユーザーと Web サイトは認証について暗黙的にブラウザーを信頼することになります。攻撃者はこの信頼を悪用して、攻撃者が制御するサードパーティ サイトのページにある link
や iframe
などのタグの href
や src
属性内にリンクを埋め込むことで、ユーザーの代わりにサイトにリクエストを行うことができます。疑いを持たないユーザーを攻撃者が制御するサードパーティのサイトにおびき寄せる場合、攻撃者は、ユーザー認証を使用してセッション Cookie を自動的に含めるリクエストを行うことができます。これにより、攻撃者はユーザーの承認を使用してアクセスできるようになります。SameSite
パラメーターのセッション Cookie を Strict
に設定すると、トップレベル ナビゲーションまたは同じサイトからのリクエストにのみ Cookie を追加するよう、ブラウザーを制限できます。iframe
, img
, and form
などのさまざまなタグにおけるリンク経由のサードパーティ サイトからのリクエストにはこれらの Cookie がないため、ユーザーが認証されていない可能性がある場合にサイトでの処理が回避されます。samesite
属性の Lax
を有効にしています。
response.set_cookie("cookie", value="samesite-lax", samesite="Lax")
...
Integer maxAge = 60*60*24*365*10;
Cookie cookie = new Cookie('emailCookie', emailCookie, path, maxAge, true, 'Strict');
...
HttpCookie cookie = new HttpCookie("emailCookie", email);
cookie.Expires = DateTime.Now.AddYears(10);;
Cookie cookie = new Cookie("emailCookie", email);
cookie.setMaxAge(60*60*24*365*10);
...
NSDictionary *cookieProperties = [NSDictionary dictionary];
...
[cookieProperties setValue:[[NSDate date] dateByAddingTimeInterval:(60*60*24*365*10)] forKey:NSHTTPCookieExpires];
...
NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:cookieProperties];
...
setcookie("emailCookie", $email, time()+60*60*24*365*10);
from django.http.response import HttpResponse
...
def view_method(request):
res = HttpResponse()
res.set_cookie("emailCookie", email, expires=time()+60*60*24*365*10, secure=True, httponly=True)
return res
...
Ok(Html(command)).withCookies(Cookie("sessionID", sessionID, maxAge = Some(60*60*24*365*10)))
...
let properties = [
NSHTTPCookieDomain: "www.example.com",
NSHTTPCookiePath: "/service",
NSHTTPCookieName: "foo",
NSHTTPCookieValue: "bar",
NSHTTPCookieSecure: true,
NSHTTPCookieExpires : NSDate(timeIntervalSinceNow: (60*60*24*365*10))
]
let cookie : NSHTTPCookie? = NSHTTPCookie(properties:properties)
...
server.servlet.session.cookie.persistent=true
session_set_cookie_params(time()+60*60*24*365*10, "/", "www.example.com", false, true);
Secure
フラグを true
に設定せずに、アプリケーション セッション cookie が作成されます。Secure
フラグがサポートされています。このフラグが設定されていると、ブラウザーは HTTPS 経由でのみ cookie を送信します。暗号化されていないチャネルで cookie を送信すると、ネットワークが盗聴される可能性があります。したがって、secure フラグを使用することで cookie の値の機密性を保護できます。これは、cookie に個人情報が保存されている場合や、cookie によってセッション ID が送信される場合、特に重要になります。Secure
フラグを設定せずにレスポンスにセッション cookie が追加されるようにする設定です。
...
<configuration>
<system.web>
<authentication mode="Forms">
<forms requireSSL="false" loginUrl="login.aspx">
</forms>
</authentication>
</system.web>
</configuration>
...
Secure
フラグが設定されていないアプリケーションでは、HTTPS リクエストで送信された cookie はその後に続く HTTP リクエストでも送信されてしまいます。暗号化されていない無線接続でネットワークトラフィックを盗聴するのは攻撃者にとって簡単です。つまり、cookie (特にセッション ID が格納されている cookie) を HTTP 経由で送信すると、アプリケーションが危険にさらされる可能性があります。Secure
フラグがサポートされています。このフラグが設定されていると、ブラウザーは HTTPS 経由でのみ cookie を送信します。暗号化されていないチャネルで cookie を送信すると、ネットワークが盗聴される可能性があります。したがって、secure フラグを使用することで cookie の値の機密性を保護できます。これは、cookie に個人情報が保存されている場合や、cookie によってセッション ID が送信される場合、特に重要になります。Secure
フラグを無効にします。
server.servlet.session.cookie.secure=false
Secure
フラグが設定されていないアプリケーションでは、HTTPS リクエストで送信された cookie はその後に続く HTTP リクエストでも送信されてしまいます。すると攻撃者は、暗号化されていないネットワーク トラフィックをスニッフィングすることによって cookie を危険にさらすことがあります。特に無線ネットワークの場合、ネットワーク トラフィックのスニッフィングは非常に簡単です。Secure
フラグを true
に設定せずにセッション cookie を作成します。Secure
フラグがサポートされています。このフラグが設定されていると、ブラウザは HTTPS 経由でのみ cookie を送信します。暗号化されていないチャネルで cookie を送信すると、ネットワークが盗聴される可能性があります。したがって、secure フラグを使用することで cookie の値の機密性を保護できます。cookie に個人情報が保存されている場合や、cookie によってセッション ID が送信される場合に特に重要になります。Secure
フラグを設定せずに cookie がレスポンスに追加されています。
...
setcookie("emailCookie", $email, 0, "/", "www.example.com");
...
Secure
フラグが設定されていないアプリケーションでは、HTTPS リクエストで送信された cookie はその後に続く HTTP リクエストでも送信されてしまいます。すると攻撃者は、暗号化されていないネットワーク トラフィックをスニッフィングすることによって cookie を危険にさらすことがあります。特に無線ネットワークの場合、ネットワーク トラフィックのスニッフィングは非常に簡単です。SESSION_COOKIE_SECURE
プロパティを明示的に True
に設定しないか、または False
に設定します。Secure
フラグがサポートされています。このフラグが設定されていると、ブラウザは HTTPS 経由でのみ cookie を送信します。暗号化されていないチャネルで cookie を送信すると、ネットワークが盗聴される可能性があります。したがって、secure フラグを使用することで cookie の値の機密性を保護できます。cookie に個人情報またはセッション ID が保存されている場合や、cookie によって CSRF トークンが送信される場合に特に重要になります。Secure
ビットを明示的に設定しません。
...
MIDDLEWARE = (
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'csp.middleware.CSPMiddleware',
'django.middleware.security.SecurityMiddleware',
...
)
...
Secure
フラグが設定されていないアプリケーションでは、HTTPS リクエストで送信された cookie はその後に続く HTTP リクエストでも送信されてしまいます。すると攻撃者は、暗号化されていないネットワーク トラフィックをスニッフィングすることによって cookie を危険にさらすことがあります。特に無線ネットワークの場合、ネットワーク トラフィックのスニッフィングは非常に簡単です。
<cfquery name = "GetCredentials" dataSource = "master">
SELECT Username, Password
FROM Credentials
WHERE DataSource="users"
</cfquery>
...
<cfquery name = "GetSSNs" dataSource = "users"
username = "#Username#" password = "#Password#">
SELECT SSN
FROM Users
</cfquery>
...
master
にアクセスできる全員が Username
と Password
の値を読み取ることができます。不心得な従業員がこの情報へのアクセス権を持っている場合、システムに侵入するために使用されることがあります。
...
<cfquery name = "GetSSNs" dataSource = "users"
username = "scott" password = "tiger">
SELECT SSN
FROM Users
</cfquery>
...
...
Credentials.basic("hardcoded-username", password);
...
...
PARAMETERS: p_input TYPE sy-mandt.
SELECT *
FROM employee_records
CLIENT SPECIFIED
INTO TABLE tab_output
WHERE mandt = p_input.
...
SY-MANDT
以外のクライアントから従業員の詳細を表示できます。X-Frame-Options
ヘッダーを介してフレーミング ポリシーを指定できない場合。X-Frame-Options
ヘッダーを介してフレーミング ポリシーを指定できない場合。localStorage
と sessionStorage
間で値を転送すると、意図せずに重要な情報が公開される可能性があります。localStorage
および sessionStorage
マップを提供して、開発者がプログラムの値を保持できるようにしています。sessionStorage
マップは、ページを起動するためのストレージを提供し、該当するページ インスタンスおよび直近のブラウザ セッションの期間だけ持続します。しかし、localStorage
マップは、複数のページ インスタンスおよび複数のブラウザ インスタンスにわたってアクセス可能なストレージを提供します。この機能により、アプリケーションは、複数のブラウザタブやウィンドウで同じ情報を保持して利用できるようになります。sessionStorage
スコープと localStorage
間で移動しないように注意するよう必要があります。sessionStorage
オブジェクトに保存されます。しかし、開発者は、localStorage
オブジェクト内にも情報を保存します。
...
try {
sessionStorage.setItem("userCCV", currentCCV);
} catch (e) {
if (e == QUOTA_EXCEEDED_ERR) {
alert('Quota exceeded.');
}
}
...
...
var retrieveObject = sessionStorage.getItem("userCCV");
try {
localStorage.setItem("userCCV",retrieveObject);
} catch (e) {
if (e == QUOTA_EXCEEDED_ERR) {
alert('Quota exceeded.');
}
...
var userCCV = localStorage.getItem("userCCV");
...
}
...
localStorage
オブジェクトに情報を戻すことで、CCV 情報は他のブラウザ タブでも利用できるようになります。また、ブラウザを新たに呼び出した場合でも利用できるようになります。これは、アプリケーション論理の本来のワークフローを回避しています。
...
var params:Object = LoaderInfo(this.root.loaderInfo).parameters;
var url:String = String(params["url"]);
var ldr:Loader = new Loader();
var urlReq:URLRequest = new URLRequest(url);
ldr.load(urlReq);
...
MyAccountActions
とページ アクション メソッド pageAction()
を宣言しています。ページの URL にアクセスすると、pageAction()
メソッドが実行され、サーバーは CSRF 防止トークンをチェックしません。
<apex:page controller="MyAccountActions" action="{!pageAction}">
...
</apex:page>
public class MyAccountActions {
...
public void pageAction() {
Map<String,String> reqParams = ApexPages.currentPage().getParameters();
if (params.containsKey('id')) {
Id id = reqParams.get('id');
Account acct = [SELECT Id,Name FROM Account WHERE Id = :id];
delete acct;
}
}
...
}
<img src="http://my-org.my.salesforce.com/apex/mypage?id=YellowSubmarine" height=1 width=1/>
RequestBuilder rb = new RequestBuilder(RequestBuilder.POST, "/new_user");
body = addToPost(body, new_username);
body = addToPost(body, new_passwd);
rb.sendRequest(body, new NewAccountCallback(callback));
RequestBuilder rb = new RequestBuilder(RequestBuilder.POST, "http://www.example.com/new_user");
body = addToPost(body, "attacker";
body = addToPost(body, "haha");
rb.sendRequest(body, new NewAccountCallback(callback));
example.com
の管理者が、サイトでセッションを行っているときに、悪意あるページにアクセスすると、攻撃者にアカウントを作成してしまいますが、本人はそのことに気づきません。これが CSRF 攻撃です。アプリケーションには、リクエストの生成元を検証する方法がないために、この攻撃が可能となっています。リクエストはユーザーによって選択された正当なアクションにも、攻撃者が準備した不正なアクションにもなりえます。攻撃者は偽のリクエストを生成する Web ページを見ることができません。そのため、この攻撃方法は、アプリケーションの状態を変更するリクエストにのみ有効です。
<http auto-config="true">
...
<csrf disabled="true"/>
</http>
var req = new XMLHttpRequest();
req.open("POST", "/new_user", true);
body = addToPost(body, new_username);
body = addToPost(body, new_passwd);
req.send(body);
var req = new XMLHttpRequest();
req.open("POST", "http://www.example.com/new_user", true);
body = addToPost(body, "attacker");
body = addToPost(body, "haha");
req.send(body);
example.com
の管理者が、サイトでセッションを行っているときに、悪意あるページにアクセスすると、攻撃者にアカウントを作成してしまいますが、本人はそのことに気づきません。これが CSRF 攻撃です。アプリケーションには、リクエストの生成元を検証する方法がないために、この攻撃が可能となっています。リクエストはユーザによって選択された正当なアクションにも、攻撃者が準備した不正なアクションにもなりえます。攻撃者は偽のリクエストを生成する Web ページを見ることができません。そのため、この攻撃方法は、アプリケーションの状態を変更するリクエストにのみ有効です。
<form method="POST" action="/new_user" >
Name of new user: <input type="text" name="username">
Password for new user: <input type="password" name="user_passwd">
<input type="submit" name="action" value="Create User">
</form>
<form method="POST" action="http://www.example.com/new_user">
<input type="hidden" name="username" value="hacker">
<input type="hidden" name="user_passwd" value="hacked">
</form>
<script>
document.usr_form.submit();
</script>
example.com
の管理者が、サイトでセッションを行っているときに、悪意あるページにアクセスすると、攻撃者にアカウントを作成してしまいますが、本人はそのことに気づきません。これが CSRF 攻撃です。アプリケーションには、リクエストの生成元を検証する方法がないために、この攻撃が可能となっています。リクエストはユーザによって選択された正当なアクションにも、攻撃者が準備した不正なアクションにもなりえます。攻撃者は偽のリクエストを生成する Web ページを見ることができません。そのため、この攻撃方法は、アプリケーションの状態を変更するリクエストにのみ有効です。buyItem
コントローラー メソッドの CSRF 保護を無効にします。
+ nocsrf
POST /buyItem controllers.ShopController.buyItem
shop.com
のアクティブ セッション実行時に、ユーザーは意図せずに悪意あるページに誘導され、気づかないうちに攻撃者にアイテムを購入してしまいます。 これが CSRF 攻撃です。 アプリケーションには、リクエストの生成元を検証する方法がないために、この攻撃が可能となっています。 リクエストはユーザーによって選択された正当なアクションにも、攻撃者が準備した不正なアクションにもなりえます。 攻撃者は偽のリクエストを生成する Web ページを見ることができません。そのため、この攻撃方法は、アプリケーションの状態を変更するリクエストにのみ有効です。
<form method="POST" action="/new_user" >
Name of new user: <input type="text" name="username">
Password for new user: <input type="password" name="user_passwd">
<input type="submit" name="action" value="Create User">
</form>
<form method="POST" action="http://www.example.com/new_user">
<input type="hidden" name="username" value="hacker">
<input type="hidden" name="user_passwd" value="hacked">
</form>
<script>
document.usr_form.submit();
</script>
example.com
の管理者が、サイトでセッションを行っているときに、悪意あるページにアクセスすると、攻撃者にアカウントを作成してしまいますが、本人はそのことに気づきません。これが CSRF 攻撃です。アプリケーションには、リクエストの生成元を検証する方法がないために、この攻撃が可能となっています。リクエストはユーザによって選択された正当なアクションにも、攻撃者が準備した不正なアクションにもなりえます。攻撃者は偽のリクエストを生成する Web ページを見ることができません。そのため、この攻撃方法は、アプリケーションの状態を変更するリクエストにのみ有効です。
@GetMapping("/ai")
String generation(String userInput) {
return this.chatClient.prompt()
.user(userInput)
.call()
.content();
}
message
から応答を取得し、ユーザーに表示します。
const openai = new OpenAI({
apiKey: ...,
});
const chatCompletion = await openai.chat.completions.create(...);
message = res.choices[0].message.content
console.log(chatCompletion.choices[0].message.content)
val chatCompletionRequest = ChatCompletionRequest(
model = ModelId("gpt-3.5-turbo"),
messages = listOf(...)
)
val completion: ChatCompletion = openAI.chatCompletion(chatCompletionRequest)
response.getOutputStream().print(completion.choices[0].message)
message
から応答を取得し、ユーザーに表示します。
client = openai.OpenAI()
res = client.chat.completions.create(...)
message = res.choices[0].message.content
self.writeln(f"<p>{message}<\p>")
chatService.createCompletion(
text,
settings = CreateCompletionSettings(...)
).map(completion =>
val html = Html(completion.choices.head.text)
Ok(html) as HTML
)
...
text/html
MIME タイプを指定する必要があります。したがって、XSS が可能になるのは、レスポンスがこの MIME タイプ、またはブラウザがレスポンスを HTML として、またはスクリプトを実行する可能性のあるその他のドキュメント(SVG イメージ (image/svg+xml
) や XML ドキュメント (application/xml
) など)としてレンダリングするように強制するその他のタイプを使用する場合のみです。 application/octet-stream
のような MIME タイプのレスポンスが提供されても、HTML をレンダリングせず、スクリプトも実行しません。ただし、Internet Explorer などの一部のブラウザは、Content Sniffing
と呼ばれる機能を実行します。Content Sniffing では、提供された MIME タイプが無視され、レスポンスの内容によって正しい MIME タイプを推測しようとします。text/html
は、そのような MIME タイプの中で XSS の脆弱性を引き起こす可能性がある唯一の MIME タイプであることには注意が必要です。SVG イメージ (image/svg+xml
) や XML ドキュメント (application/xml
) など、スクリプトを実行する可能性があるその他のドキュメントは、ブラウザが Content Sniffing を実行するかどうかにかかわらず、XSS の脆弱性を引き起こす可能性があります。 <html><body><script>alert(1)</script></body></html>
などのレスポンスは、その content-type
ヘッダーが application/octet-stream
、multipart-mixed
などに設定されていても、HTML としてレンダリングできます。application/octet-stream
レスポンスにユーザー データを反映します。
@RestController
public class SomeResource {
@RequestMapping(value = "/test", produces = {MediaType.APPLICATION_OCTET_STREAM_VALUE})
public String response5(@RequestParam(value="name") String name){
return name;
}
}
name
パラメータを <html><body><script>alert(1)</script></body></html>
に設定してリクエストを送信すると、サーバは次のレスポンスを生成します。
HTTP/1.1 200 OK
Content-Length: 51
Content-Type: application/octet-stream
Connection: Closed
<html><body><script>alert(1)</script></body></html>
text/html
MIME タイプを指定する必要があります。したがって、XSS が可能になるのは、レスポンスがこの MIME タイプ、またはブラウザがレスポンスを HTML として、またはスクリプトを実行する可能性のあるその他のドキュメント(SVG イメージ (image/svg+xml
) や XML ドキュメント (application/xml
) など)としてレンダリングするように強制するその他のタイプを使用する場合のみです。 application/json
のような MIME タイプのレスポンスが提供されても、HTML をレンダリングせず、スクリプトも実行しません。ただし、Internet Explorer などの一部のブラウザは、Content Sniffing
と呼ばれる機能を実行します。Content Sniffing では、提供された MIME タイプが無視され、レスポンスの内容によって正しい MIME タイプを推測しようとします。ただし、text/html
は、そのような MIME タイプの中で XSS の脆弱性を引き起こす可能性がある唯一の MIME タイプであることには注意が必要です。SVG イメージ (image/svg+xml
) や XML ドキュメント (application/xml
) など、スクリプトを実行する可能性があるその他のドキュメントは、ブラウザが Content Sniffing を実行するかどうかにかかわらず、XSS の脆弱性を引き起こす可能性があります。 <html><body><script>alert(1)</script></body></html>
などのレスポンスは、その content-type
ヘッダーが application/json
に設定されていても HTML としてレンダリングできます。application/json
レスポンスにユーザー データを反映します。
def mylambda_handler(event, context):
name = event['name']
response = {
"statusCode": 200,
"body": "{'name': name}",
"headers": {
'Content-Type': 'application/json',
}
}
return response
name
パラメーターを <html><body><script>alert(1)</script></body></html>
に設定してリクエストを送信すると、サーバーは次のレスポンスを生成します。
HTTP/1.1 200 OK
Content-Length: 88
Content-Type: application/json
Connection: Closed
{'name': '<html><body><script>alert(1)</script></body></html>'}