PHP で入力をサニタイズする
ユーザーデータはデータベースに保存する必要がありますが、データベースに保存する前に、不正な形式のデータが渡されないことを確認する必要があります。そうしないと、DB が台無しになります。これにより、データの整合性が保護されます。ユーザーは、サニタイズと検証の間で混乱することがよくあります。それらの唯一の違いは、検証によってデータが適切な形式であるかどうかが確認され、後でデータに不正な文字が存在しないことが確認されることです。今日の記事では、入力データをデータベース(RDBMS / NoSQL)に渡す前に PHP でサニタイズする方法を学習します。
サニタイズする必要がある最も一般的な入力は、HTML、SQL クエリを介した入力、およびユーザープロファイル情報です。
PHP で htmlentities()
を使用した HTML 入力サニタイズ
これは、すべての文字を HTML エンティティに変換する PHP によって提供される組み込み関数です。htmlspecialchars()
を使用することもできます。これら 2つの関数の唯一の違いは、htmlspecialchars()
が特殊文字を HTML エンティティに変換するのに対し、htmlentities()
はすべての文字を変換することです。
PHP での htmlentities()
の構文
htmlentities(string $string, $flags, $characterSet, boolean $doubleEncode);
パラメーター
$string
:これは必須パラメーターであり、変換を実行する必要のある入力データを取得します。$flags
:無効なエンコーディング、引用符、および使用されるドキュメントタイプの処理方法を指定するオプションのパラメータです。フラグには、ENT_COMPAT
、ENT_IGNORE
、ENT_HTML5
、ENT_NOQUOTES
などがあります。$characterSet
:使用する文字セットを指定するオプションのパラメーターです。文字セットには、UTF-8
、ISO-8859-1
などがあります。doubleEncode
:既存の HTML エンティティをエンコードするかどうかを指定するオプションのパラメータです。デフォルト値はtrue
で、すべてを変換します。
戻り値
上記の関数の出力には、変換された文字列が含まれています。ENT_IGNORE
や ENT_SUBSTITUTE
のようなフラグが設定されていない限り、文字列パラメータに無効なエンコーディングが含まれている場合は、空の文字列が返されます。
コード例:
<?php
$str = '<a href="https://www.google.com">Go to google.com</a>';
echo htmlentities($str);
?>
出力:
<a href="https://www.google.com">Go to google.com</a>
PHP で filter_var()
を使用した HTML 入力サニタイズ
これは PHP が提供する組み込み関数であり、入力データに対して検証とサニタイズが実行されます。
PHP での filter_var()
の構文
filter_var($inputValue, $filterType);
パラメーター
$inputValue
:これは必須パラメーターであり、フィルターチェックが適用される入力データを取得します。$filterType
:これは必須パラメーターであり、入力データに対して実行されるフィルターチェックを指定します。サポートされている値は次のとおりです。FILTER_VALIDATE_INT
:入力データが有効な整数であるかどうか。FILTER_SANITIZE_STRING
:入力データが有効な文字列であるかどうかにかかわらず、入力文字列からすべての HTML タグを削除します。FILTER_VALIDATE_IP
:入力データが有効な IP アドレスであるかどうか。FILTER_SANITIZE_EMAIL
:入力データが有効なメールアドレスであるかどうか。フィルタ var は最初に不正な文字を削除し、次に検証が実行されます。
戻り値
正常に渡された場合は、フィルタリングされた値を返します。
コード例:
<?php
$inputString = "<p>Hello World! Welcome to PHP tutorial</p>";
$newstr = filter_var($inputString, FILTER_SANITIZE_STRING);
echo $newstr. "\n";
?>
出力:
Hello World! Welcome to PHP tutorial
PHP での SQL クエリのサニタイズ
SQL インジェクションを防ぐために、開発者は常に PDO
/MySQLi
を使用する必要があります。PDO はデータベース抽象化レイヤーです。PDO は、外部データをサニタイズして SQL クエリに安全に埋め込み、この種の問題を回避します。DB にデータを送信する前に、filter_var()
を使用してデータを処理します。
コード例:
<?php
$servername = "hostname";
$username = "username";
$password = "password";
$dbname = "databaseName";
$lastname = "doe";
$connection = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$statement = $connection->prepare("SELECT id, email, firstname, lastname FROM Users WHERE lastname=:lastname");
$statement->execute(['lastname' => $lastname]);
$resultOuput = $statement->setFetchMode(PDO::FETCH_ASSOC);
?>
Shraddha is a JavaScript nerd that utilises it for everything from experimenting to assisting individuals and businesses with day-to-day operations and business growth. She is a writer, chef, and computer programmer. As a senior MEAN/MERN stack developer and project manager with more than 4 years of experience in this sector, she now handles multiple projects. She has been producing technical writing for at least a year and a half. She enjoys coming up with fresh, innovative ideas.
LinkedIn