コンピュータプログラミングにおいて、マジックストリングとは、プログラマーが外部から来ることはないと信じている入力であり、隠された機能をアクティブにするものである。このプログラムのユーザーは、ほとんどの状況で予想される応答を返す入力を提供する可能性が高い。しかし、ユーザーが実際に事前定義された入力を無意識に提供し、内部機能を呼び出した場合、プログラムの応答はユーザーにとってまったく予想外のものになることが多い(したがって「魔法の」ように見える)。[1]
背景
通常、マジック ストリングの実装は時間的制約によります。開発者は、問題をより深く探究してより良い解決策を見つけるのではなく、迅速な解決策を見つける必要があります。
たとえば、ユーザーの個人情報を取得してクレジットカード番号を検証するプログラムをテストする場合、開発者はマジック ストリング ショートカットを追加すると、クレジットカード番号として「***」というあり得ない入力を入力すると、カードが有効であるかのようにプログラムが自動的に処理を進め、検証に時間を費やすことなく続行されます。開発者がマジック ストリングを削除するのを忘れ、最終プログラムのユーザーがフォームに入力する際に、プレースホルダー クレジットカード番号として「***」を入力した場合、ユーザーは誤って隠された機能をトリガーすることになります。
解決
原因となる状況/問題
多くの場合、開発者がプロジェクトに関与し始めた当初から、開発者が制御できない大きな時間的制約があります。結果としてこのアンチパターンにつながる可能性のある一般的な問題は次のとおりです。
- Null != null [2]または、あるデータ型が、同一と思われる型とビット単位で比較されないバリエーション。これは、同じ開発環境 (同じプログラミング言語とコンパイラ) 内であっても発生する可能性がある問題です。この問題は、数値型とブール型で長い歴史があり、ほとんどのコンパイラはこれを適切に処理します (適切な警告とエラー、デフォルトの解決など)。文字列などのNull 可能型では、 NULLの定義が歴史的に異なるという難しさがあります。生成されるエラー/警告は、多くの場合、一般的なもの、または「最適な」デフォルトのエラーであり、そのメッセージは実際には何が起こっているかを説明していません。開発者がデバッグを通じて問題を追跡するための十分な手がかりを得られない場合、近道を取り、「デフォルト」文字列でコーディングすることが、プロジェクトをスケジュールどおりに進める唯一の方法である可能性があります。これに対する 1 つの解決策は、Null オブジェクト パターンの適用です。[3]
- 行き詰まったプログラム。時には、設計は単純明快でシンプルに見えても、計画された開発の終盤で予期せぬ状況が頻繁に発生し、ユーザー入力によっては論理的な欠陥があることが判明することがあります。そのため、開発者は、そのような状況に対処するために、特別なセキュリティ/運用上の余裕を持ったユーザー入力を実装する必要性を感じることがあります。これは特に皮肉なことです。なぜなら、最初からより堅牢な設計にしておけば、欠陥に対処する余地があった可能性が高いことが明らかになることがあるからです。しかし、これは実装に時間がかかりすぎ、設計と実装をシンプルに保ち、当初の必要な要件のみを満たすというKISSの基本的なエンジニアリング コンセプトと矛盾する可能性があります。
- グローバルフラグへの外部アクセスを許可する。[4]グローバル フラグは、誤ってまたは悪意を持って設定されることはないという過信 (多くの場合、かなり妥当な仮定) から、テストやデバッグの目的で、特に単純なインターフェイスを持つ小規模なアプリケーションでは、このような実装が正当化されます。ただし、プログラムの配布が相当な規模であれば、通常、誰かがフラグを設定するのは時間の問題です。明らかな解決策は、グローバル変数をそのような方法で使用しないことです。開発者は、フラグを状況に応じてアクセス可能にすることもできます。そうすれば、マジック ストリング自体は、プログラムによって他の入力と同様に処理されます。[5]ユーザーは、フラグが設定を受け入れるように、設定を再現するだけでなく、ユーザー インターフェイスが慎重に許可する他のイベントのコレクションを生成する必要があります。これは、はるかに可能性が低いシナリオですが、それでも可能です。
厳密なフォーマット
入力の形式を制限することは、メンテナンス(バグ修正)の解決策として考えられます。[説明が必要] 基本的に、これは、入力情報が正しい形式であるかどうかを検証して、マジック ストリングがユーザーに発見される可能性を減らすことを意味します。例としては、電話番号を検証して数字のみ(および限られた範囲でスペースと句読点も)が含まれていることを確認することや、人名に名と姓があること(および適切に大文字化されていること)を確認することが挙げられます。検証コードでは、マジック ストリングが検証によって拒否されないように例外が設けられています。ユーザーはフォーマットの厳格な強制にすぐに気付く可能性が高いため、フォーマットに準拠していない文字列を入力しようとは思わないと考えられます。したがって、ユーザーがマジック ストリングを試す可能性は非常に低いです。
あらゆる入力検証プロセスと同様に、一部のユーザーによるアプリケーションの使用を意図せず制限するような形式になっていないことを確認することが重要です。この例としては、電話番号や郵便番号[6]の入力をある国のシステムに基づいて制限すること(すべてのユーザーに5桁の郵便番号の入力を要求するなど)が挙げられますが、これは他の国に拠点を置く正当なユーザーに問題を引き起こします。
意図的な実装
アンチパターンではよくあることですが、マジックストリングが実装の正しい解決策となる特定のシナリオが存在します。例としては、チートコード[7]やイースターエッグなどがあります。さらに、ユーザーがマジックストリングを発明し、それを受け入れるようにコーディングされていないシステムでは、ナンバープレートが表示されないなどの予期しない結果が生じる場合があります。[8]
事件
以下は、マジック ストリングの使用によって問題が発生した既知の事例の一覧です。
- 複数の異なるケースで、自動車登録プレートに個人用の文字列を記入したドライバーが、誤った交通違反切符を受け取った。影響を受けた切符発行システムでは、警察官が登録プレートのない車の交通違反切符に記入する際、「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 年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 ページ、「Handling Dirty Data」、ISBN 0-7645-8435-9、ISBN 978-0-7645-8435-0
- ^ Sezen, Tonguc Ibrahim; Isikoglu, Digdem (2007 年 4 月 27 日)。「オザンからゴッドモードへ: 異なる文化圏におけるインタラクティブ エンターテイメントの不正行為」(PDF)。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日閲覧。
