PHP での正規表現のエスケープ。 エスケープ (またはテキスト内のテキストを操作するために知っておくべきこと) 一重引用符と二重引用符で囲まれた特殊文字

  • 翻訳
  • チュートリアル

SQL インジェクション、クロスサイト リクエスト フォージェリ、XML の破損...恐ろしい、恐ろしいことは誰もが避けたいものですが、なぜそれらが起こっているのかを知りたいだけです。 この記事では、すべての背後にある基本的な概念、つまり文字列と文字列内の文字列の処理について説明します。

主な問題は単なるテキストです。 はい、テキストだけです - それが主な問題です。 コンピュータ システム内のほとんどすべてはテキストで表されます (テキストはバイトで表されます)。 一部のテキストはコンピューター向けであり、他のテキストは人間向けである可能性はありますか。 しかし、どちらもテキストのままです。 私が何を言っているのかを理解するために、ここに小さな例を示します。
ホモ・サピエンス ロシア語に翻訳したくない英語のテキストがあるとします。
信じられないでしょう。これはテキストです。 これを XML と呼ぶ人もいますが、それは単なるテキストです。 英語の先生に見せるのには適さないかもしれませんが、それでも単なるテキストです。 ポスターに印刷して集会に行くこともできますし、母親への手紙に書くこともできます...それはテキストです。

ただし、このテキストの特定の部分がコンピューターにとって何らかの意味を持つようにしたいと考えています。 私たちは、コンピュータがテキストの作成者とテキスト自体を別々に抽出して、それを使って何かをできるようにしたいと考えています。 たとえば、上記を次のように変換します。
ホモ・サピエンスによってロシア語に翻訳されたくない英語のテキストがあるとします。
コンピューターはどのようにしてこれを行う方法を知るのでしょうか? それは、テキストの特定の部分を、「や」などの面白い括弧で囲んだ特別な単語で非常に便宜的にラップしたからです。 これを行ったので、これらの特定の部分を検索し、テキストを抽出し、それを独自の発明に使用するプログラムを作成できます。

言い換えれば、テキスト内で特定のルールを使用して、同じルールに従って他の人が使用できる特別な意味を示しました。
さて、これを理解するのはそれほど難しいことではありません。 テキスト内で特別な意味を持つこれらの面白い括弧を、その意味をそのまま使用せずに使用したい場合はどうすればよいでしょうか。次のようなものです。
ホモ・サピエンス< n and y >
「」文字は特別なものではありません。 上記の例のように、これらはあらゆるテキストのどこにでも合法的に使用できます。 しかし、特別な言葉についての私たちの考えはどうでしょうか? これも何かのキーワードということでしょうか? XML では、おそらくそうです。 あるいはそうではないかもしれません。 これは曖昧です。 コンピューターは曖昧さを扱うのが苦手なので、自分で i にドットを打って曖昧さを解決しないと、予期しない結果が生じる可能性があります。
このジレンマは、曖昧なシンボルを明確なものに置き換えることで解決できます。
ホモ・サピエンスの基本的な数学では、x が次の場合にわかります。< n and y >n、x は y より大きくすることはできません。
これで、テキストは完全に明確になるはずです。 「」。
これの技術的な定義は次のとおりです。 シールド、特殊文字に特別な意味を持たせたくない場合は、特殊文字をエスケープします。
エスケープ |iˈskāp| [オブジェクトはありません。 ] 自由になる [オブジェクトで。 ] 気づかない/覚えていない [...] [オブジェクト付き。 ] IT: 異なる解釈がされる理由 [...]
テキスト内の特定の文字または文字のシーケンスが特別な意味を持つ場合、その特別な意味を呼び出すことなくそれらの文字を使用しなければならない状況を処理する方法を指定するルールが必要です。 言い換えれば、エスケープすることで次の質問が解決されます。 「これらの記号が特別な場合、テキストでどのように使用できますか?」.
上の例でわかるように、アンパサンド (&) も特殊文字です。 しかし、「」と書きたい場合はどうなるでしょうか。


ユーザーが善良で親切であれば、古い哲学者の引用を投稿するでしょう。メッセージは次のようになります。

プラトンによる投稿 1月2日15時31分

私は「Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod Tempor incididunt ut Labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco Laboris nisi ut aliquip ex ea commodo consequat」と言ったとされています。


ユーザーが賢い場合、おそらく数学について話すでしょう。メッセージは次のようになります。

