1

私は CakePHP で FCKEditor を使用しています。エディターから送信されたデータを保存するときに、データに対して htmlspecialchars() および mysql_real_escape_string() 関数を実行して、データベースに保存する前にデータを消去したいと考えています。問題は、CakePHP フレームワーク内でこれを行う場所がよくわからないことです。私はこのようにコントローラーで試しました:

function add() 
{
   if (!empty($this->data)) 
   {
      if ($this->Article->save(mysql_real_escape_string(htmlspecialchars($this->data)))) 
      {
         $this->Session->setFlash('Your article has been saved.');
     $this->redirect(array('action' => 'index'));
      }

   }
}

ただし、 $this->data は配列であり、これらの関数は文字列を想定しているため、機能しません。モデルの検証配列でそれを行いますか? 何も思いつきません。また、mysql_real_escape_string() 内で htmlspecialchars() を実行することが適切でない場合はお知らせください。

4

3 に答える 3

3

データを保存htmlspecialchars()するときは使用せず、データを HTMLに出力するときに使用します。HTML 以外のコンテキストでデータを表示する必要がある場合はどうすればよいでしょうか?

また、私は Cake のユーザーではありませんが、mysql_real_escape_string()データを保存する際にも申請が必要になるとは驚きです。データベース アクセス レイヤーは SQL インジェクションから保護する必要があり、手動で行うと、二重にエスケープされた文字列を格納することになります。

于 2009-06-05T16:26:11.827 に答える
1

CakePHPを使用して独自のSQL文字列を作成している場合、CakePHPはエスケープ関数を提供します。

escape(string $string, string $connection)

http://book.cakephp.org/view/1186/escape

于 2011-09-24T21:18:49.660 に答える
1

簡潔で簡単な答えは、データベース アクセスが抽象化されている場合、これらの関数を呼び出す必要はまったくないということです。

それらが必要とされる唯一の場所は、文字列のビットから実際の SQL を構築する場合です。とにかくすべきではありませんが、それは別の話です。

要するに、フレームワークは正しいことを行います。干渉しないでください。

編集: Bill Karwin が指摘するようhtmlspecialchars()に、ここでは完全に間違った部門からのものです。

于 2009-06-05T16:26:36.307 に答える