DB(mysql)に「serialize($array);
」を付けてデータを保存します。このデータは、入力フィールドのあるフォームから取得されました。a:4:{i:1;s:7:"fdsfdsf";i
フォームフィールドに「」のようなものを挿入するとどうなるか知りたいです。DBに保存されているデータを壊す可能性はありますか?ありがとう!!
3 に答える
私は自分のシステムであなたの例をテストしました、そしてシリアル化の後、次の値が返されます:
string(42) "a:1:{i:0;s:24:"a:4:{i:1;s:7:"fdsfdsf";i";}"
これがデータベースに追加されるものです。ただし、ユーザー入力をデータベースにプレーンに保存することは強くお勧めしません。mysql_real_escape_string()
重要な文字をエスケープするため、最初にプレーンユーザー入力をフォーマットする必要があります。
それとは別に、unserialize()
データベースから読み戻されたシリアル化されたテキストでが呼び出された場合、配列は適切に返されます。安全なはずですが、予期しない結果が生じる可能性があります。
シリアル化された配列をデータベースに格納する場合は、細心の注意を払ってください。シリアル化は文字列を返すため、データを格納するフィールドは通常VARCHAR
またはTEXT
です。保存された配列を新しい配列で上書きするだけでは、古いデータは完全に失われます。データベースを更新するには、最初にデータベースから配列にデータを読み取り、それを更新してから、データベースに書き戻すようにしてください。
禁止されているわけではありませんが、データベースでシリアル化されたものを使用および保存すると、通常、多くの問題が発生します。データベースにはデフォルトで既知の多くのデータ型があり、大きなシリアル化された配列はオーバーヘッドを作成し、実行を複雑にします。システムを後で変更する必要がある場合は、単にお尻の痛みです。また、シリアル化されたフィールドでリレーションクエリを使用することはできません。
古い方法
まだ使用しているmysql_
場合は、次のようなクエリを作成できます。
$sql = sprintf("INSERT INTO mytable (a) VALUES ('%s')",
mysql_real_escape_string(serialize($myvar))
);
mysql_query($sql) or die("oh no!");
推奨される方法
PDO
とmysqli
あなたは準備されたステートメントを使用するオプションを取得します。これは、SQLインジェクション攻撃ベクトルを防ぐために強く推奨されます。PDOの例:
$stmt = $db->prepare('INSERT INTO mytable (a) VALUES (:myvar)');
$stmt->execute(array(
':myvar' => serialize($myvar),
));
フィールド長
また、シリアル化されたデータの長さがテーブルフィールドの列サイズを超えないようにしてください。切り捨てられたシリアル化された変数はほとんど役に立ちません。
これをブロックする方法は、データベースにデータを挿入する前に引用符をエスケープすることです。
これはhttp://www.php.net/manual/en/mysqli.real-escape-string.phpで行うことができますmysqli_real_escape_string()