
区切り文字は、プレーンテキスト、数式、またはその他のデータストリーム内の独立した領域の境界を指定するための1つ以上の文字のシーケンスです。[1] [2]区切り文字の例としては、コンマで区切られた値のシーケンスでフィールド区切り文字として機能するコンマ文字があります。区切り文字の別の例としては、モールス信号の送信時に文字や単語を区切るために使用される時間間隔があります。[要出典]
数学では、区切り文字は演算の範囲を指定するためによく使用され、独立した記号 (例: " " 内のコロン) としても、反対に見える記号のペア (例:内の山括弧)としても使用されます。
区切り文字は、データストリーム内の境界を指定するためのさまざまな手段の1つです。たとえば、宣言的表記法は、データストリームの先頭にある長さフィールドを使用して、データストリームに含まれる文字数を指定する代替方法(区切り文字を使用しない)です。[3]
概要
区切り文字は、フィールド区切り文字とレコード区切り文字、または括弧区切り文字として特徴付けられます。
フィールドとレコードの区切り文字
フィールド区切り文字はデータフィールドを区切ります。レコード区切り文字はフィールドのグループを区切ります。[4]
たとえば、CSV 形式では、フィールド間の区切り文字としてカンマが使用され、レコード間の区切り文字として行末インジケーターが使用されます。
姓、名、年齢、給与 ナンシー、ダヴォリオ、33歳、$30000 エリン、ボラコバ、28、$25250 トニー、ラファエル、35歳、28700ドル
これは、 CSV ファイル形式を使用する 単純なフラット ファイル データベース テーブルを指定します。
括弧区切り文字
括弧区切り文字は、ブロック区切り文字、領域区切り文字、バランス区切り文字とも呼ばれ、テキスト領域の開始と終了の両方を示します。[5] [6]
括弧区切りの一般的な例としては以下が挙げられる: [7]
コンベンション
歴史的に、コンピューティングプラットフォームでは慣例的に特定の区切り文字が使用されてきた。[15] [16]次の表は比較のためにいくつかの例を示している。
プログラミング言語 ( 「プログラミング言語の比較 (構文) 」も参照) 。
フィールドとレコードの区切り文字( ASCII、制御文字も参照) 。
区切り文字の衝突
区切り文字の衝突は、著者またはプログラマーが、実際には別々の領域間の境界として解釈されることを意図せずに、区切り文字をテキストに導入した場合に発生する問題です。[4] [18]たとえばXMLの場合、著者が山括弧文字を指定しようとするたびに、この問題が発生する可能性があります。
ほとんどのファイル タイプにはフィールド区切り文字とレコード区切り文字の両方があり、どちらも衝突の影響を受けます。たとえば、カンマ区切り値ファイルの場合、フィールドの衝突は、作成者がフィールド値の一部としてカンマを含めようとするたびに発生する可能性があります (例: salary = "$30,000")。また、レコード区切り文字の衝突は、フィールドに複数の行が含まれるたびに発生します。レコード区切り文字とフィールド区切り文字の衝突は、どちらもテキスト ファイルで頻繁に発生します。
状況によっては、悪意のあるユーザーや攻撃者が意図的にこの問題を悪用しようとする可能性があります。その結果、区切り文字の衝突がセキュリティの脆弱性やエクスプロイトの原因となる可能性があります。悪意のあるユーザーは、 SQLやHTMLなどの言語での区切り文字の衝突を利用して、それぞれSQL インジェクションやクロスサイト スクリプティングなどのよく知られた攻撃を展開することができます。
ソリューション
区切り文字の衝突は非常に一般的な問題であるため、これを回避するさまざまな方法が考案されています。一部の作成者は、データ ストリーム自体に出現する可能性が低い区切り文字 (または文字列) を選択することで、この問題を回避しようとする場合があります。このアドホックなアプローチは適切かもしれませんが、データ ストリームに出現するものを正確に推測する必要があるため、悪意のある衝突に対するセキュリティは提供されません。そのため、他のより正式な規則も適用されます。
ASCII 区切りテキスト
ASCII および Unicode 文字セットは、区切り文字として使用できる非印刷文字を提供することでこの問題を解決するように設計されています。これらは ASCII 28 から 31 の範囲です。
ASCII 31ユニットセパレータをフィールドセパレータとして使用し、ASCII 30レコードセパレータを使用すると、テキストデータストリームに表示されるフィールドとレコードの両方の区切り文字の問題が解決されます。[19]
エスケープ文字
区切り文字の衝突を避ける方法の 1 つは、エスケープ文字を使用することです。言語設計の観点からは、これらは適切ですが、欠点もあります。
- 多数のエスケープ文字が散在すると、テキストが判読不能になることがあります。この問題は、傾斜つまようじ症候群と呼ばれます ( Perl 正規表現で / をエスケープするために \ が使用され、"\/\/" のようなシーケンスが発生するため)。
- 正規表現によるテキストの解析が困難になる
- エスケープ文字として意図されていない場合は、「エスケープをエスケープする」メカニズムが必要です。
- 入力は簡単ですが、その言語に馴染みのない人にとっては難解なものになる可能性があります。[20]
- インジェクション攻撃からは保護されない[要出典]
エスケープシーケンス
エスケープ シーケンスはエスケープ文字に似ていますが、通常は単一の文字ではなく、何らかのニーモニックで構成されます。 1 つの用途は、二重引用符 (") 文字を含む文字列リテラルです。 たとえば、 Perlのコード:
print "ナンシーは群衆に向かって \x22Hello World!\x22 と言いました。" ; ### \x22 を使用します
次と同じ出力を生成します:
print "ナンシーは群衆に向かって「Hello World!」と言いました。" ; ### エスケープ文字を使用する
エスケープ シーケンスを人間が使用する場合の欠点の 1 つは、個々の文字を表すコードを記憶する必要があることです (文字実体参照、数値文字参照も参照)。
二重引用符区切り文字
エスケープ シーケンスやエスケープ文字とは対照的に、二重区切り文字は区切り文字の衝突を回避するもう 1 つの方法を提供します。たとえば、一部の言語では、文字列リテラルを指定するために一重引用符 (') または二重引用符 (") のいずれかを使用できます。たとえば、Perlでは次のようになります。
print 'ナンシーは群衆に向かって「Hello World!」と言いました。' ;
エスケープを必要とせずに目的の出力を生成します。ただし、この方法は文字列に両方のタイプの引用符が含まれていない場合にのみ機能します。
引用符区切り文字のパディング
エスケープ シーケンスやエスケープ文字とは対照的に、パディング区切り文字は区切り文字の衝突を回避するもう 1 つの方法を提供します。たとえば、 Visual Basic では区切り文字として二重引用符を使用します。これは区切り文字をエスケープするのと似ています。
print "ナンシーは群衆に向かって「Hello World!」と言いました。"
エスケープを必要とせずに目的の出力を生成します。ただし、通常のエスケープと同様に、引用符を多く使用すると混乱が生じる可能性があります。上記のソース コードを印刷するコードは、さらに混乱するでしょう。
print ""ナンシーは群衆に向かって「"""Hello World!""""と言いました。"""
設定可能な代替引用符区切り文字
二重区切り文字とは対照的に、多重区切り文字は区切り文字の衝突を回避する点でさらに柔軟である。[7] : 63
たとえば、Perlの場合:
print qq^Nancy はもう「Hello World!」と言いたくない。^ ; print qq@Nancy はもう「Hello World!」と言いたくない。@ ; print qq(Nancy はもう「Hello World!」と言いたくない。) ;
いずれも引用符演算子を使用して目的の出力を生成します。引用符演算子は任意の便利な文字を区切り文字として使用できます。この方法はより柔軟ですが、サポートしている言語は少ないです。PerlとRubyはサポートしています。[7] : 62 [21]
コンテンツの境界
コンテンツ境界は、区切り文字の衝突を防ぐために特別に設計された特別なタイプの区切り文字です。これは、作成者が、マルチパートメッセージ内のパート間の境界を常に示すことが保証され、他の解釈が不可能な文字列を指定できるようにすることで機能します。[22]
区切り文字は、コンテンツ内で統計的に出現する可能性が低いランダムな文字列から生成されることが多い。この後に、UUID、タイムスタンプ、その他の識別マークなどの識別マークが続く場合がある。あるいは、コンテンツをスキャンして、区切り文字がテキスト内に出現しないことを保証する場合もある。これにより、区切り文字を短くしたり、シンプルにしたりすることができ、文書の可読性が向上する可能性がある。(例: MIME、ヒアドキュメントを参照)。
空白またはインデント
一部のプログラミング言語やコンピュータ言語では、テキスト内の独立した領域間の境界を指定する手段として、空白区切り文字やインデントの使用が許可されています。 [23]
正規表現の構文
正規表現を指定する場合、 Perlの一致および置換操作の構文を簡素化するために代替区切り文字を使用することもできます。[24]
たとえば、単純な一致操作は、Perl では次の構文で指定できます。
$string1 = 'ナンシーは群衆に向かって「Hello World!」と言いました。' ; # 対象文字列を指定しますprint $string1 =~ m/[aeiou]+/ ; # 1つ以上の母音に一致します
構文は柔軟性が高く、代替の区切り文字を使用して一致操作を指定できるため、区切り文字の衝突を簡単に回避できます。
$string1 = 'Nancy によると、「http://Hello/World.htm」は有効なアドレスではありません。' ; # 対象文字列print $string1 =~ m@http://@ ; # 代替正規表現区切り文字を使用して一致print $string1 =~ m{http://} ; # 前と同じですが、区切り文字が異なりますprint $string1 =~ m!http://! ; # 前と同じですが、区切り文字が異なります。
ここに文書
ヒアドキュメントでは、特別な終了シーケンスを記述することで任意のコンテンツを含めることができます。PHP 、bashスクリプト、ruby、perlなど多くの言語がこれをサポートしています。ヒアドキュメントは終了シーケンスが何であるかを記述することから始まり、そのシーケンスが新しい行の先頭に現れるまで続きます。[25]
以下は perl の例です。
print << ENDOFHEREDOC ; 「特定の文字」を含む文字列をエンコードするのは非常に困難です。
改行、カンマ、その他の文字は区切り文字の衝突を引き起こす可能性があります。ENDOFHEREDOC
このコードは次のように出力します:
「特定の文字」を含む文字列をエンコードするのは非常に困難です。 改行、カンマ、その他の文字によって区切り文字の衝突が発生する可能性があります。
特別な終了シーケンスを使用すると、文字列内であらゆる種類の文字が許可されます。
ASCIIアーマー
ASCIIアーマーは、主にバイナリデータのテキストエンコードのメカニズムとして使用されますが、 プログラミングおよびシステム管理のテクニックであり、状況によっては区切り文字の衝突を回避するのにも役立ちます。[26] [27]このテクニックは、上記の他のアプローチとは対照的に、より複雑で、したがって小規模なアプリケーションや単純なデータ保存形式には適していません。このテクニックでは、base64などの特別なエンコード方式を使用して、区切り文字やその他の重要な文字が送信データに表示されないようにします。目的は、二重引用符などの多層エスケープを防ぐことです。
この技術は、例えばマイクロソフトのASP.NETウェブ開発技術で使用されており、そのシステムの「VIEWSTATE」コンポーネントと密接に関連しています。[28]
例
次の簡略化された例は、この手法が実際にどのように機能するかを示しています。
最初のコード フラグメントは、VIEWSTATE 値に HTML タグ自体の区切り文字と互換性のない文字が含まれている 単純なHTML タグを示しています。
<input type= "hidden" name= "__VIEWSTATE" value= "BookTitle:Nancy はもう「 Hello World!」とは言いません。" />
この最初のコード フラグメントは整形式ではないため、「実際の」展開されたシステムでは適切に動作しません。
HTML 属性に任意のテキストを格納するには、HTML エンティティを使用できます。この場合、二重引用符の代わりに「"」が使用されます。
<input type= "hidden" name= "__VIEWSTATE" value= "BookTitle:Nancy はもう「Hello World!」とは言いません。" />
あるいは、base64 など、コンテキストで特別な意味を持つ文字を含まない任意のエンコードを使用することもできます。
<入力タイプ = "hidden"名前 = "__VIEWSTATE"値 = "Qm9va1RpdGxlOk5hbmN5IGRvZXNuJ3Qgc2F5ICJIZWxsbyBXb3JsZCEiIGFueW1vcmUu" />
またはパーセントエンコード:
<input type= "hidden" name= "__VIEWSTATE" value= "BookTitle:Nancy%20doesn%27t%20say%20%22Hello%20World!%22%20anymore." />
これにより区切り文字の衝突を防ぎ、元の(デコードされた)テキストにどのような文字が現れるかに関係なく、互換性のない文字がHTMLコード内に現れないことが保証されます。[28]
参照
参考文献
- ^ 「定義: 区切り文字」。連邦規格 1037C - 電気通信: 電気通信用語集。2013 年 3 月 5 日時点のオリジナルよりアーカイブ。2019年 11 月 25 日閲覧。
- ^ 「区切り文字とは何か?」www.computerhope.com . 2020 年 8 月 9 日閲覧。
- ^ Rohl, Jeffrey S. (1973). Programming in Fortran . Oxford Oxfordshire: Oxford University Press. ISBN 978-0-7190-0555-8。Fortran プログラミング言語の Hollerith 記法でメソッドを記述します。
- ^ ab de Moor, Georges J. (1993).医療情報学の標準化の進歩。IOS Press。ISBN 90-5199-114-2。141ページ
- ^ Friedl, Jeffrey EF (2002).正規表現をマスターする: Perl とその他のツールのための強力なテクニック。O'Reilly。ISBN 0-596-00289-0。319ページ
- ^ スコット、マイケル・リー (1999)。プログラミング言語語用論。モーガン・カウフマン。ISBN 1-55860-442-1。
- ^ abc Wall, Larry ; Orwant, Jon ( 2000年 7 月)。プログラミング Perl (第 3 版)。O'Reilly。ISBN 0-596-00027-8。
- ^ カウフマン、マット(2000)。コンピュータ支援推論:アプローチ。シュプリンガー。ISBN 0-7923-7744-3。3ページ
- ^ マイヤー、マーク (2005)。『コンピュータサイエンスの探究』オックスフォード、オックスフォードシャー: オックスフォード大学出版局。ISBN 978-0-7637-3832-7。中括弧とセミコロンを目立つように使用した C スタイルのプログラミング言語を参照します。
- ^ ディリガン、ロバート (1998)。Web時代のコンピューティング。オックスフォード オックスフォードシャー: オックスフォード大学出版局。ISBN 978-0-306-45972-6。HTML で使用される構文と区切り文字について説明します。
- ^ ab Schwartz, Randal (2005). Learning Perl. Oxford Oxfordshire: Oxford University Press. ISBN 978-0-596-10105-3。文字列リテラルについて説明します。
- ^ Watt, Andrew (2003). Sams Teach Yourself XML in 10 Minutes . Oxford Oxfordshire: Oxford University Press. ISBN 978-0-672-32471-0。XML 処理命令について説明します。p. 21。
- ^ Cabrera, Harold (2002). C# for Java Programmers . Oxford Oxfordshire: Oxford University Press. ISBN 978-1-931836-54-8。単一行コメントと複数行コメントについて説明します。p. 72。
- ^ 「Jakarta Server Pages 仕様、バージョン 4.0」。GitHub 。2023年 2 月 10 日閲覧。
- ^ ISO/TC 97/SC 2 (1975 年 12 月 1 日). ISO 646 の制御文字セット(PDF) . ITSCJ/ IPSJ . ISO-IR -1.
{{citation}}: CS1 maint: 数値名: 著者リスト (リンク) - ^ アメリカ規格協会(1975 年 12 月 1 日). ASCII グラフィック文字セット(PDF) . ITSCJ/ IPSJ . ISO-IR -6.
- ^ ルワイン、ドナルド (1991)。Posix プログラマーズ ガイド。オックスフォード オックスフォードシャー: オックスフォード大学出版局。ISBN 978-0-937175-73-6。control-zp 156の使用について説明します。
- ^ フリードル、ジェフリー (2006)。『正規表現のマスター』オックスフォード・オックスフォードシャー: オックスフォード大学出版局。ISBN 978-0-596-52812-6。埋め込み区切り文字の問題に対する解決策の説明 p. 472。
- ^ ASCII 区切りテキストと CSV およびタブ区切りテキストの比較
- ^ Kahrel, Peter (2006).正規表現による InDesign の自動化. O'Reilly. p. 11. ISBN 0-596-52937-6。
- ^ 松本幸宏 (2001).一言で言えばルビー。オライリー。ISBN 0-596-00214-9。Rubyでは、これらは一般的な区切り文字列として示されます。p. 11
- ^ ネットワークプロトコルハンドブック。Javvin Technologies Inc. 2005年。ISBN 0-9740945-2-8。26ページ
- ^ 計算言語学とインテリジェントテキスト処理。オックスフォードオックスフォードシャー:オックスフォード大学出版局。2001年。ISBN 978-3-540-41687-6。空白区切り文字について説明します。p. 258。
- ^ フリードル、ジェフリー (2006)。『正規表現のマスター』オックスフォード・オックスフォードシャー: オックスフォード大学出版局。ISBN 978-0-596-52812-6。472ページ。
- ^ Perl の演算子と優先順位
- ^ Rhee, Man (2003).インターネットセキュリティ: 暗号化の原理、アルゴリズム、プロトコル。John Wiley and Sons。ISBN 0-470-85285-2。(暗号化アプリケーションにおける ASCII アーマーの使用例)
- ^ Gross, Christian (2005). Windows 管理者のためのオープンソース。Charles River Media。ISBN 1-58450-347-5。(暗号化アプリケーションにおける ASCII アーマーの使用例)
- ^ ab Kalani, Amit (2004). Visual C# . NET と Visual Studio . NET を使用した Web アプリケーションの開発と実装. Que. ISBN 0-7897-2901-6。(HTML ソース コード内での Base64 エンコーディングと VIEWSTATE の使用について説明します)
外部リンク
- Eric Steven Raymond著「The Art of Unix Programming」のデータ ファイル メタフォーマット