パスカル投稿日 11月23日04時12分

基本的な数学では、x が次の場合に次のようになります。< n and y >n、x は y より大きくすることはできません。


うーん...また括弧を冒涜する奴らだな。 まあ、技術的な観点からは曖昧かもしれませんが、ブラウザはそれを許してくれますよね?


わかった、やめて、一体何なの? 誰かのいたずら者があなたのフォーラムに JavaScript タグを導入しましたか? あなたのサイトでこのメッセージを見ている人は誰でも、あなたのサイトのコンテキストで、誰にも分からないことを実行できるスクリプトをダウンロードして実行していることになります。 そして、これは良くありません。

文字通りに受け取らないでください。上記の場合、何らかの方法で DB またはブラウザに、これは単なるテキストであり、何もしないでくださいと伝えたいと考えています。 言い換えれば、ユーザーを信頼していないため、ユーザーが提供する情報からすべての特殊文字とキーワードの特別な意味を「削除」したいのです。 何をするか?

何? 何言ってるの? ああ、「シールド」って言うんですか? そして、あなたは完全に正しいです、クッキーを食べてください!
ユーザーデータをクエリとマージする前にエスケープを適用すると、問題は解決します。 データベースクエリの場合は次のようになります。
$name = $_POST["名前"]; $name = mysql_real_escape_string($name); $query = "ユーザーから電話番号を選択 WHERE name = "$name""; $result = mysql_query($query);
たった 1 行のコードですが、もう誰もデータベースを「ハッキング」することはできません。 ユーザー入力に応じて SQL クエリがどのようになるかをもう一度見てみましょう。
アレックス
ユーザーから電話番号を選択 WHERE name = "Alex"
マクドナルド
ユーザーから電話番号を選択 WHERE name = "マック\"ドナルド"
ジョー"; DROP TABLE ユーザー; --
ユーザーから電話番号を選択 WHERE name = "Joe\"; DROP TABLE ユーザー。 ――」
mysql_real_escape_string は、特別な意味を持つ可能性のあるものの前に無差別にスラッシュを置きます。


出力する前に、すべてのユーザー データに htmlspecialchars 関数を適用します。 害虫のメッセージは次のようになります。

投稿者 JackTR 7 月 18 日 12:56


ユーザーから受け取った値は実際には「破損」しているわけではないことに注意してください。 どのブラウザでもこれを HTML として解析し、画面上のすべてを正しい形式で表示します。

話を戻します... 上記はすべて、多くのシステムに共通する問題を示しています。テキスト内のテキストに特殊文字が含まれていないと想定されている場合は、エスケープする必要があります。 SQL にテキスト値を配置する場合は、SQL ルールに従ってエスケープする必要があります。 HTML にテキスト値を配置する場合は、HTML ルールに従ってエスケープする必要があります。 (テクノロジー名) にテキスト値を配置する場合は、(テクノロジー名) の規則に従ってエスケープする必要があります。 完全を期すために、もちろん、特殊文字が含まれる場合と含まれない場合があるユーザー入力を処理する他の方法もあります。
  • 検証
    ユーザー入力が特定の仕様と一致するかどうかを確認できます。 数値の入力が必要な場合にユーザーが別の値を入力した場合、プログラムはユーザーに通知して入力をキャンセルする必要があります。 これらすべてが正しく構成されていれば、ユーザーが「42」と入力するはずだった場所で「DROP TABLE ユーザー」が見つかる危険はありません。 これは、HTML/SQL インジェクションを回避するにはあまり現実的ではありません。 多くの場合、トリックが含まれる可能性のある自由形式のテキストを受け入れる必要があります。 通常、検証は他の尺度に加えて使用されます。
  • 消毒
    危険だと思われるシンボルを「静かに」削除することもできます。 たとえば、フォーラムに追加されないようにするには、HTML タグのようなものをすべて削除します。 問題は、テキストの完全に合法な部分を削除できることです。
    準備された SQL ステートメント
    SQL クエリ自体とユーザーが提供する情報の違いをデータベースに理解させるという、私たちが望んでいることを実行する特別な関数があります。 PHP では次のようになります。
    $stmt = $pdo->prepare("SELECT 電話番号 FROM ユーザー WHERE name = ?"); $stmt->execute($_POST["name"]);
    この場合、送信は 2 段階で行われ、リクエストと変数が明確に区別されます。 データベースには、まずリクエストの構造を理解してから、それに値を入力する機能があります。

  • 現実の世界では、これらはすべて、さまざまなレベルの保護のために一緒に使用されます。 ユーザーが正しいデータを入力していることを確認するには、常に検証を使用する必要があります。 その後、入力されたデータをスキャンできます (必須ではありません)。 ユーザーが明らかにスクリプトを販売しようとしている場合は、単純にそれを削除できます。 その場合は、ユーザー データを SQL クエリに入れる前に必ずエスケープする必要があります (HTML についても同様です)。

