目次
ヌルバイトとは何ですか、なぜそれらは重要なのですか?
落とし穴#1:ファイル操作における予期しない切り捨て
PITFALL#2:ファイルアップロードのセキュリティリスク
PITFALL#3: strcmpと文字列比較の問題
落とし穴#4:正規表現の不正行為
一般的なベストプラクティス
ホームページ バックエンド開発 PHPチュートリアル PHPでのヌルバイトと文字列終端で一般的な落とし穴を解決する

PHPでのヌルバイトと文字列終端で一般的な落とし穴を解決する

Jul 28, 2025 am 04:42 AM
PHP Strings

nullバイト(\ 0)は、PHP文字列がバイナリセーフであり、完全な長さを保持している場合でも、C拡張またはシステム呼び出しとインターフェイスするときにPHPで予期しない動作を引き起こす可能性があります。 2。ファイル操作では、「config.txt \ 0.php.bak」などのnullバイトを含むファイル名は「config.txt」に切り捨てられ、ファイルアクセスまたはセキュリティリスクが誤っています。 3。ファイルのアップロード中、攻撃者は$ _POST ['FILENAME']でnullバイトを悪用して、「shell.php \ 0.jpg」が「shell.php」として保存されます。 4.純粋なPHP(===、STRCMP)の文字列比較は、NULLバイトを正しく処理しますが、Cベースの拡張機能またはデータベースドライバーは文字列を切り捨て、データの整合性を危険にさらす可能性があります。 5.正規表現は、\ aおよび\ zで適切に固定されていない限り、文字列をnullバイトと部分的に一致させることができるため、処理する前に\ 0を入力する必要があります。 6.ベストプラクティスには、STR_REPLACE( "\ 0"、 ''、$ input)を使用してnullバイトのフィルタリングまたはbasename()、realpath()、およびfilter_input()を使用して拒否し、すべてのユーザー入力を検証し、システムコールまたはSQLの直接文字列補間を回避し、データベースクエリを確保するためのデータベースqueryを使用することが含まれます。ヌルバイトを常に潜在的に危険な入力として扱い、切り捨てやセキュリティの脆弱性を防ぐために明示的にそれらを処理します。

PHPでのヌルバイトと文字列終端で一般的な落とし穴を解決する

通常、PHPで文字列を使用すると、特にc拡張、ファイル操作、またはユーザー入力とインターフェースする場合、 nullバイト\0 )と文字列終了を含むエッジケースに遭遇するまで、簡単に感じます。 PHPは、低レベルの言語よりも柔軟に文字列を処理しますが、これらの問題は、予期しない動作、セキュリティの脆弱性、またはデータの切り捨てにつながる可能性があります。最も一般的な落とし穴を理解し、回避する方法は次のとおりです。

PHPでのヌルバイトと文字列終端で一般的な落とし穴を解決する

ヌルバイトとは何ですか、なぜそれらは重要なのですか?

ヌルバイト\0 )は、ASCII値が0の文字です。Cスタイルの文字列では、文字列の端をマークします。ただし、PHP文字列はバイナリセーフです。つまり、nullバイトを含んでいて、完全な長さを保持できることを意味します。問題は、PHPが文字列をC関数(拡張機能やシステム呼び出しのように)に渡すと、ターミネーターとして\0解釈するときに発生します。

例えば:

PHPでのヌルバイトと文字列終端で一般的な落とし穴を解決する
 $ string = "hello \ 0world";
Echo Strlen($ string); //出力:11

ヌルバイトがあっても、PHPは文字列が11文字の長さであることを知っています。しかし、この文字列がヌル終端文字列を期待するC関数に渡される場合、 "hello"のみが表示されます。


落とし穴#1:ファイル操作における予期しない切り捨て

最も一般的な問題の1つは、nullバイトを含むファイルまたはパスでfile_get_contents()fopen()などの関数を使用する場合に発生します。

PHPでのヌルバイトと文字列終端で一般的な落とし穴を解決する
 $ filename = "config.txt \ 0.php.bak";
file_get_contents($ filename); //「config.txt」のみを読むことができます

PHPは文字列を渡すことができますが、基礎となるシステム呼び出し(cで書かれている)は\0で停止し、潜在的に以下につながる可能性があります。

  • 間違ったファイルを読む
  • ファイル拡張機能をバイパスする(ファイルアップロードのセキュリティリスク)

解決策:常に入力を消毒および検証します。

 if(strpos($ filename、 "\ 0")!== false){
    新しいInvalidargumentException( "nullバイトはファイル名で許可されていません");
}

さらに良いことに、ファイル操作にホワイトリストを使用して、可能であれば動的なファイル名を避けてください。


