ホームページ >バックエンド開発 >PHPチュートリアル >PHP 関数のバイナリ セキュリティに関する問題

PHP 関数のバイナリ セキュリティに関する問題

WBOY
WBOYオリジナル
2016-06-13 12:19:291067ブラウズ

PHP 関数のバイナリ セキュリティの問題

この記事では、主に、1. PHP のバイナリ セキュリティとは何か、2. PHP のバイナリ セキュリティを確保する構造、3. の 3 つの観点から PHP のバイナリ セキュリティについて説明します。この構造には他にどのような用途がありますか?

何が起こっているのか、なぜ起こっているのかを理解しましょう。

一文説明:

PHP の内部関数は、バイナリ データを操作するときに期待される結果を保証できます。 str_replace、stristr、strcmp およびその他の関数、これらの関数はバイナリ セーフであると言われます。

例:

C と PHP での strcmp 関数を比較してみましょう。

C コードは次のとおりです

[objc] view plaincopyPHP 関数のバイナリ セキュリティに関する問題PHP 関数のバイナリ セキュリティに関する問題

  1. main(){
  2. char ab[] = "aa


    小さなデータ構造の改善は、より多くの想像力の余地をもたらすことがわかります。これは、構造 にとっては小さな一歩であり、機能 にとっては大きな一歩であると言えます。

    拡張子:

    このような使いやすい構造は、明らかに Redis の最下層にデータを保存するときにどこでも使用されます。 C 言語の従来の文字列表現 (NULL 終端文字配列) を直接使用する代わりに、単純動的文字列 (SDS) と呼ばれる抽象型を構築し、SDS を Redis として使用しました。

    のデフォルトの文字列表現を見てください。 SDS の構造定義

    [plain] view plaincopyPHP 関数のバイナリ セキュリティに関する問題PHP 関数のバイナリ セキュリティに関する問題

    1. struct sdshdr {
    2. // buf 配列で使用されるバイト数を記録します
    3. // SDS によって保存された文字列の長さに等しい
    4. int len;
    5. // buf 配列内の未使用のバイト数を記録します
    6. int free; // 文字列の保存に使用されるバイト配列
    7. char buf[]; ご覧のとおり、次のようになります。おなじみの len 値が再び表示されました。これにより、Redis ストレージがバイナリセーフであることが保証されます
    8. この点を説明するには、次の内容で十分です:
    9. (http://redisbook.com/preview/ から抜粋) sds/ Different_between_sds_and_c_string.html#id6)
    10. C 文字列内の文字は特定のエンコーディング (ASCII など) に準拠する必要があり、末尾を除いて、文字列に null を含めることはできません。これらの制限により、C 文字列にはテキスト データのみが保存され、画像や画像などのバイナリ データは保存されません。オーディオ、ビデオ、圧縮ファイルなどは含まれません。 。
    11. たとえば、図 2-17 に示すように、ヌル文字を使用して複数の単語を区切る特別なデータ形式がある場合、この形式は C 文字列を使用して保存できません。文字列はその中の
    のみを認識し、後続の を無視します。


    データベースは一般的にテキスト データの保存に使用されますが、バイナリ データの保存にデータベースを使用することも珍しくありません。そのため、Redis がさまざまな用途に適していることを確認します。シナリオを使用すると、SDS API はバイナリ セーフです。すべての SDS API は、SDS によって
    配列に保存されたデータをバイナリ方式で処理し、プログラムはデータに制限やフィルターを課しません。データは書き込まれるときと同様に、読み取られるときも同様になります。

    これが、SDS の

    属性をバイト配列と呼ぶ理由です。Redis はこの配列を文字の保存に使用せず、一連のバイナリ データの保存に使用します。 "Redis""Cluster"たとえば、SDS を使用して前述の特別なデータ形式を保存することに問題はありません。これは、次に示すように、SDS はヌル文字の代わりに

    属性の値を使用して文字列が終了するかどうかを判断するためです。図 2-18 を示します。

    digraph {    label = ' | 'C' | 'l' | 'u' | 's' | 't' | 'e' | 'r' | '

    ' "];}" />buf

    C 文字列の代わりにバイナリセーフ SDS を使用することにより、Redis はテキスト データだけでなく、任意の形式のバイナリ データも保存できます。 buf

    len

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。