私はデータベースとWebアプリケーションに自分のデータを格納するために正式で正当なソリューションを探しています。私は数ヶ月で多くの意見を聞いたが、私は魔女が正しいとは思わない。私のwebappをよりスケーラブルにする計画実際のデータとエスケープされていないデータをデータベースに格納する方が便利だと思いますが、それに同意しますか?Webアプリケーションにデータを格納しエスケープする方法は?
私はPHP5、XHTML、MySQLiの擬似コードを使用したこのソリューションを使用しています。 私はどこでも使用していますUTF-8とno magic_quotesです。
データ処理:
<?php
// catching data from a simple input form
$id_profile = $_POST['id_profile'];
$details['name'] = $_POST['name'];
$details['text'] = $_POST['text'];
// filter $details
foreach($details as &$item) { $item = trim($item); /* some stuff and other filters but no addslashes() */ }
// Preparing and doing the query
$stmt = $mysqli->prepare("
UPDATE profiles
SET name = ?, text = ?
WHERE id_profile = ? ");
$stmt->bind_param('ssi', $details['name'], $details['text'], $id_profile);
$stmt->execute();
// [...]
は、だから私のデータベースに、私は本当の入力したデータがないバックスラッシュを持っています。私は私のページのポイントで出力に私のテキストを必要とするとき、私は脱出するために、この小さな関数を使用する(フォーム、テーブル、ボタン、入力、パスワードフィールドを含め、すべてのDOM属性):
<?php
//a little escape function
function e($s) { return htmlentities($s, ENT_QUOTES, 'UTF-8'); }
// Preparing and doing the query
$stmt = $mysqli->prepare("
SELECT name, text
FROM profiles
WHERE id_profile = ? ");
$stmt->bind_param('i', $_POST['id_profile']);
$stmt->execute();
$stmt->bind_result($name, $text);
?>
<input type="text" id="name" value="<?=e($name) ?>"> <br />
<input type="text" id="text" value="<?=e($text) ?>"> <br />
<table>
<tr>
<td><?=e($name) ?></td>
<td><?=e($text) ?></td>
<td>
はこの正しいです、完全で安全ですか?いくつかのsuggesions?
あなたはhtmlspecialchars()をhtmlentities()の代わりに使うべきだと思いますか?ありがとう! –
すべての文字をエンティティに変換する必要があるかどうかによって異なります。上記のようなラッパー関数で使用されている場合は、自由にそれらを置き換えて、それらの変更をアプリケーション全体に適用することができます。 –