PHPでは、ユーザーがサビされたHTMLフォームデータを処理する場合、特にデータベースと対話したりHTMLコンテンツを生成したりする場合、潜在的なセキュリティの脆弱性を防ぐために、データが処理および脱出されることがよくあります。一般的なエスケープ方法の1つは、 addcslashes関数を使用することです。ただし、フォームデータを処理すると、多くの開発者が一般的なソリューションとしてAddCslashesを使用し、ユーザーが入力したデータを直接使用することがよくあります。それで、 AddCslashesはすべてのケースで機能しますか?他にもっと適切な方法はありますか?
AddCslashesは、文字列内の特定の文字を逃れるPHPの文字列関数です。その機能は、指定された文字セットに基づいて、文字列内の文字内の文字に属する文字をバックスラッシュと文字フォームに逃がすことです。例えば:
<span><span><span class="hljs-variable">$str</span></span><span> = </span><span><span class="hljs-string">"Hello, World!"</span></span><span>;
</span><span><span class="hljs-variable">$escaped</span></span><span> = </span><span><span class="hljs-title function_ invoke__">addcslashes</span></span><span>(</span><span><span class="hljs-variable">$str</span></span><span>, </span><span><span class="hljs-string">'l'</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$escaped</span></span><span>; </span><span><span class="hljs-comment">// 出力: He\l\lo, Wor\l\d!</span></span><span>
</span></span>上記の例では、 addcslashesはすべての文字lを\ lに逃げます。
AddCslashesは、文字列内の特定の文字を逃れるために使用できますが、特にセキュリティの観点からHTMLフォームデータの処理には適していません。理由は次のとおりです。
HTML注入を防ぐことはできません: AddCslashesは単に文字を逃がすだけで、HTMLタグを処理しません。フォームデータに悪意のある<script>タグまたは他のHTML要素が含まれている場合、 addcslashsはこれらのコンテンツの実行を防ぐことができず、XSS(クロスサイトスクリプト攻撃)の脆弱性につながる可能性があります。
キャラクターの脱出は単純すぎます。AddCslashesは、主にコントロールキャラクターや引用符、バックスラッシュなどの特殊文字を逃れるために使用されますが、いくつかの一般的なセキュリティの問題を考慮していません。たとえば、 AddCslashesは、ユーザー入力に含まれる可能性のある悪意のあるJavaScriptコードまたはSQLインジェクションから効果的に保護することはできません。
データベースクエリには適用されません:フォームデータをデータベースに保存する場合、 AddCslashesは適切なSQLエスケープメソッドの代替ではありません。たとえば、MySQLデータベースの場合、入力を手動で脱出するのではなく、パラメーター化されたクエリを使用する必要があります。
HTMLフォームデータを処理するために、より適切な方法を次に示します。
XSS攻撃を防ぐためにユーザーが入力したデータをWebページに直接出力する必要がある場合は、 htmlspecialcharsまたはhtmlentities関数を使用する必要があります。彼らは、悪意のあるHTMLまたはJavaScriptが実行されないように、特別なHTML文字を逃れることができます。
<span><span><span class="hljs-variable">$user_input</span></span><span> = </span><span><span class="hljs-variable">$_POST</span></span><span>[</span><span><span class="hljs-string">'user_input'</span></span><span>];
</span><span><span class="hljs-variable">$safe_input</span></span><span> = </span><span><span class="hljs-title function_ invoke__">htmlspecialchars</span></span><span>(</span><span><span class="hljs-variable">$user_input</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">$safe_input</span></span><span>; </span><span><span class="hljs-comment">// 出力安全的 HTML</span></span><span>
</span></span>HTMLSPECIALCHARSは、< 、 > 、 &&& "および'にhtmlエンティティに変換し、ブラウザによってHTML要素に解析されないようにします。
ENT_QUOTESパラメーターは、二重引用符と単一引用符の両方が逃げることを保証します。
SQLクエリの場合、入力データをエスケープするためにAddCslashesを使用しないでください。データベースドライバーが提供するパラメーター化されたクエリメソッドを使用して、エスケープの問題を自動的に処理し、SQLインジェクションを防ぐ必要があります。
たとえば、MySQLIまたはPDOを使用している場合、次の方法を使用できます。
mysqliの使用:
<span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"SELECT * FROM users WHERE username = ?"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bind_param</span></span><span>(</span><span><span class="hljs-string">"s"</span></span><span>, </span><span><span class="hljs-variable">$user_input</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
</span></span>PDOの使用:
<span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"SELECT * FROM users WHERE username = :username"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bindParam</span></span><span>(</span><span><span class="hljs-string">':username'</span></span><span>, </span><span><span class="hljs-variable">$user_input</span></span><span>, PDO::</span><span><span class="hljs-variable constant_">PARAM_STR</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
</span></span>このようにして、データベースは入力データを自動的に処理し、手動の脱出によってもたらされるセキュリティリスクを回避します。
特定の入力検証の場合、ユーザーの入力を制限するために正規表現を使用する必要がある場合があります。たとえば、ユーザー名を制限して、文字と数字のみを許可します。
<span><span><span class="hljs-variable">$user_input</span></span><span> = </span><span><span class="hljs-variable">$_POST</span></span><span>[</span><span><span class="hljs-string">'username'</span></span><span>];
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">preg_match</span></span><span>(</span><span><span class="hljs-string">"/^[a-zA-Z0-9]+$/"</span></span><span>, </span><span><span class="hljs-variable">$user_input</span></span><span>)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Valid username!"</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Invalid username!"</span></span><span>;
}
</span></span>このアプローチにより、ユーザーの入力は予想される形式を満たすことが保証されますが、HTMLまたはSQLセキュリティ保護を完全に置き換えるわけではありません。
AddCslashesは、エスケープメカニズムが単純で十分なセキュリティがないため、HTMLフォームデータの処理には適していません。ユーザーが入力したデータの場合、それを処理する正しい方法は、使用することです。
XSS攻撃を防ぐためのHTMLSPECIALCHARSまたはHTMLENTITIES 。
SQL注入を防ぐためのパラメーター化されたクエリ。
適切な正規表現を使用して、ユーザー入力の形式を確認します。
これらの方法は、アプリケーションのセキュリティを効果的に改善し、一般的な脆弱性を回避します。したがって、開発者は、さまざまな機能の該当するシナリオを理解し、ユーザー入力データを処理する最も適切な方法を選択する必要があります。
関連タグ:
HTML addcslashes