編成・補給・修理・遠征

この章では通常画面でする艦隊の操作に関するAPIを解説します。

編成

艦隊の編成を変更するには、 /kcsapi/api_req_hensei/change のAPIを叩きます。 パラメータは、 第 api_id 艦隊の api_ship_idx 番目を api_ship_id の艦娘に変更するという形式です。 艦娘を外す場合には api_ship_id-1 を指定します。

Flashクライアントからは1つの艦隊に同じ種類の艦娘を配置できないようになっていますが、 APIでは何も制限されておらず、同じ種類どころか全く同じship_idで6隻埋めることも可能です。 今のところ伊401はイベント報酬の1隻しか無いはずですが、全員伊401で埋めることが可能ということです。

さらに、通常変更できない状況でもAPIでは何も制限しません。 出撃中の艦隊でも遠征中の艦隊でも変更可能です。

補給

艦隊に補給するには、 /kcsapi/api_req_hokyu/charge のAPIを叩きます。 api_id_items に補給する艦娘のidを , で繋げた文字列を指定します。

編成と同様に制限はほとんど無く、 出撃中の補給も遠征中の補給も自由です。 Flashでは1ページごとに補給しなくてはいけませんが、APIはおそらく全艦一気に補給できます。

修理

艦娘を修理するには、 /kcsapi/api_req_nyukyo/start のAPIを叩きます。 パラメータには api_dock_idapi_ship_id 、バケツを使う場合は api_highspeed1 に設定します。 途中でバケツを使う場合は、 /kcsapi/api_req_nyukyo/speedcharge のAPIを叩きます。

もう予想できると思いますが、修理のAPIにも制限はほとんどなく、 出撃中でも遠征中でも修理できます。 ボスに到達したら全艦娘にバケツぶっかけてなんてこともできてしまいます。 唯一チェックが入るのはドックが使用済みかどうかというところだけです。

問題点

API設計の基本中の基本です。必ずサーバ側で入力が正しいかチェックしましょう。 APIのみならず、webシステムを作るときは必ずサーバ側で入力値のチェックをしましょう

例えばhtml5には入力値のチェック機構が入りましたが、あれは単なる入力補助でしかありません。 javascriptで入力値のチェックをしたりすることもありますが、 それも余計なHTTPリクエストを減らしたいという目的で使うことがほとんどです。 その場合にも必ずサーバ側で入力値のチェックをしましょう

根本的な問題

そもそも、サーバ側で入力値のチェックをしていないということは、 エンジニアがある致命的な状態に陥っていることを示しています。 それはクライアントプログラムを信用しているという間違った思想です。

Webシステムを作る上で、絶対にクライアントを信用してはいけません。 HTTPの仕様上、何が正しいのか、何が正しくないのか判断することはできません。 そもそも正・不正の概念を定義することすら不可能なんじゃないでしょうか。 全ての通信は、実行するユーザには基本的に全て見えてしまうし、 それを完全再現することも容易です。 なので絶対にクライアントを信用してはいけません

実際、 IJN48 を実装する時も通信の内容を解析しかしていません。 やっていることもflashクライアントが出すリクエストと同じものを出しているだけです。 flashクライアントの逆アセンブルは多分規約で禁止されているとおもいますが、そんなもの全く意味がないのです。

さて、 IJN48 とは何でしょうか? APIを叩くbotでしょうか? それともflashのプログラムを実行する処理系でしょうか? それともブラウザそのものでしょうか? 運営の言う「正しくプレイしないとBANするぞ」の正しいプレイとは何でしょうか? 本質的にそんなもの定義できないんですよ。 ネットワーク上では全ての通信が平等です。 そこには正しいとか正しくないとか無いのです。

===[column] セキュリティ設計のはなし

Webシステムの設計でクライアントを信用してはいけないように、 セキュリティの設計を考える時は、絶対に人間を信用してはいけません。 基本的に人間は全員犯罪者常に攻撃の機会を狙っていると思わなければいけません。 この「人間」には、 同僚や親兄弟はおろか自分自身も含みます。 エンジニアは日々、システムを知り尽くした自分ならどんな犯罪を犯すかを想像し、 それでも攻撃できないよう、ありとあらゆる可能性を潰す、という仕事をしています。

そりゃ病むに決まってんだろ・・・

まとめ: API改善ガイド

  • サーバで入力値を全てチェックする

  • クライアントを信用しない

  • 正しいプレイなんか定義できない

とはいうものの、正しいプレイを定義する方法は実は1つだけあります。 それは指定された環境以外での実行を許可しないという方針にすることです。 艦これの場合、OSとそのバージョン、ブラウザとそのバージョン、 flashプレイヤーの製造元とバージョンを指定して許可すればよいでしょう。 もちろんこれはクソ不自由Webの世界の理念に反することは明らかですし、 とりあえずOperaユーザが発狂する姿がありありと目に浮かびます。

Last updated