2010-11-26 17 views
0

私はデータベースとWebアプリケーションに自分のデータを格納するために正式で正当なソリューションを探しています。私は数ヶ月で多くの意見を聞いたが、私は魔女が正しいとは思わない。私のwebappをよりスケーラブルにする計画実際のデータとエスケープされていないデータをデータベースに格納する方が便利だと思いますが、それに同意しますか?Webアプリケーションにデータを格納しエスケープする方法は?

私はPHP5、XHTML、MySQLiの擬似コードを使用したこのソリューションを使用しています。 私はどこでも使用していますUTF-8no 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?

答えて

1

私はPHPでという拡張子を使用しています。これは私はどちらかを可能にするPDOのquote()メソッドに入力パラメータをラップ:私は、データベースのレコードをフェッチしていたとき、私は必ず文字列である作る...

$first_name = $this->pdo->quote($_POST['first_name']); 
$sql = "INSERT INTO contacts (first_name) VALUES ('$first_name'); 
$res = $this->pdo->exec($sql); 
... 

あるいはプリペアドステートメントでパラメータ置換を使用

$sql = "INSERT INTO contacts (first_name, last_name, email) VALUES (?,?,?)"; 
$smt = $this->pdo->prepare(array(
    $_POST['first_name'], 
    $_POST['last_name'], 
    $_POST['email'] 
)); 

htmlspecialchars()でラップされ、整数はにラップされますが、これはおそらくスケーラビリティがありません。データベースから行を選択し、自動的に変換を適用する関数またはメソッドを作成したいとします。素早く汚れた例:

/** 
* @param string $table name 
* @param integer $id of record 
* @return array of returned objects 
* @abstract 
*/ 
function select_from_db() { 
    global $pdo; 
    $id = intval($id); 
    $row = array(); 
    $sql = "SELECT * FROM $table WHERE id = '$id'"; 
    $res = $pdo->query($sql); 
    while ($row = $res->fetchObject()) { 
     foreach ($row as $field => $value) { 
      $row[$field] = htmlspecialchars($value); 
     } 
    } 
    return $row; 
} 

// example usage: 
$res = select_from_db('contacts', 1); 
+0

あなたはhtmlspecialchars()をhtmlentities()の代わりに使うべきだと思いますか?ありがとう! –

+0

すべての文字をエンティティに変換する必要があるかどうかによって異なります。上記のようなラッパー関数で使用されている場合は、自由にそれらを置き換えて、それらの変更をアプリケーション全体に適用することができます。 –

関連する問題