2011-12-08 7 views
0

SQLインジェクションを防止しようとしています。
この目的のために私はmysql_real_escape_string()を使用します。私のローカルサーバー(phpversion 5.3.2)でmysql_real_escape_string()一重引用符で異なる動作

:テーブルにNEWSTRING $を挿入

$string="a'b" 
$newstring=mysql_real_escape_string($string); 

query("INSERT INTO .. ..field1='$newstring'");

は "A'B" を置きます。
別のサーバー(phpversion 5.2.10)では、 "a \ 'b"をテーブルに入れます。

「a'b」を挿入して注射を避けるにはどうすればよいですか?
他のクエリに影響する可能性があるので、INIファイルとmagic_quotesを変更したくありません。
add_slashesを使用することはできません。スラッシュを削除するための値を取得するためのすべての用途を探す必要があります。

+0

しかし、magic_quotesはサーバではオフになっていて、もう一方ではオフになっていますか? –

答えて

0

magic_quotes_gpcが有効な場合は、まずstripslashes()をデータに適用します。すでにエスケープされたデータに対してこの関数を使用すると、データを2回エスケープします。

if(get_magic_quotes_gpc()) { 
    $newstring = stripslashes($newstring); 
} 
+0

しかし、最高の*ものは、マジック引用符を一切使わないことです。これは過去のことです。 –

+0

彼はサーバーのPHP設定を変更する権利を持っていない場合はどうなりますか? –

+0

は私のためにうまくいった、今質問は: "これとmysql_real_escape_stringを使うのは安全ですか?" – lvil

0

最も可能性の高い問題は、あるサーバでmagic_quotesを有効にして、他のサーバでは有効にしないことです。 無効magic_quotesのいずれか、またはコードに変更します。

$example = stripslashes($_POST['example']);  //undoes the magic_quotes 
$escaped_string = mysql_real_escape_string($example); //escapes it properly. 

あなたが開いていること、接続に応じて、異なる動作しますmysql_real_escape_string 2つの異なるデータベース・サーバ

から2つの接続を持っている場合は可能性が低いシナリオが発生する可能性があります。
複数のサーバーがあり、複数の接続がある場合は、接続ごとに1回エスケープ機能を実行する必要があります。

$example = "a'b"; 
$connectionA = mysql_connect('localhost', 'mysql_user', 'mysql_password'); 
$connectionB = mysql_connect('remotehost', 'mysql_user', 'mysql_password'); 
$escapedstringA = mysql_real_escape_string($example, $connectionA); 
$escapedstringB = mysql_real_escape_string($example, $connectionB); 

あなたはmysql_real_escape_stringへの呼び出しで接続パラメータを省略した場合、両方のescapedstringsが間違っていた、remotehostのデフォルトのエンコーディングを使用してエスケープされます。

このコードが間違って動作することがあります。

$example = "a'b"; 
$connectionA = mysql_connect('localhost', 'mysql_user', 'mysql_password'); 
$connectionB = mysql_connect('remotehost', 'mysql_user', 'mysql_password'); 
$escapedstringA = mysql_real_escape_string($example); //uses remotehost's encoding 
$escapedstringB = mysql_real_escape_string($example); 
+0

Wut? 'a'b'が表の中で' a \ b 'に変わると、mysql_real_escape_string()とは何の関係もありません。 –

+0

@Pekka、私はあなたが間違ったエンコーディングでエスケープされた値を非常に異なるエンコーディングで再利用している場合、 magic_quotes' – Johan

0

これはおそらくmysql_real_escape_string()とは何の関係もありませんが、あなたのmagic_quotes設定。

望ましい事はそれが本当に不可能な場合hereは、PHPコード内からマジッククオートを「無効」にする方法の例である、as even the PHP manual itself recommends.

をマジッククオートをオフにすることです。

0

これは実際には魔法の引用符です。あなたが行うことができる唯一のことは、魔法のqoutesを検出し、スラッシュを取り除くことです。 Theresのグローバル

あなたがもし条件を使用し,,世界的にそれをしたいいけないし、ストリップがちょうどその上スラッシュ場合は、ここで

http://php.net/manual/en/security.magicquotes.disabling.php

コメントをチェック動作しますあなただけの場所にドロップすることができますいくつかのスクリプト変数

0

私は、SQLインジェクションを防ぐためにしようとしています。
この目的のために私はmysql_real_escape_string()を使用します。

この質問を見て、それはあなたのために面白いかもしれません:短い、「使用mysql_real_escape_stringの」でApparently there is an SQL injection bug in my PHP code

は、「SQLインジェクションを防ぐ」ために十分ではありません。 文字列のみには便利ですが、他の部分では異なるアプローチが必要です。 詳細については私の以前の回答を参照してください:https://stackoverflow.com/a/2995163/285587

関連する問題