From 8f65d833112bc59dffdb09b0eea7704916e89948 Mon Sep 17 00:00:00 2001 From: axunonb Date: Tue, 8 Oct 2024 11:08:13 +0200 Subject: [PATCH] Enhance security for links, cookies, and regex operations (#205) * Add `rel="noopener"` to various anchor tags across multiple files to prevent access to `window.opener`. * Add `Secure` and `HttpOnly` attributes to cookies * Introduced `RegexTimeout` constant in `TimeOnlyModelBinder.cs` and `TimeSpanModelBinder.cs`, and updated `Regex.Replace` calls --- League.Demo/Views/Home/AboutLeague.cshtml | 2 +- League.Demo/Views/Home/AboutLeague.de.cshtml | 2 +- League.Demo/Views/Home/Privacy.cshtml | 4 ++-- League.Demo/Views/Home/Privacy.de.cshtml | 18 +++++++++--------- League/Controllers/Language.cs | 12 ++++++++++-- League/ModelBinders/TimeOnlyModelBinder.cs | 7 ++++--- League/ModelBinders/TimeSpanModelBinder.cs | 5 +++-- League/MultiTenancy/TenantResolver.cs | 4 ++-- 8 files changed, 32 insertions(+), 22 deletions(-) diff --git a/League.Demo/Views/Home/AboutLeague.cshtml b/League.Demo/Views/Home/AboutLeague.cshtml index e6053593..2b784d92 100644 --- a/League.Demo/Views/Home/AboutLeague.cshtml +++ b/League.Demo/Views/Home/AboutLeague.cshtml @@ -44,7 +44,7 @@
  • Optimized for mobile devices: Comfortable operation on smartphones, tablets or desktop PCs
  • Localizable for language, region and time zone
  • Runs on Windows und Linux
  • -
  • The platform software is Open Source and published on GitHub.
  • +
  • The platform software is Open Source and published on GitHub.
  • diff --git a/League.Demo/Views/Home/AboutLeague.de.cshtml b/League.Demo/Views/Home/AboutLeague.de.cshtml index 446c8f11..1023a83b 100644 --- a/League.Demo/Views/Home/AboutLeague.de.cshtml +++ b/League.Demo/Views/Home/AboutLeague.de.cshtml @@ -44,7 +44,7 @@
  • Optimiert für mobile Geräte: Komfortable Bedienung per Smartphone, Tablet oder Desktop PC
  • Lokalisierbar für Sprache, Region und Zeitzone
  • Lauffähig auf Windows und Linux
  • -
  • Die Software der Plattform ist Open Source und veröffentlicht auf GitHub.
  • +
  • Die Software der Plattform ist Open Source und veröffentlicht auf GitHub.
  • diff --git a/League.Demo/Views/Home/Privacy.cshtml b/League.Demo/Views/Home/Privacy.cshtml index 82a0415a..a3576c28 100644 --- a/League.Demo/Views/Home/Privacy.cshtml +++ b/League.Demo/Views/Home/Privacy.cshtml @@ -122,7 +122,7 @@

    Retention period:

    We do not collect any personal data via the integration of Google Maps.

    Third country transfers

    -

    Google processes your data in the United States of America and is subject to the EU-U.S. Privacy Shield: https://www.privacyshield.gov/EU-US-Framework.

    +

    Google processes your data in the United States of America and is subject to the EU-U.S. Privacy Shield: https://www.privacyshield.gov/EU-US-Framework.

    Revocation of consent

    If you do not want Google to collect, process or use information about you via our website, you can disable JavaScript in your browser settings. In this case, you cannot or only partially use our website.

    Mandatory or required provision

    @@ -141,7 +141,7 @@

    Everyone who has disabled the storage of cookies for the Google ad programme will not have to expect any cookies when watching YouTube videos. However, YouTube also stores non-personal usage information in other cookies. If you would like to prevent this, you must block the storage of cookies in the browser.

    You’ll find additional information on data protection at ‘YouTube’ in the provider’s privacy policy at: https://policies.google.com/privacy.

    Third country transfers

    -

    Google processes your data in the United States of America and is subject to the EU-U.S. Privacy Shield: https://www.privacyshield.gov/EU-US-Framework.

    +

    Google processes your data in the United States of America and is subject to the EU-U.S. Privacy Shield: https://www.privacyshield.gov/EU-US-Framework.

    Mandatory or required provision

    The provision of your personal data is voluntary, based solely on your consent. If you prevent access, this can lead to functional limitations on the website.

    diff --git a/League.Demo/Views/Home/Privacy.de.cshtml b/League.Demo/Views/Home/Privacy.de.cshtml index c40dfa2a..763e31c3 100644 --- a/League.Demo/Views/Home/Privacy.de.cshtml +++ b/League.Demo/Views/Home/Privacy.de.cshtml @@ -133,11 +133,11 @@

    Speicherdauer:

    Die Löschung der Daten erfolgt, sobald diese für unsere Aufzeichnungszwecke nicht mehr erforderlich sind.

    Drittlandtransfer:

    -

    Google verarbeitet Ihre Daten in den USA und hat sich dem EU_US Privacy Shield unterworfen https://www.privacyshield.gov/EU-US-Framework.

    +

    Google verarbeitet Ihre Daten in den USA und hat sich dem EU_US Privacy Shield unterworfen https://www.privacyshield.gov/EU-US-Framework.

    Bereitstellung vorgeschrieben oder erforderlich:

    Die Bereitstellung Ihrer personenbezogenen Daten erfolgt freiwillig, allein auf Basis Ihrer Einwilligung. Sofern Sie den Zugriff unterbinden, kann es hierdurch zu Funktionseinschränkungen auf der Website kommen.

    Widerruf der Einwilligung:

    -

    Sie können die Speicherung der Cookies durch eine entsprechende Einstellung Ihrer Browser-Software verhindern; wir weisen Sie jedoch darauf hin, dass Sie in diesem Fall gegebenenfalls nicht sämtliche Funktionen dieser Website vollumfänglich werden nutzen können. Sie können darüber hinaus die Erfassung der durch das Cookie erzeugten und auf Ihre Nutzung der Webseite bezogenen Daten (inkl. Ihrer IP-Adresse) an Google sowie die Verarbeitung dieser Daten durch Google verhindern, indem sie das unter dem folgenden Link verfügbare Browser-Plugin herunterladen und installieren: Browser Add On zur Deaktivierung von Google Analytics.

    +

    Sie können die Speicherung der Cookies durch eine entsprechende Einstellung Ihrer Browser-Software verhindern; wir weisen Sie jedoch darauf hin, dass Sie in diesem Fall gegebenenfalls nicht sämtliche Funktionen dieser Website vollumfänglich werden nutzen können. Sie können darüber hinaus die Erfassung der durch das Cookie erzeugten und auf Ihre Nutzung der Webseite bezogenen Daten (inkl. Ihrer IP-Adresse) an Google sowie die Verarbeitung dieser Daten durch Google verhindern, indem sie das unter dem folgenden Link verfügbare Browser-Plugin herunterladen und installieren: Browser Add On zur Deaktivierung von Google Analytics.

    Zusätzlich oder als Alternative zum Browser-Add-On können Sie das Tracking durch Google Analytics auf unseren Seiten unterbinden, indem Sie . Dabei wird ein Opt-out-Cookie auf Ihrem Gerät installiert. Damit wird die Erfassung durch Google Analytics für diese Website und für diesen Browser zukünftig verhindert, solange das Cookie in Ihrem Browser installiert bleibt.

    Profiling:

    Mit Hilfe des Tracking-Tools Google Analytics kann das Verhalten der Besucher der Webseite bewertet und die Interessen analysiert werden. Hierzu erstellen wir ein pseudonymes Nutzerprofil.

    @@ -145,14 +145,14 @@

    Verwendung von Scriptbibliotheken (Google Webfonts)

    Art und Zweck der Verarbeitung:

    Um unsere Inhalte browserübergreifend korrekt und grafisch ansprechend darzustellen, verwenden wir auf dieser Website „Google Web Fonts“ der Google LLC (1600 Amphitheatre Parkway, Mountain View, CA 94043, USA; nachfolgend „Google“) zur Darstellung von Schriften.

    -

    Die Datenschutzrichtlinie des Bibliothekbetreibers Google finden Sie hier: https://www.google.com/policies/privacy/

    +

    Die Datenschutzrichtlinie des Bibliothekbetreibers Google finden Sie hier: https://www.google.com/policies/privacy/

    Rechtsgrundlage:

    Rechtsgrundlage für die Einbindung von Google Webfonts und dem damit verbundenen Datentransfer zu Google ist Ihre Einwilligung (Art. 6 Abs. 1 lit. a DSGVO).

    Empfänger:

    Der Aufruf von Scriptbibliotheken oder Schriftbibliotheken löst automatisch eine Verbindung zum Betreiber der Bibliothek aus. Dabei ist es theoretisch möglich – aktuell allerdings auch unklar ob und ggf. zu welchen Zwecken – dass der Betreiber in diesem Fall Google Daten erhebt.

    Speicherdauer:

    Wir erheben keine personenbezogenen Daten, durch die Einbindung von Google Webfonts.

    -

    Weitere Informationen zu Google Web Fonts finden Sie unter https://developers.google.com/fonts/faq und in der Datenschutzerklärung von Google: https://www.google.com/policies/privacy/.

    +

    Weitere Informationen zu Google Web Fonts finden Sie unter https://developers.google.com/fonts/faq und in der Datenschutzerklärung von Google: https://www.google.com/policies/privacy/.

    Drittlandtransfer:

    Google verarbeitet Ihre Daten in den USA und hat sich dem EU_US Privacy Shield unterworfen https://www.privacyshield.gov/EU-US-Framework.

    Bereitstellung vorgeschrieben oder erforderlich:

    @@ -164,7 +164,7 @@

    Art und Zweck der Verarbeitung:

    Auf dieser Webseite nutzen wir das Angebot von Google Maps. Google Maps wird von Google LLC, 1600 Amphitheatre Parkway, Mountain View, CA 94043, USA (nachfolgend „Google“) betrieben. Dadurch können wir Ihnen interaktive Karten direkt in der Webseite anzeigen und ermöglichen Ihnen die komfortable Nutzung der Karten-Funktion.

    Nähere Informationen über die Datenverarbeitung durch Google können Sie den Google-Datenschutzhinweisen entnehmen. Dort können Sie im Datenschutzcenter auch Ihre persönlichen Datenschutz-Einstellungen verändern.

    -

    Ausführliche Anleitungen zur Verwaltung der eigenen Daten im Zusammenhang mit Google-Produkten finden Sie hier.

    +

    Ausführliche Anleitungen zur Verwaltung der eigenen Daten im Zusammenhang mit Google-Produkten finden Sie hier.

    Rechtsgrundlage:

    Rechtsgrundlage für die Einbindung von Google Maps und dem damit verbundenen Datentransfer zu Google ist Ihre Einwilligung (Art. 6 Abs. 1 lit. a DSGVO).

    Empfänger:

    @@ -173,7 +173,7 @@

    Speicherdauer:

    Wir erheben keine personenbezogenen Daten, durch die Einbindung von Google Maps.

    Drittlandtransfer:

    -

    Google verarbeitet Ihre Daten in den USA und hat sich dem EU_US Privacy Shield unterworfen https://www.privacyshield.gov/EU-US-Framework.

    +

    Google verarbeitet Ihre Daten in den USA und hat sich dem EU_US Privacy Shield unterworfen https://www.privacyshield.gov/EU-US-Framework.

    Widerruf der Einwilligung:

    Wenn Sie nicht möchten, dass Google über unseren Internetauftritt Daten über Sie erhebt, verarbeitet oder nutzt, können Sie in Ihrem Browsereinstellungen JavaScript deaktivieren. In diesem Fall können Sie unsere Webseite jedoch nicht oder nur eingeschränkt nutzen.

    Bereitstellung vorgeschrieben oder erforderlich:

    @@ -183,16 +183,16 @@

    Art und Zweck der Verarbeitung:

    Auf einigen unserer Webseiten betten wir YouTube-Videos ein. Betreiber der entsprechenden Plugins ist die YouTube, LLC, 901 Cherry Ave., San Bruno, CA 94066, USA (nachfolgend „YouTube“). Wenn Sie eine Seite mit dem YouTube-Plugin besuchen, wird eine Verbindung zu Servern von YouTube hergestellt. Dabei wird YouTube mitgeteilt, welche Seiten Sie besuchen. Wenn Sie in Ihrem YouTube-Account eingeloggt sind, kann YouTube Ihr Surfverhalten Ihnen persönlich zuzuordnen. Dies verhindern Sie, indem Sie sich vorher aus Ihrem YouTube-Account ausloggen.

    Wird ein YouTube-Video gestartet, setzt der Anbieter Cookies ein, die Hinweise über das Nutzerverhalten sammeln.

    -

    Weitere Informationen zu Zweck und Umfang der Datenerhebung und ihrer Verarbeitung durch YouTube erhalten Sie in den Datenschutzerklärungen des Anbieters, Dort erhalten Sie auch weitere Informationen zu Ihren diesbezüglichen Rechten und Einstellungsmöglichkeiten zum Schutze Ihrer Privatsphäre (https://policies.google.com/privacy). Google verarbeitet Ihre Daten in den USA und hat sich dem EU-US Privacy Shield unterworfen https://www.privacyshield.gov/EU-US-Framework

    +

    Weitere Informationen zu Zweck und Umfang der Datenerhebung und ihrer Verarbeitung durch YouTube erhalten Sie in den Datenschutzerklärungen des Anbieters, Dort erhalten Sie auch weitere Informationen zu Ihren diesbezüglichen Rechten und Einstellungsmöglichkeiten zum Schutze Ihrer Privatsphäre (https://policies.google.com/privacy). Google verarbeitet Ihre Daten in den USA und hat sich dem EU-US Privacy Shield unterworfen https://www.privacyshield.gov/EU-US-Framework

    Rechtsgrundlage:

    Rechtsgrundlage für die Einbindung von YouTube und dem damit verbundenen Datentransfer zu Google ist Ihre Einwilligung (Art. 6 Abs. 1 lit. a DSGVO).

    Empfänger:

    Der Aufruf von YouTube löst automatisch eine Verbindung zu Google aus.

    Speicherdauer und Widerruf der Einwilligung:

    Wer das Speichern von Cookies für das Google-Ad-Programm deaktiviert hat, wird auch beim Anschauen von YouTube-Videos mit keinen solchen Cookies rechnen müssen. YouTube legt aber auch in anderen Cookies nicht-personenbezogene Nutzungsinformationen ab. Möchten Sie dies verhindern, so müssen Sie das Speichern von Cookies im Browser blockieren.

    -

    Weitere Informationen zum Datenschutz bei „YouTube“ finden Sie in der Datenschutzerklärung des Anbieters unter: https://www.google.de/intl/de/policies/privacy/

    +

    Weitere Informationen zum Datenschutz bei „YouTube“ finden Sie in der Datenschutzerklärung des Anbieters unter: https://www.google.de/intl/de/policies/privacy/

    Drittlandtransfer:

    -

    Google verarbeitet Ihre Daten in den USA und hat sich dem EU_US Privacy Shield unterworfen https://www.privacyshield.gov/EU-US-Framework.

    +

    Google verarbeitet Ihre Daten in den USA und hat sich dem EU_US Privacy Shield unterworfen https://www.privacyshield.gov/EU-US-Framework.

    Bereitstellung vorgeschrieben oder erforderlich:

    Die Bereitstellung Ihrer personenbezogenen Daten erfolgt freiwillig, allein auf Basis Ihrer Einwilligung. Sofern Sie den Zugriff unterbinden, kann es hierdurch zu Funktionseinschränkungen auf der Website kommen.

    diff --git a/League/Controllers/Language.cs b/League/Controllers/Language.cs index 9ca299b2..4b8b0c50 100644 --- a/League/Controllers/Language.cs +++ b/League/Controllers/Language.cs @@ -69,7 +69,11 @@ public IActionResult Index(string? culture, string? uiCulture, string? returnUrl Response.Cookies.Delete(cookieProvider.CookieName); Response.Cookies.Append(cookieProvider.CookieName, string.Empty, new CookieOptions { - Expires = DateTime.UtcNow.AddDays(-1), IsEssential = true, SameSite = SameSiteMode.Lax + Secure = true, + Expires = DateTime.UtcNow.AddDays(-1), + IsEssential = true, + HttpOnly = true, + SameSite = SameSiteMode.Lax }); return RedirectToLocal(returnUrl); @@ -81,7 +85,11 @@ public IActionResult Index(string? culture, string? uiCulture, string? returnUrl cookieValue, new CookieOptions { - Expires = DateTimeOffset.UtcNow.AddYears(1), IsEssential = true, SameSite = SameSiteMode.Lax + Secure = true, + Expires = DateTimeOffset.UtcNow.AddYears(1), + IsEssential = true, + HttpOnly = true, + SameSite = SameSiteMode.Lax }); return RedirectToLocal(returnUrl); diff --git a/League/ModelBinders/TimeOnlyModelBinder.cs b/League/ModelBinders/TimeOnlyModelBinder.cs index ac4cbb1f..5e9b0e3f 100644 --- a/League/ModelBinders/TimeOnlyModelBinder.cs +++ b/League/ModelBinders/TimeOnlyModelBinder.cs @@ -12,6 +12,7 @@ public class TimeOnlyModelBinder : IModelBinder { private readonly IModelBinder _fallbackBinder; private readonly ILogger _logger; + private const int RegexTimeout = 300; private const DateTimeStyles _dateTimeStyles = DateTimeStyles.AllowWhiteSpaces | DateTimeStyles.AllowLeadingWhite | DateTimeStyles.AllowTrailingWhite; @@ -56,8 +57,8 @@ private bool TryParseTimeOnly(string? text, out TimeOnly time) { if (text != null) { - text = Regex.Replace(text, "([^0-9]|^)([0-9])([0-9]{2})([^0-9]|$)", "$1$2:$3$4"); - text = Regex.Replace(text, "^[0-9]$", "0$0"); + text = Regex.Replace(text, "([^0-9]|^)([0-9])([0-9]{2})([^0-9]|$)", "$1$2:$3$4", RegexOptions.Compiled, TimeSpan.FromMilliseconds(RegexTimeout)); + text = Regex.Replace(text, "^[0-9]$", "0$0", RegexOptions.Compiled, TimeSpan.FromMilliseconds(RegexTimeout)); foreach (var format in _formats) { @@ -67,7 +68,7 @@ private bool TryParseTimeOnly(string? text, out TimeOnly time) return true; } } - + time = TimeOnly.MinValue; return false; } diff --git a/League/ModelBinders/TimeSpanModelBinder.cs b/League/ModelBinders/TimeSpanModelBinder.cs index c22330b9..eb80236d 100644 --- a/League/ModelBinders/TimeSpanModelBinder.cs +++ b/League/ModelBinders/TimeSpanModelBinder.cs @@ -12,6 +12,7 @@ public class TimeSpanModelBinder : IModelBinder { private readonly IModelBinder _fallbackBinder; private readonly ILogger _logger; + private const int RegexTimeout = 300; private const DateTimeStyles _dateTimeStyles = DateTimeStyles.AllowWhiteSpaces | DateTimeStyles.AllowLeadingWhite | DateTimeStyles.AllowTrailingWhite; @@ -56,8 +57,8 @@ private bool TryParseTime(string? text, out TimeSpan time) { if (text != null) { - text = Regex.Replace(text, "([^0-9]|^)([0-9])([0-9]{2})([^0-9]|$)", "$1$2:$3$4"); - text = Regex.Replace(text, "^[0-9]$", "0$0"); + text = Regex.Replace(text, "([^0-9]|^)([0-9])([0-9]{2})([^0-9]|$)", "$1$2:$3$4", RegexOptions.Compiled, TimeSpan.FromMilliseconds(RegexTimeout)); + text = Regex.Replace(text, "^[0-9]$", "0$0", RegexOptions.Compiled, TimeSpan.FromMilliseconds(RegexTimeout)); foreach (var format in _formats) { diff --git a/League/MultiTenancy/TenantResolver.cs b/League/MultiTenancy/TenantResolver.cs index b2879421..fec90746 100644 --- a/League/MultiTenancy/TenantResolver.cs +++ b/League/MultiTenancy/TenantResolver.cs @@ -61,8 +61,8 @@ private void SetMostRecentTenantCookie(ITenantContext tenant) new CookieOptions { Path = "/", - HttpOnly = false, - Secure = false, + HttpOnly = true, + Secure = true, SameSite = SameSiteMode.Lax, Expires = DateTimeOffset.Now.AddYears(1), IsEssential = true