2007.11.08 16:07

データベースに情報を入力するときに、PHP で引用符を自動的に追加する際に問題が発生しました。

インターネットで少し調べた結果、.htaccess のディレクティブ、magic_quotes_gpc および magic_quotes_runtime を使用してサーバー設定を変更することで問題を解決できることがわかりました。

彼らは、PHP 言語の開発者が、大部分の PHP プログラマーに高品質のコードを書くことを強制することができず、DBMS のセキュリティに配慮することを決定し、スラッシュの自動追加を導入したと言います (そして私はそう信じています)。特殊文字の前に。 スラッシュは、php.ini ディレクティブ (magic_quotes_gpc および magic_quotes_runtime) に基づいて追加されます。

指令を総称して「魔法の名言」と呼びますが、私はそれを「地獄の名言」と呼んでいます。 実際、適切に作成されたアプリケーションでは、自動引用符は必要ありません。さらに、余分な引用符は邪魔になるため、削除する必要があります。

最初のディレクティブ - magic_quotes_gpc - は、PHP がユーザー (POST、GET リクエスト、Cookie など) からのデータにスラッシュを自動的に追加することを意味します。 2 番目の変数 magic_quotes_runtime は、スクリプトの実行中に受信したデータ (ファイルやデータベースなど) にスラッシュが追加されることを意味します。 したがって、そのような情報を表示する一部の関数は引用符を実行します。

このような煩わしいサービスを拒否したい場合は、(サーバーの完全な所有者であるというまれで幸せな状況では) php.ini ファイルでこれらの構成変数を無効にするか、(もちろん、そうでない限り) のいずれかです。無料ホスティングでサイトをホスティングしている場合)、.htaccess ファイルに変更を加えることができます。 これは、サーバー全体ではなく、1 つのディレクトリのローカルの Apache 設定を含むファイルです。 そして、次の行をそれに追加します。


友達!
大掃除の真っ最中です!
考えられるエラーとページの湾曲
すべてをすぐに見ることはできません。
間違いを見つけたら、面倒でなければアドレスを書いてください...
あなたは今ここにいます:

http://site/page/php/039_php_kavyichki.html

PHP 引用符、一重引用符、二重引用符、エスケープ

今日は引用符を扱いますが、単純なものではなく、PHP の引用符とエスケープ引用符、オプションを扱います。

PHP では二重引用符と一重引用符の両方を使用できるという事実から始めましょう。

また、引用符をエスケープするためのオプションがいくつかあります。

引用符はキーボードのどこにありますか?

コードで作業する場合は、ラテン語レイアウトのキーボード上の引用符がどこにあるかを知る必要があります。これは次のとおりです。

文字 E – 小文字:

そして文字 e が綴られています - これらは一重引用符です:

PHPの二重引用符と一重引用符の記号

当然のことながら、引用符が必要になります。 引用符を起動せずに印刷する必要がある場合、それが引用文字の目的です。

二重引用符文字:

"

一重引用符文字:

" PHP の引用符のエスケープ。

PHP で引用符をエスケープするとは、実際には何を意味しますか。

例を見てみましょう。例があると、何について話しているのかが理解しやすくなります。

phpコードを書いてみましょう:

「php の引用符」をエコーし​​ます。

しかし、このコードをここに貼り付けると、これらの行は表示されなくなると思います。

なぜ? はい、単にコードが機能しないからです。

私はあなたのために特別にこのコードを挿入して作成しました。必要に応じて、それによって何が起こるか見てみましょう。

なぜこのようなことが起こったのでしょうか?

エコー内には追加の引用符があり、これが PHP コードとして認識されるため、予想よりも多くの引用符が存在すると、エラーが発生します。

こういう場合はどうすればいいの!?

二重引用符を一重引用符に置き換える必要があります。

同じコードを使用して、二重引用符を一重引用符に変更してみましょう。

echo '"php 引用符"';

何が得られたか見てみましょう!

