Cursor rule
.cursor/rules/dart-security.mdcCursor rules
Quality
66/100
Scores the file, not the repository.Length
627 words
9 headings · 5 code blocksRepository
6
— · pushed 80 days agoLast changed
3 days ago
First indexed 3 days ago.12345678# Dart/Flutter Security910> This file extends [common/security.md](../common/security.md) with Dart, Flutter, and mobile-specific content.1112## Secrets Management1314- Never hardcode API keys, tokens, or credentials in Dart source15- Use `--dart-define` or `--dart-define-from-file` for compile-time config (values are not truly secret — use a backend proxy for server-side secrets)16- Use `flutter_dotenv` or equivalent, with `.env` files listed in `.gitignore`17- Store runtime secrets in platform-secure storage: `flutter_secure_storage` (Keychain on iOS, EncryptedSharedPreferences on Android)1819```dart20// BAD21const apiKey = 'sk-abc123...';2223// GOOD — compile-time config (not secret, just configurable)24const apiKey = String.fromEnvironment('API_KEY');2526// GOOD — runtime secret from secure storage27final token = await secureStorage.read(key: 'auth_token');28```2930## Network Security3132- Enforce HTTPS — no `http://` calls in production33- Configure Android `network_security_config.xml` to block cleartext traffic34- Set `NSAppTransportSecurity` in `Info.plist` to disallow arbitrary loads35- Set request timeouts on all HTTP clients — never leave defaults36- Consider certificate pinning for high-security endpoints3738```dart39// Dio with timeout and HTTPS enforcement40final dio = Dio(BaseOptions(41 baseUrl: 'https://api.example.com',42 connectTimeout: const Duration(seconds: 10),43 receiveTimeout: const Duration(seconds: 30),44));45```4647## Input Validation4849- Validate and sanitize all user input before sending to API or storage50- Never pass unsanitized input to SQL queries — use parameterized queries (sqflite, drift)51- Sanitize deep link URLs before navigation — validate scheme, host, and path parameters52- Use `Uri.tryParse` and validate before navigating5354```dart55// BAD — SQL injection56await db.rawQuery("SELECT * FROM users WHERE email = '$userInput'");5758// GOOD — parameterized59await db.query('users', where: 'email = ?', whereArgs: [userInput]);6061// BAD — unvalidated deep link62final uri = Uri.parse(incomingLink);63context.go(uri.path); // could navigate to any route6465// GOOD — validated deep link66final uri = Uri.tryParse(incomingLink);67if (uri != null && uri.host == 'myapp.com' && _allowedPaths.contains(uri.path)) {68 context.go(uri.path);69}70```7172## Data Protection7374- Store tokens, PII, and credentials only in `flutter_secure_storage`75- Never write sensitive data to `SharedPreferences` or local files in plaintext76- Clear auth state on logout: tokens, cached user data, cookies77- Use biometric authentication (`local_auth`) for sensitive operations78- Avoid logging sensitive data — no `print(token)` or `debugPrint(password)`7980## Android-Specific8182- Declare only required permissions in `AndroidManifest.xml`83- Export Android components (`Activity`, `Service`, `BroadcastReceiver`) only when necessary; add `android:exported="false"` where not needed84- Review intent filters — exported components with implicit intent filters are accessible by any app85- Use `FLAG_SECURE` for screens displaying sensitive data (prevents screenshots)8687```xml88<!-- AndroidManifest.xml — restrict exported components -->89<activity android:name=".MainActivity" android:exported="true">90 <!-- Only the launcher activity needs exported=true -->91</activity>92<activity android:name=".SensitiveActivity" android:exported="false" />93```9495## iOS-Specific9697- Declare only required usage descriptions in `Info.plist` (`NSCameraUsageDescription`, etc.)98- Store secrets in Keychain — `flutter_secure_storage` uses Keychain on iOS99- Use App Transport Security (ATS) — disallow arbitrary loads100- Enable data protection entitlement for sensitive files101102## WebView Security103104- Use `webview_flutter` v4+ (`WebViewController` / `WebViewWidget`) — the legacy `WebView` widget is removed105- Disable JavaScript unless explicitly required (`JavaScriptMode.disabled`)106- Validate URLs before loading — never load arbitrary URLs from deep links107- Never expose Dart callbacks to JavaScript unless absolutely needed and carefully sandboxed108- Use `NavigationDelegate.onNavigationRequest` to intercept and validate navigation requests109110```dart111// webview_flutter v4+ API (WebViewController + WebViewWidget)112final controller = WebViewController()113 ..setJavaScriptMode(JavaScriptMode.disabled) // disabled unless required114 ..setNavigationDelegate(115 NavigationDelegate(116 onNavigationRequest: (request) {117 final uri = Uri.tryParse(request.url);118 if (uri == null || uri.host != 'trusted.example.com') {119 return NavigationDecision.prevent;120 }121 return NavigationDecision.navigate;122 },123 ),124 );125126// In your widget tree:127WebViewWidget(controller: controller)128```129130## Obfuscation and Build Security131132- Enable obfuscation in release builds: `flutter build apk --obfuscate --split-debug-info=./debug-info/`133- Keep `--split-debug-info` output out of version control (used for crash symbolication only)134- Ensure ProGuard/R8 rules don't inadvertently expose serialized classes135- Run `flutter analyze` and address all warnings before release136
Also in ThanhTrunggDEV/DontBeLazy
Diff this repo’s formatsOne repository carrying more than one format is the comparison this product exists for: does anyone actually write different content in each file, or is one a copy of the other?
| Repository | Format | Stack | Covers | Score | Changed |
|---|---|---|---|---|---|
| ThanhTrunggDEV/DontBeLazy.cursor/rules/zh-agents.mdc · 6 | Cursor rules | no sections | 50/100 | 3 days ago | |
| ThanhTrunggDEV/DontBeLazy.cursor/rules/zh-patterns.mdc · 6 | Cursor rules | api | 30/100 | 3 days ago | |
| ThanhTrunggDEV/DontBeLazy.agent/AGENTS.md · 6 | AGENTS.md | buildteststylearch+4 | 77/100 | 3 days ago | |
| ThanhTrunggDEV/DontBeLazy.cursor/AGENTS.md · 6 | AGENTS.md | buildteststylearch+4 | 77/100 | 3 days ago | |
| ThanhTrunggDEV/DontBeLazy.cursor/rules/common-agents.mdc · 6 | Cursor rules | agent-behaviour | 50/100 | 3 days ago | |
| ThanhTrunggDEV/DontBeLazy.cursor/rules/common-code-review.mdc · 6 | Cursor rules | styletesting-strategygitsecurity+3 | 65/100 | 3 days ago | |
| ThanhTrunggDEV/DontBeLazy.cursor/rules/common-coding-style.mdc · 6 | Cursor rules | style | 54/100 | 3 days ago | |
| ThanhTrunggDEV/DontBeLazy.cursor/rules/common-development-workflow.mdc · 6 | Cursor rules | gitagent-behaviour | 39/100 | 3 days ago | |
| ThanhTrunggDEV/DontBeLazy.cursor/rules/common-git-workflow.mdc · 6 | Cursor rules | lint-formatgitagent-behaviour | 43/100 | 3 days ago | |
| ThanhTrunggDEV/DontBeLazy.cursor/rules/common-hooks.mdc · 6 | Cursor rules | styletypessecuritydo-not | 36/100 | 3 days ago | |
| ThanhTrunggDEV/DontBeLazy.cursor/rules/common-patterns.mdc · 6 | Cursor rules | lint-formatstyleapi | 52/100 | 3 days ago | |
| ThanhTrunggDEV/DontBeLazy.cursor/rules/common-performance.mdc · 6 | Cursor rules | buildperformance | 48/100 | 3 days ago | |
| ThanhTrunggDEV/DontBeLazy.cursor/rules/common-security.mdc · 6 | Cursor rules | security | 39/100 | 3 days ago | |
| ThanhTrunggDEV/DontBeLazy.cursor/rules/common-testing.mdc · 6 | Cursor rules | testtesting-strategyagent-behaviour | 34/100 | 3 days ago | |
| ThanhTrunggDEV/DontBeLazy.cursor/rules/cpp-coding-style.mdc · 6 | Cursor rules | lint-formatstyle | 52/100 | 3 days ago | |
| ThanhTrunggDEV/DontBeLazy.cursor/rules/cpp-hooks.mdc · 6 | Cursor rules | buildlint-formatdeployment | 60/100 | 3 days ago | |
| ThanhTrunggDEV/DontBeLazy.cursor/rules/cpp-patterns.mdc · 6 | Cursor rules | style | 54/100 | 3 days ago | |
| ThanhTrunggDEV/DontBeLazy.cursor/rules/cpp-security.mdc · 6 | Cursor rules | securityperformancedo-not | 73/100 | 3 days ago | |
| ThanhTrunggDEV/DontBeLazy.cursor/rules/cpp-testing.mdc · 6 | Cursor rules | testtesting-strategy | 55/100 | 3 days ago | |
| ThanhTrunggDEV/DontBeLazy.cursor/rules/csharp-coding-style.mdc · 6 | Cursor rules | lint-formatstyletypes | 66/100 | 3 days ago |
Diff against .cursor/rules/zh-agents.mdc Diff against .cursor/rules/zh-patterns.mdc Diff against .agent/AGENTS.md Diff against .cursor/AGENTS.md Diff against .cursor/rules/common-agents.mdc Diff against .cursor/rules/common-code-review.mdc Diff against .cursor/rules/common-coding-style.mdc Diff against .cursor/rules/common-development-workflow.mdc Diff against .cursor/rules/common-git-workflow.mdc Diff against .cursor/rules/common-hooks.mdc Diff against .cursor/rules/common-patterns.mdc Diff against .cursor/rules/common-performance.mdc Diff against .cursor/rules/common-security.mdc Diff against .cursor/rules/common-testing.mdc Diff against .cursor/rules/cpp-coding-style.mdc Diff against .cursor/rules/cpp-hooks.mdc Diff against .cursor/rules/cpp-patterns.mdc Diff against .cursor/rules/cpp-security.mdc Diff against .cursor/rules/cpp-testing.mdc Diff against .cursor/rules/csharp-coding-style.mdc
Similar configs
Same format, overlapping stack, ranked by quality.
| Repository | Format | Stack | Covers | Score | Changed |
|---|---|---|---|---|---|
| hiromaily/go-crypto-wallet.cursor/rules/typescript.mdc · 126 | Cursor rules | setupbuildtestlint-format+6 | 100/100 | 3 days ago | |
| TechSquidTV/Hermes.cursor/rules/10-hermes-api.mdc · 45 | Cursor rules | testlint-formatstylearch+5 | 100/100 | 3 days ago | |
| dodgecfr/combatfilms-webapp.cursor/rules/frontend.mdc · 0 | Cursor rules | setuptestlint-formatstyle+7 | 99/100 | 3 days ago | |
| deifos/clipmira-subtitles.cursor/rules/frontend.mdc · 1 | Cursor rules | setuptestlint-formatstyle+7 | 99/100 | 3 days ago | |
| markstev/mark-starter.cursor/rules/frontend.mdc · 0 | Cursor rules | setuptestlint-formatstyle+6 | 99/100 | 3 days ago | |
| Allymahmoud/case-intake-platform.cursor/rules/frontend.mdc · 0 | Cursor rules | setuptestlint-formatstyle+7 | 99/100 | 3 days ago | |
| langflow-ai/langflow.cursor/rules/docs_development.mdc · 153k | Cursor rules | setupbuildtestlint-format+7 | 97/100 | 3 days ago | |
| TechSquidTV/Hermes.cursor/rules/20-hermes-api-tests.mdc · 45 | Cursor rules | teststyletesting-strategysecurity+3 | 97/100 | 3 days ago |