PITFALL#2:ファイルアップロードのセキュリティリスク

攻撃者は、nullバイトを$_GET$_POST 、またはファイル名をアップロードして、文字列終了動作を悪用することができます。

危険なパターンの例:

 //これをしないでください
$ uploaddir = '/uploads/';
move_uploaded_file($ _ files ['file'] ['tmp_name']、$ uploaddir。$ _post ['filename']);

$_POST['filename']"shell.php\0.jpg"である場合、一部のシステムはshell.phpとして保存する可能性があります( .jpg\0後に無視されるため)拡張チェックをバイパスします。

解決策

  • ファイルパスのユーザー入力を決して信用しないでください
  • basename()を使用して、ディレクトリ情報をストリップします
  • 名前だけでなく、実際のファイルコンテンツの拡張機能を検証する
  • nullバイトを明示的にフィルターします:
     if(preg_match( '/[\ x00]/'、$ filename)){
      die( "無効なファイル名");
    }

PITFALL#3: strcmpと文字列比較の問題

PHPのネイティブストリングの比較( =====strcmp )はNULLバイトを正しく処理しますが、C文字列に依存する拡張機能またはデータベースドライバーを使用すると問題が発生する可能性があります。

たとえば、PHPで"admin\0""admin"を比較します。

 var_dump( "admin \ 0" === "admin"); // 間違い
var_dump(strcmp( "admin \ 0"、 "admin")); //ゼロ以外(等しくない)

これは純粋なPHPでは安全ですが、これらの文字列がCベースのドライバーを介してSQLクエリで使用される場合、切り捨てが発生する可能性があります。

ベストプラクティス準備されたステートメントを使用して、注入を避け、データの整合性を確保する:

 $ stmt = $ pdo-> prepare( "select * from users where username =?");
$ stmt-> execute([$ username]); // PDOは脱出およびバイナリデータを処理します

落とし穴#4:正規表現の不正行為

PHPのPCRE関数は一般にバイナリセーフですが、特にユーザー入力を処理する場合、nullバイトは依然として混乱を引き起こす可能性があります。

例:

 preg_match( '/^[\ w \。] $/'、 "file.txt \ 0.php"); // 1(!)を返すことができます

正規表現はnullバイトまで一致しますが、完全な文字列は安全ではありません。

修正:正規表現の前にnullバイトを明示的に拒否する:

 if(strpos($ input、 "\ 0")!== false){
    //拒否または処理します
}

または、 \Aおよび\zを使用してより厳しいパターンを使用します(絶対開始/終了):

 preg_match( '/\ a [\ w \。] \ z/'、$ input); //完全な文字列の一致を保証します

一般的なベストプラクティス

PHPのヌルバイトの落とし穴を避けるため:

  • curseユーザー入力からヌルバイトをフィルターします
     $ clean = str_replace( "\ 0"、 ''、$ input); //または完全に拒否します
  • basename()realpath()filter_input()などの組み込み関数を使用します
  • oteralすべての外部データを検証し、消毒する- 安全だと仮定しないでください
  • system System CallsまたはSQLでの直接文字列補間を避けます
  • RAWデータを処理するときに、バイナリセーフ関数を使用します

  • ヌルバイトは本質的に悪ではありませんが、PHPの高レベルの文字列処理とCの低レベルの世界との間のギャップを明らかにし、入力を早期に検証し、ストリングがどこに行くのかを理解することにより、切り捨て、セキュリティの欠陥、デバッグの頭痛を避けることができます。

    基本的に:他の危険な入力と同様に、nullバイトを扱います。それらを伸ばすか、それらを明示的に処理します。

    以上がPHPでのヌルバイトと文字列終端で一般的な落とし穴を解決するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホットAIツール

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHPでのヌルバイトと文字列終端で一般的な落とし穴を解決する PHPでのヌルバイトと文字列終端で一般的な落とし穴を解決する Jul 28, 2025 am 04:42 AM

nullbytes(\ 0)cancaunextectedbehaviorinphpの場合、interfacingsostensionsustentionSystemcallsbecausectreats \ 0asaStringSarebinary-safeand-preseverfullent.2.infileoperations、infileoperations、infeNamesconteainingnullbyteslike "

「sprintf」と「vsprintf」を使用した高度な文字列フォーマット手法 「sprintf」と「vsprintf」を使用した高度な文字列フォーマット手法 Jul 27, 2025 am 04:29 AM

