umask()は、実際にはファイルまたはディレクトリに権限を直接設定していません。マスクを介したファイルまたはディレクトリの権限の値を制限します。各ファイルとディレクトリには、通常(ファイル)と777 (ディレクトリ)が作成されたときにデフォルトの許可があります。ただし、 umask()は、これらのデフォルト値でビットワイズと「操作(および)を実行することにより、実際のアクセス許可を設定します。
たとえば、デフォルトの許可777はUMASK値で計算され、最終許可値を計算します。例えば:
デフォルトのディレクトリ権限: 777
Umask Value: 022
計算結果は755です。つまり、ディレクトリの権限はRWXR-XR-Xです。
PHPでは、 UMASK()関数を使用してプロセスのUMASKを設定できます。設定後、PHPは、後続の作成でファイルまたはディレクトリを作成する際にUMASK値の影響を受けます。通常、ディレクトリが作成される前に、UMASK値を設定する必要があります。
たとえば、次のコードは0022にumaskを設定するため、PHPによって作成されたディレクトリには755の権限があります。
<span><span><span class="hljs-comment">// 設定 umask</span></span><span>
</span><span><span class="hljs-title function_ invoke__">umask</span></span><span>(</span><span><span class="hljs-number">0022</span></span><span>);
</span><span><span class="hljs-comment">// ディレクトリを作成します</span></span><span>
</span><span><span class="hljs-title function_ invoke__">mkdir</span></span><span>(</span><span><span class="hljs-string">'new_directory'</span></span><span>);
</span></span>
上記の例では、 MKDIR()関数は755の権限を持つディレクトリを作成します。デフォルトの許可777をマイナスUMASK 022の後、最終ディレクトリ許可は755です。
特に公共または共有サーバー環境でディレクトリの権限を設定する場合、過度の権限がセキュリティリスクにつながる可能性があります。たとえば、ディレクトリアクセス許可を777(完全に開いている)に設定すると、誰でもディレクトリのコンテンツを読み、書き込み、実行できます。この問題を回避するには、755や750などの少なくとも保守的な許可を使用することをお勧めします。
Umask()によって設定された許可マスクは、現在のプロセスによって作成されたファイルまたはディレクトリにのみ影響することに注意する必要があります。 umask()は、既存のファイルやディレクトリに影響を与えません。作成されたファイルまたはディレクトリに権限を変更する必要がある場合は、 chmod()関数を使用できます。
<span><span><span class="hljs-title function_ invoke__">chmod</span></span><span>(</span><span><span class="hljs-string">'existing_directory'</span></span><span>, </span><span><span class="hljs-number">0755</span></span><span>);
</span></span>
一部のPHP構成環境(PHPのセーフモード有効またはOpen_Basedirが設定されているなど)では、PHPのファイルとディレクトリの操作権限が制限される場合があります。 Umask()を介してアクセス許可を設定した場合でも、これらの構成によって制限される場合があります。したがって、これらの環境でumask()を使用する場合は、特別な注意が必要です。
ファイルのアップロードをサポートするWebアプリケーションでは、アップロードされたファイルが特定の権限を必要とすることがよくあります。 umask()を使用して、ファイルが作成されたときにアクセス許可を制御します。たとえば、ユーザーがアップロードしたファイルを処理する場合、適切なUMASK値を設定して、アップロードされたファイルにあまりにも緩いアクセス許可がないことを確認できます。
<span><span><span class="hljs-comment">// 設定 umask,ファイルの許可がないことを確認してください 777</span></span><span>
</span><span><span class="hljs-title function_ invoke__">umask</span></span><span>(</span><span><span class="hljs-number">0022</span></span><span>);
</span><span><span class="hljs-comment">// アップロードされたファイルを処理します</span></span><span>
</span><span><span class="hljs-title function_ invoke__">move_uploaded_file</span></span><span>(</span><span><span class="hljs-variable">$tmp_name</span></span><span>, </span><span><span class="hljs-variable">$destination</span></span><span>);
</span></span>
Webアプリケーションでは、キャッシュディレクトリは通常、一時的なデータを保存するために使用されます。キャッシュされたディレクトリが悪意のあるユーザーによって変更されないようにするために、適切なUMASKを設定することにより、ディレクトリに正しいアクセス許可があることを確認できます。
<span><span><span class="hljs-title function_ invoke__">umask</span></span><span>(</span><span><span class="hljs-number">0027</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">mkdir</span></span><span>(</span><span><span class="hljs-string">'/path/to/cache'</span></span><span>, </span><span><span class="hljs-number">0775</span></span><span>);
</span></span>
この例では、キャッシュディレクトリは許可775として作成されます。ファイル所有者と同じユーザーのグループのみが許可を読み書きしていますが、他のユーザーはディレクトリのコンテンツを変更できません。