それらの。 一番上のコードを取り出してこのページに直接貼り付けたところ、次のような出力が得られます。


2. 引用符をエスケープするための 2 番目のオプション。 一重引用符の使用が不可能な状況もあります。

この場合、左スラッシュが使用されます。 エスケープする必要がある各要素の前にスラッシュを入れる必要があります。

前のエントリを取り上げて、スラッシュのみを使用して同じことを実行してみましょう。

エコー " PHPの引用";

結果を見てみましょう:

引用符を削除する方法。

たとえそれがどんなに奇妙に聞こえるとしても、画面上に引用符を表示し、引用符が PHP コードではないようにするためです。 引用符は HTML エンティティに変更する必要があります。次に例を示します。

HTML コードによる一重引用符::

" - 一重引用符 " " "

HTML コードによる二重引用符:

" - 二重引用符 " " "

このような引用は、画面上では引用のように見えますが、Php コードには表示されなくなります。

そしてさらに!

すべての PHP コードは慎重に扱う必要があります。 たとえば、Word で何かテキストを書いた場合、私が初めて経験したように、そこにコードを書き始めます。

そして私には何が問題なのか理解できませんでした。彼は私に単純なコードを見せたくなかったのです。 大ハンマーでコンピューターを壊す準備ができていました!!!

しかし、コード エディターの引用符は Word とは異なることが判明しました。 そしてそれを経験しないと理解することは不可能です!

英語のスラッシュに由来するスラッシュは、不可解にもデータに突然現れるバックスラッシュです。 一部の特殊文字に追加されますが、主に引用符を配置するために使用されます。 スラッシュはデータベースを操作する場合にのみ必要です。 そしてそれは絶対に必要です。 それ以外の場合は、邪魔になるだけです。 ここでは両方のケースを見て、PHP 設定に依存しないプログラムを作成する方法を学びます。


php.ini ディレクティブはスラッシュを自動的に追加します。



magic_quotes_gpc
magic_quotes_runtime



最初のオプションが有効になっている場合、ユーザーからのデータ (POST、GET リクエスト、Cookie など) にスラッシュが自動的に追加されます。 2 つ目は、スクリプトの実行中に受信したもの (ファイルなど) です。 ただし、特にプログラムが配布用に作成されている場合は、PHP 設定に常にアクセスできるわけではありません。


ご自身の安全のため、ケースに関係なく、本文全体をお読みください。


1. データベースを使用せずに作業する場合
これは、スラッシュを自動的に追加する必要がないことを意味します。 PHP が追加されている場合は、それを削除する必要があります。


get_magic_quotes_gpc() 関数を使用して、PHP が追加されたかどうかを確認できます。
tripslashes() 関数はスラッシュを削除します。
あとはチェックして、PHP が追加している場合は、スクリプト内のすべての変数を調べてスラッシュを削除するだけです。 これは、スクリプト内に存在するすべての変数を含む $GLOBALS 配列を使用する 1 つの関数で実行できます。



if (get_magic_quotes_gpc()) ストリップ($GLOBALS);


関数ストリップ(&$el) (
if (is_array($el)) (
foreach($el as $k=>$v) (
if($k!="グローバル") (
ストリップ($el[$k]);
}
}
) それ以外 (
$el = ストリップスラッシュ($el);
}
}



スラッシュは、グローバル配列と、register_globals=on のときに形成されるすべての変数の両方から削除されます。


ここで少し脱線する必要があります。 $GLOBALS 配列の反復処理は、 register_globals を有効にし、スクリプトに渡される値に自動的に割り当てられる変数を使用している場合にのみ必要です。 それらを使用しない場合は、必要な配列からスラッシュを削除するだけです。
$_POST、$_GET など。


ファイルからデータを取得するときにスラッシュを追加しないようにするには、スクリプトの先頭に次のように記述します。



set_magic_quotes_runtime(0);