sprintfとvsprintfは、PHPで高度な文字列フォーマット関数を提供します。回答は次のとおりです。1。浮動小数点精度と%dは%.2fを介して制御でき、dで整数型を確保でき、dでゼロパディングを実現できます。 2.変数位置は、%1 $ sや%2 $ dなどの位置的プレースホルダーを使用して修正できます。これは、国際化に便利です。 3.左アライメントと]右アライメントは、テーブルまたはログ出力に適した%-10Sで達成できます。 4。VSPRINTFは、SQLまたはメッセージテンプレートの動的生成を容易にするアレイパラメーターをサポートします。 5.元の名前のプレースホルダーはありませんが、{name}構文は通常のコールバック関数を介してシミュレートできます。または、extract()と組み合わせて連想配列を使用できます。 6。Substr_Co

バリューオブジェクトとしての文字列:ドメイン固有の文字列タイプへの最新のアプローチ バリューオブジェクトとしての文字列:ドメイン固有の文字列タイプへの最新のアプローチ Aug 01, 2025 am 07:48 AM

rawStringsindomain-drivenApplicationsは、ValueObjedStopReventBugsAndimproveTypeTytyのValueObue obue obue obtedsopreated; 1. 1.SustoprimiteObsessionを使用します

防御的な文字列の取り扱い:PHPでのXSSと噴射攻撃の防止 防御的な文字列の取り扱い:PHPでのXSSと噴射攻撃の防止 Jul 25, 2025 pm 06:03 PM

todefendagainstxssandinjectionInphp:1

PHP文字列エンコードの迷路をナビゲートする:UTF-8以降 PHP文字列エンコードの迷路をナビゲートする:UTF-8以降 Jul 26, 2025 am 09:44 AM

PHPはデフォルトでUnicodeをサポートしていないため、UTF-8処理はPHPで手動で管理する必要があります。 1. MBSTRING拡張機能を使用して、MB_STRLEN、MB_SUBSTRなどのマルチバイトセキュリティ関数を提供し、UTF-8エンコーディングを明示的に指定します。 2.データベース接続がUTF8MB4文字セットを使用していることを確認します。 3. HTTPヘッダーとHTMLメタタグを介してUTF-8を宣言します。 4.ファイルの読み取りと書き込み中にエンコードを確認および変換します。 5. JSON処理前にデータがUTF-8であることを確認します。 6.検出と変換をエンコードするには、MB_DETECT_ENCODINGとICONVを使用します。 7.データの腐敗を防ぐことは、後の修理よりも優れており、UTF-8をすべてのレベルで使用して、コードの問題を避けるために使用する必要があります。

PHPのPCRE関数と一致する高度なパターン PHPのPCRE関数と一致する高度なパターン Jul 28, 2025 am 04:41 AM

PHPのPCRE関数は、高度な通常の機能をサポートしています。 2。ポジティブ/ネガティブな先制のアサーション(?=)および(?!)および発行後のアサーション(???)および発行後のアサーション(??

JSONを超えて:PHPのネイティブストリングシリアル化の理解 JSONを超えて:PHPのネイティブストリングシリアル化の理解 Jul 25, 2025 pm 05:58 PM

PHPのネイティブシリアル化は、JSONよりもPHPの内部データストレージと送信により適しています1。完全なデータ型(int、float、boolなど)を保持できるため。 2。プライベートおよび保護されたオブジェクトプロパティをサポートします。 3.再帰的な参照を安全に処理できます。 4.脱介入中に手動タイプの変換は必要ありません。 5.通常、パフォーマンスはJSONよりも優れています。ただし、言語間のシナリオで使用するべきではなく、リモートコード実行攻撃のトリガーを避けるために、信頼されていない入力のためにUnserialize()を呼び出さないでください。 PHP環境に限定されており、高忠実度データが必要な場合に使用することをお勧めします。

バイナリデータの開梱:PHPの `pack()`および `unpack()`の実用的なガイド バイナリデータの開梱:PHPの `pack()`および `unpack()`の実用的なガイド Jul 25, 2025 pm 05:59 PM

PHPのpack()およびunpack()関数は、PHP変数とバイナリデータ間の変換に使用されます。 1.Pack()パッケージ整数や文字列などの変数はバイナリデータになり、Unpack()はバイナリデータをPHP変数に解凍します。どちらもフォーマット文字列に依存して、変換ルールを指定します。 2。一般的な形式コードには、C/C(/unsigned文字を含む8ビット)、S/S(16ビットショート整数)、L/L/V/N(32ビットの長い整数、異なるエンドアンネスに対応)、F/D(フローティングポイント/ダブル精度)、A/A(塗りつぶし文字列)、X(null bute)などが含まれます。大規模なエンディアン(ネットワーク標準)。 vは、プラットフォーム間で通信するときに最初に使用する必要があります。

See all articles