2011-07-08 10 views
1

だから私はこれを実行します。MySQL_real_escape_stringにスラッシュを追加しないでください。

<?php 
    session_start(); 
    include("../loginconnect.php"); 
mysql_real_escape_string($_POST[int]); 
    $int = nl2br($_POST[int]); 
    $query = "UPDATE `DB`.`TABLE` SET `interests`='$int' WHERE `user`='$_SESSION[user]'"; 
    mysql_query($query) or die(mysql_error()); 
    mysql_close($con); 
    ?> 

をとのは、$ _POST [INT]があるとしましょう "のFoo」バー"。一重引用符はエスケープされないままであり、引用符のためにスクリプトを実行するとMySQLエラーが発生します。どうしましたか?

+0

私も$ _POST ['int']を引用符で使ってみましたが、それも失敗します。 –

答えて

2

m_r_e_s()エスケープされた値を返します。元の値は変更されません。私はPOST値にintの前後に引用符を追加しました

$int = mysql_real_escape_string($_POST['int']); 

$query = "UPDATE ... interests = '$int' ..."; 

注意。引用符がなければ、PHPはそれを定数値(例えばdefine())と見なします。その名前の定数が見つからない場合は、文字列を使用してそれに応じて調整することを意味すると丁寧に仮定しますが、警告を出します。以前

define('int', 'some totally wonky value'); 

を行っていた場合はPHPが代わりに$_POST[some totally wonky value]として、それを参照してくださいになるので、あなたは、間違ったPOSTの値にアクセスすることだろう。

+0

しかし、データベースでは、データはエスケープされません。どうして? –

+0

エスケープ処理はデータベースに移動する際に削除されるためです。エスケープは、SQL文を作成するときに実際のクエリ部分にのみ有効です。その後、MySQLは事柄がどこにあるのかを正確に知っているので、「いたずら」の価値が漏れることはありません。あいまいなやり方で、脱出は施設間を移動する間に囚人の手錠のようになります。囚人が新しい刑務所に入ると、手錠がはずされます。 –

+0

スラッシュが見えなくてもデータはまだ安全ですか? –

2

クエリでmysql_real_escape_stringの結果を使用していません。 これをやってみてください。

$int = nl2br(mysql_real_escape_string($_POST[int]);); 
0
  • あなたはプリペアドステートメントを使用する必要があります。これはmysql_ *関数に比べて若干習熟していますが、長期的にはそれほど価値があります。
  • $ _POST [int]の代わりに$ _POST ['int']のような文字列を引用する必要があります。
  • ファイルの先頭にerror_reporting(-1)を入れます。
関連する問題