Flutterアライメント

アライメントは、要素の位置(左寄せ、中央寄せ、右寄せ)を指定すること

  • Main Axisは、ウィジェットの向きに

  • Cross Axisは、ウィジェットと交差する向きに

公式ページ「Layouts in Flutter」

Flutterで、StatefulWidget/StatelessWidgetの雛形を作る

Android Studioで「st」と打つと、StatefulWidget/StatelessWidget の雛形を作れる

Flutterチャンネルを切り替える

現在のチャンネルを確認する

1
flutter channel

チャンネルをmasterへ変更する

1
flutter channel master

別チャンネルを使う場合は、アップグレードする

1
flutter upgrade

Flutterドロップダウンメニュー

Flutterで、ドロップダウンメニューを作ってみた

リストから、フォントサイズを選択できるようにする

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
// 選択肢のフォントサイズ一覧を作成 (14〜50)
static var fontSizeList = List.generate(37, (i) => 14 + i);

// ドロップダウンメニュー内のアイテム
final List<DropdownMenuItem<String>> _dropDownMenuItem = fontSizeList.map(
(int fontSize) {
return new DropdownMenuItem<String>(
value: fontSize.toString(),
child: Text(fontSize.toString()),
);
},
).toList();

Widget build(BuildContext context) {
return Scaffold(
//...
child: Column(
children: <Widget>[
Flexible(
child: ListView(
children: <Widget>[
ListTile(
leading: Icon(Icons.format_size),
title: Text("フォントサイズを選ぶ: "),
trailing: DropdownButton<String>(
value: _selectedFontSize,
onChanged: (String newValue) {
setState(() {
this._selectedFontSize = newValue;
});
},
items: this._dropDownMenuItem,
),
),
],
),
),
],
),
//....
);
}

Flutterアイコン

Flutterで用意されているマテリアルアイコンを使う

公式 Iconsクラス

コード例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: const <Widget>[
Icon(
Icons.favorite,
color: Colors.pink,
size: 24.0,
semanticLabel: 'Text to announce in accessibility modes',
),
Icon(
Icons.audiotrack,
color: Colors.green,
size: 30.0,
),
Icon(
Icons.beach_access,
color: Colors.blue,
size: 36.0,
),
],
)

Font Awesomeを使う

プラグイン font_awesome_flutter

使えるアイコン

1
2
3
4
5
6
7
8
9
10
11
import 'package:font_awesome_flutter/font_awesome_flutter.dart';

class MyWidget extends StatelessWidget {
Widget build(BuildContext context) {
return new IconButton(
// Use the FontAwesomeIcons class for the IconData
icon: new Icon(FontAwesomeIcons.gamepad),
onPressed: () { print("Pressed"); }
);
}
}

Flutterダークテーマ対応

ダークテーマに対応するには、MaterialAppに、ダークテーマ用のThemeDataを設定するだけ

Android OSの設定で、ダークテーマを適用すると、自動的に切り替わる

1
2
3
4
5
6
7
8
9
10
MaterialApp(
theme: ThemeData(
brightness: Brightness.light,
primaryColor: Colors.red,
),
// ダークテーマ用
darkTheme: ThemeData(
brightness: Brightness.dark,
),
);

Flutter 難読化と最小化

手順

  1. ファイルを新規作成

    android/app/proguard-rules.pro

    1
    2
    3
    4
    5
    6
    7
    #Flutter Wrapper
    -keep class io.flutter.app.** { *; }
    -keep class io.flutter.plugin.** { *; }
    -keep class io.flutter.util.** { *; }
    -keep class io.flutter.view.** { *; }
    -keep class io.flutter.** { *; }
    -keep class io.flutter.plugins.** { *; }
  2. ビルド設定

    android/app/build.gradle

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    android {
    ...
    buildTypes {
    release {
    signingConfig signingConfigs.release
    minifyEnabled true
    useProguard true
    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
    }
    }

XSSとCSRFの違いメモ

3分でわかるXSSとCSRFの違い

XSS

ユーザーがWebページにアクセスすることで不正なスクリプトが実行されてしまう脆弱性または攻撃手法

xss

XSSによる被害例

攻撃者による不正ログイン(なりすまし)
利用者のCookieが攻撃者の手に渡ることで、Cookie内にある利用者のセッション情報がそのまま使用されてしまい、利用者の名をかたってサービスを使用されてしまう危険性があります。

XSSへの代表的な対策

Webページに出力するデータのエスケープ処理
Webページの出力に際して特別な意味を持つ文字列(例えば「<」、「&」など)は単なる文字列として出力するようにしましょう。また、エスケープの対象としては、利用者が画面から入力した値はもちろん、外部システムからのデータなどWebページの出力対象となるものは必ずエスケープすることが重要

CSRF

Webアプリケーション利用者自身が意図しない処理が実行されてしまう脆弱性または攻撃手法

csrf

CSRFによる被害例

利用者の意図しないWebアプリケーション上の処理実行
図でも表したように、本来はログインした利用者のみが許される記事の投稿処理などがあげられます。

CSRFへの代表的な対策

Formページ返却時のトークン付与
今回の例でいうと、はじめに掲示板への書き込み画面を表示する際にサーバがクライアントに対して特定の文字列(トークン)を設定します。実際に書き込みのリクエストがあった際にサーバーが「この人に送ったトークンと同じトークンがリクエストに入ってる?」と確認することで、攻撃者からの不正なリクエストを防ぐことができます。これは、攻撃者は利用者に送信したトークンの値を知らないためです

XSSとCSRFの違い

観点 XSS CSRF
実行される場所 Webブラウザ(Client) Webアプリサーバ(Server)
実行可能な処理 基本的に自由*1 Webアプリで定義された処理
実行の前提 特になし Webアプリにログイン済み*2

*1 JavaScriptで実行可能な範囲であればという意味です
*2 Webアプリ利用者(被害者)がCSRF脆弱性を持つWebアプリケーションに対してログイン済みという意味です

Cookieのhttponly属性

参考

Cookieの基本

httponly属性

次のように、CookieをHTTPレスポンスヘッダーで送るときにhttponly属性を付けると、そのCookieはJavaScriptからはアクセスできなくなる。

1
Set-Cookie: a=apple; httponly; path=/

httponly属性により、悪意のあるJavaScriptからCookieを守ることができる。

JSONレスポンスのXSS

脅威

Internet Explorer 8 など、一部の古いブラウザでは、HTML構文を含むファイルをHTML として
誤ってレンダリングする場合があります。
このため、悪意あるユーザがJSON レスポンスに悪意あるHTML構文の挿入に成功した場
合、XSSが発火する可能性があります。

対策

全てのJSONレスポンスのHTTPヘッダに以下のようなヘッダを設定することで XSS のリスクを緩和できます。

1
2
X-Content-Type-Options: nosniff
Content-Disposition: attachment; filename="XXX.json

(XXXは任意のファイル名)
X-Content-Typeでコンテンツ種別の推論を無効化することで、誤ってHTML として表示される事を防止します。

Content-Dispositionでダウンロードファイルとして明示することでブラウザでのレンダリングを防止します。

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×