2011-07-07 7 views
1

データベースにアポストロフィを含む可能性のあるユーザー入力を挿入する業界標準とは何ですか?そのような入力はウェブページ上のユーザに表示される。たとえば、ユーザーは「I'm cool」というフィールドを更新します。私はこの機能を自分のデータベースに挿入:データベースにアポストロフィを使用して値を格納する

public function updateDatabase($value) { 
    $value = mysql_real_escape_string($value); 
    Database::instance()->query(
     'UPDATE myTable 
     SET myColumn = ' . $value . ' 
     WHERE foo = "bar"' 
    ); 
} 

データベースは現在、「私は\ 'クールメートル」を格納します。適切かつ安全に戻ってすべてのユーザーに、この値を表示するには、私はこの機能でそれをきれいにする必要があります:

public function toSafeDisplay($userGeneratedValue) { 
    return stripslashes(
     htmlentities(
     $userGeneratedValue 
    ) 
    ); 
} 

私の関心は、私は、Webページに表示したいすべてのものの上にstripslasheshtmlentitiesをやって非常にプロセッサになるということですインテンシブ。 StackOverflowの一般的なコンセンサスは、データを可能な限り生のままにするために、データベースに挿入する前にhtmlentitiesを実行しないことです。これにより、後でウェブサイトだけでなく、どの媒体にでも表示することができます。だから我々は表示時にhtmlentitiesをすることを余儀なくされている。これはstripslashesでも当てはまりますか?または、SQLインジェクション攻撃を導入せずにデータベースを更新する前に、アポストロフィの前にあるすべてのスラッシュを削除することは可能ですか?

+2

いえば、SQLでバインド変数を使用してください。 – Thilo

+0

「バインド変数」が何を意味するのか分かりません。 Googleの結果は、文章の問題ではなく、変数を特定のスコープにバインドするというバインディングを表しています。あなたは例を挙げることができますか? – JoJo

+0

このような参照:http://docs.php.net/pdo.prepared-statements –

答えて

0

データベースにはI\'m coolとして保存するのではなく、I'm coolとします。エスケープは、アポストロフィをmyColumnに更新されたデータの一部として含めることです。私はサイトがユーザーに戻るI\'m coolを表示するケースを見ましたが、おそらくダブルエスケープのケースです。

編集:

mysql_real_escape_stringは、データベース内のスラッシュを格納しません。これは、SQLステートメントの値をエスケープします。あなたがmysql_real_escape_string(mysql_real_escape_string($value))に相当する何かをしたならば、あなたはデータベースの余分なスラッシュを得る唯一の方法です。 magic_quotes_gpcのは、最初のデータににstripslashes()を適用し、有効になっている場合

を:適切mysql_real_escape_stringの使用する開発者に

+0

どのように私は注射の攻撃を導入せずにすべてのアポストロフィの前に 'mysql_real_escape_string'が挿入するすべてのスラッシュを削除することを提案しますか? – JoJo

+0

答えに説明が追加されました。私はあなたがそれをしないと言っているわけではありません - 私はデータベースがバックスラッシュをデータの一部として保存しないので、データを表示するときにバックスラッシュを削除することを心配する必要はないはずです。そうであれば、ダブルエスケープの問題が起こりそうです。 –

+0

私の 'mysql_real_escape_string'に何か問題があります。私がこれを行うと、 '$ input =" O'Brien "; $出力= mysql_real_escape_string($入力); echo $ input。 ':' $ output; '、私はこれを得る:** O'Brien:O \ 'Brien **。これを引き起こす原因は何ですか? – JoJo

1

これはまったく機能しません。あなたがphpにそれを読んだときにあなたが挿入/更新に入るアポストロフィをエスケープするなら、それはエスケープされません。 HTML安全データをデータベースから取り出したい場合は、入力する前に安全にしてください。

+0

スラッシュは表示されませんが、アポストロフィは表示されます。 HTMLのためにエスケープすることはまだ必要です。 – Thilo

+0

mysql_real_escape_stringを使用すると、アポストロフィの前にスラッシュが表示されます。 'mysql_real_escape_string'がなければ、値はそのまま保存されますが、これは非常に危険です。安全なルートに進むには、スラッシュを削除してからユーザーに表示する必要があります。 – JoJo

+0

WindowsのPHPとMySQLの同じコードが格納されています。私はうまくいけばいいですが、Linuxサーバー(CentOS)にコードを転送すると、バックスラッシュの保存が開始されました。 – dtakis

1

注意してください。すでにエスケープされたデータに対してこの関数を使用すると、データを2回エスケープします。

magic_quotes_gpcがOnに設定されていることが分かった場合は、php.iniでOffにしてください!また

チェック:業界標準のhttp://gr.php.net/manual/en/function.mysql-real-escape-string.php

関連する問題