2. MySQL を使用している場合
mysql でクエリを作成するための 2 つの基本ルール:


  • すべての変数で、特殊文字はスラッシュでエスケープする必要があります。
    重要な注意点。 追加されたスラッシュはデータベースには入りません。 これらはリクエストでのみ必要となります。
    拠点にヒットすると斬撃が捨てられます。 それに伴い、広く普及した
    データベースからデータを取得するときにストリップスラッシュを使用するのは間違いです。

  • すべての文字列変数は引用符で囲む必要があります (単一引用符または二重引用符ですが、単一引用符の方が便利でよく使用されます)。 簡単にするために、数値変数を引用符で囲むこともできます。mysql 自体が数値変数を目的の形式に変換します。 つまり、信頼性を確保するために、リクエストに挿入されるデータはすべて引用符で囲む必要があります。 addslashes() を実行するだけでは間違っています。 PHP 自体がすでに追加されている場合はどうなるでしょうか? これは確認する必要があります。 これには get_magic_quotes_gpc() 関数が使用されます。
    データが GET または POST メソッドを使用してユーザーのブラウザから取得された場合は、次のように記述する必要があります。

    if (!get_magic_quotes_gpc()) $var=addslashes($var);



    データがファイルから取得された場合 (これはめったに起こりませんが、それでも起こります)、

    if (!get_magic_quotes_runtime()) $var=addslashes($var);



    しかし、何が面白いのでしょう。 特に mysql の場合、PHP の最新バージョンでは、スラッシュを追加するよりも 1 文字多くエスケープする mysql_escape_string() 関数が導入されました。 おそらくそれを使用することに意味があります。
    クエリを作成するための特別な関数がある場合は、その関数にエスケープを挿入できます。 そうでない場合は、次の関数を使用できます。

関数 add(&$el,$level=0) (
if (is_array($el)) (
foreach($el as $k=>$v) added($el[$k],$level+1);
) それ以外 (
$el = ラッシュを追加します($el);
if (!$level) は $el を返します。
}
}

この関数には 2 つの用途があります。
パラメータとして文字列を指定すると、関数はエスケープされた特殊文字を使用して文字列を返します。
リクエストに挿入するのに便利です。



"SELECT * FROM table WHERE name="".adds($name).""";



パラメータが配列の場合、関数は何も返しませんが、単にそのすべての要素を再帰的に「走査」します。 たとえば、adds($_POST); は、この配列に対して通常の magic_quotes 作業を実行します。


スラッシュを追加する関数は、LIKE 演算子で使用される「%」および「_」検索メタキャラクターにスラッシュを追加しないことに注意してください。 したがって、この演算子を使用する場合は、スラッシュを手動で追加してください。



$data=preg_replace("/(%|_)/","\\\\\1",$data);




エスケープ規則は他の DBMS では異なる場合があります。


注記:。
フォームの入力タグに値を表示する場合、スラッシュは役に立ちません。 このようなフィールドのテキスト全体を表示するには、値を引用符で囲み、出力データに htmlspecialchars 関数を適用する必要があります。
例:



結果:

最初のバージョン (二重引用符付き) では、ドル特殊文字のエスケープを使用していました。これにより、この特殊文字は特別な目的 (変数指定) を持たなくなり、通常のドル記号に変わりました。

2 番目のオプション (一重引用符付き) では、すでにご存知のとおり、PHP インタープリターは行内の変数を検索しようとしなかったため、エスケープは必要ありませんでした。

PHP の特殊文字

特にブログ読者向けサイトです! PHP プログラミング言語の特殊文字の小さなリストを用意しました。

  • \n 改行
  • \r キャリッジリターン
  • \t 水平タブ
  • \\ バックスラッシュ (バックスラッシュ)
  • \$ドル記号
  • \" 二重引用符

\n の例を使用して特殊文字の働きを見てみましょう - 新しい行を作る特殊文字 (Enter など) ですが、ブラウザはそれを理解せず、無視する必要がありますが、その動作の結果は次のとおりです。ページのソースコードで確認できます。

結果:

ソースコード (Ctrl + U):

ブラウザの訪問者に対して特殊文字 \n がまったく表示されない場合、その意味は何でしょうか?

まず、特殊文字、特に \n を使用すると、ページ上のコードを簡単にフォーマットできます (上記の例のように)。

次に、\n は、たとえばファイルへの書き込み操作中に、折り返し (Enter) を作成して新しい行に書き込みを続けるために使用できます。

このフォーマットに代わる方法は です。

PHP のヒアドキュメント構文

結果:

ソースコード (Ctrl + U):

結果はそれ自体を物語っています。次に、すべてがどのように機能するかを理解しましょう。

  • 行は 3 つの山括弧で始まります
トピックの続き:
アンドロイド

この記事では、ソーシャル CRM の作業の説明シリーズを開始します。 ソーシャル ネットワークに対するユーザーの関心に合わせて機能することを目的としたソフトウェア製品。 他の CRM と同様に...

新しい記事
/
人気のある