コンピュータプログラミングにおいて、マジックストリングとは、プログラマーが外部からは決して来ないと信じている入力であり、本来は隠された機能を起動する。このプログラムのユーザーは、多くの場合、期待通りの応答を返す入力を与えるだろう。しかし、ユーザーが実際には無意識のうちに(意図せず)定義済みの入力を与え、内部機能を呼び出した場合、プログラムの応答はユーザーにとって全く予想外のものとなることが多く、そのため「魔法の」ように見える。[1] [より適切な出典が必要]
背景
通常、マジックストリングの実装は時間的制約によるものです。開発者は、問題を深く掘り下げてより良い解決策を見つけるのではなく、迅速な解決策を見つけなければなりません。例えば、ユーザーの個人情報を取得してクレジットカード番号を検証するプログラムをテストする場合、開発者はマジックストリングのショートカットを追加することがあります。このショートカットでは、クレジットカード番号として「***」というあり得ない入力を入力すると、カードが有効であるかのようにプログラムが自動的に処理を進め、検証に時間を費やすことなく処理が実行されます。開発者がマジックストリングの削除を忘れ、完成したプログラムのユーザーがフォームに入力する際に、仮のクレジットカード番号として「***」を入力した場合、ユーザーは意図せず隠された機能を起動してしまいます。
解決
原因となる状況/問題
多くの場合、開発者はプロジェクトに関与し始めた当初から、制御できない重大な時間的制約に直面します。その結果、 このアンチパターンにつながる可能性のある一般的な問題は次のとおりです。
- Null != null [2]、またはデータ型が同一と思われる型とビット単位で比較されないあらゆるバリエーション。これは、同じ開発環境(同じプログラミング言語とコンパイラ)内であっても発生する可能性がある問題です。この問題は数値型とブール型で長い歴史があり、ほとんどのコンパイラはこれを適切に処理します(適切な警告とエラー、デフォルトの解決など)。文字列などのNull許容型では、 NULLの定義が歴史的に異なるという難しさがあります。生成されるエラー/警告は、多くの場合、一般的なエラー、または「最も適切な」デフォルトエラーであり、そのメッセージは実際には何が起こっているかを説明していません。開発者がデバッグを通じて問題を追跡するための十分な手がかりを得られない場合、近道を取り、「デフォルト」文字列でコーディングすることが、プロジェクトをスケジュールどおりに進める唯一の方法かもしれません。これに対する解決策の1つは、Nullオブジェクトパターンの適用です。[3]
- 行き詰まったプログラム。設計は一見単純明快でシンプルに見えても、開発計画の終盤で予期せぬ事態が発生し、ユーザー入力に関する論理的な欠陥が見つかることがあります。そのため、開発者は、そのような状況に対処するために、特別なセキュリティ/運用上の余裕を持ったユーザー入力の実装の必要性を感じることがあります。これは皮肉なことです。なぜなら、最初からより堅牢な設計をしていれば、欠陥に対処する余地があった可能性が高いことが明らかになる場合があるからです。しかし、この方法では実装に時間がかかりすぎ、設計と実装をシンプルに保ち、当初の必要な要件のみを満たすというKISSの基本的なエンジニアリングコンセプトに反する可能性がありました。
- グローバルフラグへの外部アクセスを許可する。[4]グローバルフラグは誤ってまたは悪意を持って設定されることはないという過信(多くの場合、かなり合理的な仮定)により、特に単純なインターフェースを持つ小規模なアプリケーションでは、テストやデバッグの目的でのこのような実装が正当化されます。しかし、プログラムの配布が相当な規模であれば、誰かがフラグを設定するのは時間の問題です。明らかな解決策は、グローバル変数をそのような方法で使用しないことです。開発者がうっかりフラグを状況に応じてアクセス可能にしてしまう可能性もあります。そうすると、マジックストリング自体は、プログラムによって他の入力と同じように処理されてしまいます。[5]その場合、ユーザーは設定を再現するだけでなく、ユーザーインターフェースがフラグに個別に設定を受け入れることを可能にする特定の状況やイベントも再現する必要があります これははるかに可能性が低い(ただし、まだ起こり得る)シナリオです。
厳密なフォーマット
入力の形式を制限することは、メンテナンス(バグ修正)の解決策として考えられます。 これは基本的に、入力情報が正しい形式であることを検証して、マジックストリングがユーザーに発見される可能性を減らすことを意味します。例としては、電話番号が数字のみ(および限られた範囲でスペースと句読点も)含まれていることを確認することや、人名に名と姓があり(適切に大文字化されている)、検証コードにマジックストリングの例外が作成されるため、検証によって拒否されることはありません。ユーザーはフォーマットの厳格な強制にすぐに気付く可能性が高いため、フォーマットに準拠していない文字列を入力しようとは思わないと考えられます。したがって、ユーザーがマジックストリングを試す可能性は非常に低いと考えられます。
あらゆる入力検証プロセスと同様に、一部のユーザーによるアプリケーションの使用を意図せず制限するようなフォーマットを採用しないことが重要です。例えば、電話番号や郵便番号[6]の入力を、ある国のシステムに基づいて制限すること(例えば、すべてのユーザーに5桁の郵便番号の入力を求めるなど)は、他の国に拠点を置く正当なユーザーに問題を引き起こす可能性があります。
意図的な実装
アンチパターンではよくあることですが、実装においてマジックストリングが正しい解決策となる特定のシナリオが存在します。例としては、チートコード[7]やイースターエッグなどが挙げられます。さらに、ユーザーがマジックストリングを考案し、それを受け入れるようにコーディングされていないシステムでは、ナンバープレートが表示されないなど、予期しない結果が生じる場合もあります。[8]
事件
このリストは不完全です。不足している項目を追加してご協力ください。 ( 2022 年 1 月) |
以下は、マジック ストリングの使用によって問題が発生した既知の事例の一覧です。
- 車両登録プレートに個人用文字列を記載したドライバーが、誤った交通違反切符を受け取った事例が複数ありました。問題となった切符発行システムでは、警察官がナンバープレートのない車両の交通違反切符に「NOPLATE(ナンバープレートなし)」「NOTAG(タグなし)」「MISSING(紛失)」などの類似の文字を記入していました。そのため、ドライバーが実際にこれらの文字を記載したナンバープレートを取得した際に問題が発生し、結果として、ナンバープレートのない車両を対象とする交通違反切符が多数発行されるようになりました。[8]
- 1999年、ハッカーがHotmailのセキュリティ上の欠陥を発見しました。この欠陥により、誰でも「eh」というパスワードでHotmailアカウントにログインできる状態になりました。当時、これは「Web史上最も広範囲に及んだセキュリティインシデント」と呼ばれました。[9]
- Nullという姓を持つ人々は、オンラインシステムの使用中に、航空券の予約、政府の税務ウェブサイトの利用、公共料金の支払いなど、様々な問題を報告しています。[10]この問題は、これらのシステムが名前をヌルポインタと誤認することから生じます。システムによっては、名前が表示されなかったり、ユーザーに別の名前の入力を求めたり(場合によっては名前欄が空白のままであることを示すメッセージが表示されたり)、エラーメッセージが表示されたりすることがあります。[11]
参照
- マジックナンバー(プログラミング)
- 時間のフォーマットと保存のバグ、マジックによって引き起こされる問題
- センチネル値(別名:フラグ値、トリップ値、不正値、信号値、ダミーデータ)
- カナリア値、バッファオーバーフローを検出するための特別な値
- 同じ起源を持つビデオゲームのチートコード
- XYZZY(コマンド)
参考文献
- ^ Chris Falter (2008年3月6日)、「A Good Solution for Magic String Data」、Egghead Cafe Tuturiols、2009年11月13日時点のオリジナルよりアーカイブ、2009年5月11日閲覧。
- ^ Wang Lam (2003年5月21日)、「SQLにおけるNULLの挙動」、スタンフォード大学、 2009年5月13日閲覧。
- ^ Eric Freeman、Elisabeth Freeman、Kathy Sierra、Bert Bates、2004年、「Head First Design Patterns」、第1版、O'Reilly、第6章、214ページ、「The Command Pattern」、ISBN 0-596-00712-4、ISBN 978-0-596-00712-6
- ^ James McCaffrey (2009)、SSL を使用した ASP.NET Web アプリのテスト自動化、Microsoft 、 2009 年5 月 13 日取得
- ^ Andrew Cumming; 2007年、「SQL Hacks」、第1版、O'Reilly、174ページ、「SQLインジェクション攻撃の防止」、ISBN 0-596-52799-3、ISBN 978-0-596-52799-0
- ^ Brian Knight、Allan Mitchell、Darren Green、Douglas Hinson、Kathi Kellenberger、2005年、「Professional SQL Server 2005 Integration Services」、第1版、John Wiley and Sons、第5章、129ページ、「Dirty Dataの処理」 、ISBN 0-7645-8435-9、ISBN 978-0-7645-8435-0
- ^ Sezen, Tonguc Ibrahim; Isikoglu, Digdem (2007年4月27日). 「オザンからゴッドモードへ:異なる文化圏におけるインタラクティブエンターテイメントにおける不正行為」(PDF) p. 8. 2009年1月24日閲覧。
- ^ ab 「ナンバープレートに『NO PLATE』と書いてあるとどうなるのか?」1999年10月30日。
- ^ Glave, James (1999年8月30日). 「Hotmail Hackers: 'We Did It'」. Wired . Condé Nast . 2024年7月16日閲覧。
- ^ クリス・バラニウク(2016年3月25日)「コンピューターを壊してしまうような名前を持つ不運な人たち」BBC.com 2022年1月30日閲覧。
- ^ Null, Christopher (2015年11月5日). 「こんにちは、私はミスター・ヌルです。私の名前はコンピューターから見えなくします」. Wired . 2022年1月30日閲覧。