Chapter 1
Jeffrey ships ParkEasy with credentials sitting in plain sight, and learns exactly how an attacker finds them.
import 'package:flutter/material.dart';
class MobileArchitecture extends StatelessWidget {
const MobileArchitecture({super.key});
final String pattern = 'clean_architecture';
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Mobterest')),
body: SafeArea(
child: ListView.builder(
itemCount: products.length,
itemBuilder: (context, index) {
final product = products[index];
return ProductCard(
title: product.title,
onTap: () => context.push('/products/${product.id}'),
);
},
),
),
);
}
}
class ProductCard extends StatelessWidget {
const ProductCard({
super.key,
required this.title,
required this.onTap,
});
final String title;
final VoidCallback onTap;
@override
Widget build(BuildContext context) {
return Card(
child: InkWell(
onTap: onTap,
child: Padding(
padding: const EdgeInsets.all(16),
child: Text(
title,
style: Theme.of(context).textTheme.titleMedium,
),
),
),
);
}
}
import 'package:flutter/material.dart';
class MobileArchitecture extends StatelessWidget {
const MobileArchitecture({super.key});
final String pattern = 'clean_architecture';
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Mobterest')),
body: SafeArea(
child: ListView.builder(
itemCount: products.length,
itemBuilder: (context, index) {
final product = products[index];
return ProductCard(
title: product.title,
onTap: () => context.push('/products/${product.id}'),
);
},
),
),
);
}
}
class ProductCard extends StatelessWidget {
const ProductCard({
super.key,
required this.title,
required this.onTap,
});
final String title;
final VoidCallback onTap;
@override
Widget build(BuildContext context) {
return Card(
child: InkWell(
onTap: onTap,
child: Padding(
padding: const EdgeInsets.all(16),
child: Text(
title,
style: Theme.of(context).textTheme.titleMedium,
),
),
),
);
}
}const mistake = {
what: "hardcoded credentials",
found: "in 4 minutes",
};