書き込みの違いはありますか
{$_GET['id']}
と
'".$_GET['id']."'
SQLステートメントで?どちらも同じように動作します
書き込みの違いはありますか
{$_GET['id']}
と
'".$_GET['id']."'
SQLステートメントで?どちらも同じように動作します
get リクエストから直接 SQL にデータを入力することは常に悪い考えであり、SQL インジェクションを防ぐ簡単な方法がたくさんあります。
数値 ID が必要であることがわかっている単純なケースでは、値を強制的に数値にするだけで、SQL インジェクションの可能性はなくなります。1つの方法は、オコマンの の使用法である可能性がありますsprintf()
。おそらく次のようなものです。
$sql = "INSERT INTO table VALUES(".sprintf("%d",$_GET['id']) .")";
醜くて悪い形だと思いますが。このようなものはより良いです:
$sql = "INSERT INTO table VALUES(".(int)$_GET['id']) .")";
これは単純に値を int にキャストします。int にキャストできる数値でない場合は、必要な場合とそうでない場合がある「0」が返されます。
add_slashes()
他の代替手段(およびデータが数値であると想定されていない場合)には、または上記のなどのエスケープ関数の使用が含まれmysql_real_escape_string()
ます。
私見ですが、PHP 内からデータベース アクセスを使用し、SQL インジェクションから非常に簡単に保護する最良の方法は、新しい PHP PDO ライブラリ ( http://php.net/PDO ) を使用することです。これにより、データをまったく含まない SQL 文字列を記述し、後でデータベース サーバー自体にデータを追加することができます。この形式では、SQL インジェクションを行う方法はまったくありません。
コード例を次に示します。
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
$stmt = $dbh->prepare("INSERT INTO table VALUES (?)");
$stmt->bindParam(1, $_GET['id']);
$stml->execute();
ご覧のとおり、データは SQL クエリ自体に追加されないため、エスケープする必要はありません。
これらのいずれかを SQL ステートメントで直接使用することは、非常に悪い考えです。これにより、SQL インジェクションが可能になります。のようなものを使用して、必ず入力をサニタイズしてくださいmysql_real_escape_string
。
2 つの主な違いは、トップは二重引用符を使用する文字列内でのみ使用できることです。ただし、下部には二重引用符または単一引用符を使用できます。
私の知る限り違いはありませんが、そうすべきですか?SQLクエリへの無害化された入力を許可しています。つまり、Webサイトがインターネットに面している場合、SQLインジェクション攻撃に対して広く開放されたままになっています.
先に進む前に、次の Q&A をお読みください。
変数 (特に連想配列) を文字列で使用すると、間違いなくエラーが発生します。ただスタイルが悪い。私は、個人的には、2 番目の選択肢も好きではありません。
sprintf( '... %d ...', $_GET[ 'id' ] );
これは、変数を文字列に入れる私のお気に入りの方法です。