特にユーザー入力を処理したり、動的コンテンツを提示したりする場合、キャラクターの脱出はPHPで一般的なタスクです。 HTMLENTITIESおよびget_html_translation_tableは、文字をHTMLエンティティに変換し、それぞれHTMLエンティティの変換テーブルを取得するために使用される2つの一般的に使用されるPHP関数です。これら2つの機能を合理的に使用すると、より正確なキャラクターエスケープを実現し、潜在的なセキュリティの脆弱性を回避し、ウェブサイトの正しさとセキュリティを確保できます。
HTMLENTITIES関数は、文字列内の文字をHTMLエンティティに逃れるために使用されます。主に、クロスサイトのスクリプト攻撃(XSS)およびその他のHTMLインジェクション攻撃を防ぐために使用されます。いくつかの特殊文字( < 、 >など)をHTMLエンティティに変換することにより、 HTMLENTITIESがこれらの文字がブラウザで正しくレンダリングされるようにします。
<span><span><span class="hljs-variable">$string</span></span><span> = </span><span><span class="hljs-string">"<div>Some text</div>"</span></span><span>;
</span><span><span class="hljs-variable">$escaped_string</span></span><span> = </span><span><span class="hljs-title function_ invoke__">htmlentities</span></span><span>(</span><span><span class="hljs-variable">$string</span></span><span>, ENT_QUOTES, </span><span><span class="hljs-string">'UTF-8'</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$escaped_string</span></span><span>; </span><span><span class="hljs-comment">// 出力:&lt;div&gt;Some text&lt;/div&gt;</span></span><span>
</span></span>
上記の例では、 HTMLENTITIESはHTMLタグ<div>および</div>をエンティティ文字&lt; div&gt;に変換します。および&lt;/div&gt;。これにより、これらのタグを解析するブラウザが回避され、潜在的なスクリプトインジェクション攻撃が妨げられます。
get_html_translation_table関数は、すべてのHTML特殊文字とその対応するエンティティを含む翻訳テーブルを返します。このテーブルは、HTMLENTITIESおよびHTMLSPECIALCHARS関数の背後にある作業の基礎です。このテーブルを介して、文字エスケープをカスタマイズするか、特定の文字に対応するエンティティを手動で取得することができます。
<span><span><span class="hljs-variable">$translation_table</span></span><span> = </span><span><span class="hljs-title function_ invoke__">get_html_translation_table</span></span><span>(HTML_ENTITIES, ENT_QUOTES, </span><span><span class="hljs-string">'UTF-8'</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$translation_table</span></span><span>);
</span></span>
この関数は、キーが文字であり、値が対応するHTMLエンティティである連想配列を返します。たとえば、次のような構造を返します。
<span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
(
[<] => &lt;
[>] => &gt;
[&] => &amp;
[<span class="hljs-string">"] => &quot;
['] => &#039;
...
)
</span></span></span>
HTMLENTITIESはすでにほとんどのキャラクターエスケープタスクを実行できますが、特に特定のキャラクターを扱う場合、キャラクターエスケープをより詳細に制御する必要がある場合があります。この場合、 get_html_translation_tableを組み合わせることで、エスケープ操作がより正確かつ柔軟になります。
標準のHTMLENTITIESエスケープメソッドを使用せずに、カスタムルールに従ってHTMLエンティティの特定の文字をエスケープする必要があるとします。最初にget_html_translation_tableを介して標準のエスケープテーブルを取得し、次にこのテーブルを変更してニーズに合わせて変更できます。
<span><span><span class="hljs-comment">// 標準を取得します HTML エンティティ変換テーブル</span></span><span>
</span><span><span class="hljs-variable">$translation_table</span></span><span> = </span><span><span class="hljs-title function_ invoke__">get_html_translation_table</span></span><span>(HTML_ENTITIES, ENT_QUOTES, </span><span><span class="hljs-string">'UTF-8'</span></span><span>);
</span><span><span class="hljs-comment">// テーブル内の特定の文字の脱出方法を変更する</span></span><span>
</span><span><span class="hljs-variable">$translation_table</span></span><span>[</span><span><span class="hljs-string">'<'</span></span><span>] = </span><span><span class="hljs-string">'&lt;'</span></span><span>; </span><span><span class="hljs-comment">// デフォルトの動作</span></span><span>
</span><span><span class="hljs-variable">$translation_table</span></span><span>[</span><span><span class="hljs-string">'&'</span></span><span>] = </span><span><span class="hljs-string">'&amp;'</span></span><span>; </span><span><span class="hljs-comment">// たとえば、私たちはまだ保持しています '&' 逃げる</span></span><span>
</span><span><span class="hljs-comment">// 自定义其他字符的逃げる</span></span><span>
</span><span><span class="hljs-variable">$translation_table</span></span><span>[</span><span><span class="hljs-string">'*'</span></span><span>] = </span><span><span class="hljs-string">'&ast;'</span></span><span>; </span><span><span class="hljs-comment">// 意思 '*' 逃げる为 '&ast;'</span></span><span>
</span><span><span class="hljs-comment">// 意思修改后的表应用于字符串</span></span><span>
</span><span><span class="hljs-variable">$string</span></span><span> = </span><span><span class="hljs-string">"Hello * World!"</span></span><span>;
</span><span><span class="hljs-variable">$escaped_string</span></span><span> = </span><span><span class="hljs-title function_ invoke__">strtr</span></span><span>(</span><span><span class="hljs-variable">$string</span></span><span>, </span><span><span class="hljs-variable">$translation_table</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$escaped_string</span></span><span>; </span><span><span class="hljs-comment">// 出力:Hello &ast; World!</span></span><span>
</span></span>
このようにして、どのキャラクターを逃れる必要があるか、どのキャラクターがそのまま残るかを柔軟に制御できます。
HTMLエンティティを使用して一部のキャラクターを逃れたいだけで、他のキャラクターがそのままのままであるとします。 htmlentitiesとget_html_translation_tableを組み合わせて、この効果を達成できます。たとえば、他のキャラクターをそのまま残している間、逃げたいだけかもしれません。
<span><span><span class="hljs-variable">$string</span></span><span> = </span><span><span class="hljs-string">"This is a <div> & 'text' with some special characters."</span></span><span>;
</span><span><span class="hljs-variable">$translation_table</span></span><span> = </span><span><span class="hljs-title function_ invoke__">get_html_translation_table</span></span><span>(HTML_ENTITIES, ENT_NOQUOTES, </span><span><span class="hljs-string">'UTF-8'</span></span><span>);
</span><span><span class="hljs-comment">// 只逃げる <, > そして & シンボル</span></span><span>
</span><span><span class="hljs-variable">$escaped_string</span></span><span> = </span><span><span class="hljs-title function_ invoke__">strtr</span></span><span>(</span><span><span class="hljs-variable">$string</span></span><span>, </span><span><span class="hljs-variable">$translation_table</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$escaped_string</span></span><span>; </span><span><span class="hljs-comment">// 出力:This is a &lt;div&gt; &amp; 'text' with some special characters.</span></span><span>
</span></span>
htmlentitiesとget_html_translation_table関数を合理的に組み合わせることにより、PHP開発者はより柔軟で正確なキャラクターエスケープを実現できます。 htmlentitiesは、ほとんどの場合に機能する強力でシンプルな機能であり、 get_html_translation_tableを使用すると、開発者は特定の文字のより詳細な制御のために変換テーブルをカスタマイズできます。 2つの組み合わせは、キャラクターのセキュリティと効率を逃がし、潜在的なセキュリティリスクを減らし、動的なWebコンテンツの通常の表示を確保することができます。
実際の開発プロセスでは、ニーズに応じて適切なエスケープ方法を選択することで、コードの堅牢性を改善するだけでなく、ユーザーにより安全で信頼性の高いエクスペリエンスを提供できます。