2011-07-08 15 views
3

SQLインジェクションを防ぐために、入力データをフィルタリングする必要があります。 addslashesまたはmysql_real_escape_stringが使用されている接続モジュールによって異なります入力からエスケープする方法データベースからエスケープしないで保存する

ただし、addslashesでエスケープされたデータはスラッシュ付きでデータベースに保存されるため、ユーザーの姓はO'Reillyとして保存されます。それを正確に表示するには、ストライプラッシュを使用する必要があります。

どうすればaddslashesを使用して、スラッシュなしでデータベースに保存できますか?それは実際にやるべき方法ですか?

+0

文字列を2回エスケープしているようです(おそらく、PDOとmysql_real_escape_stringを同時に使用しています)。 – a1ex07

+0

はい、PDOと私はaddslashesを使用しています。 PDOが文字をエスケープする方法 –

+0

PDOを使用し、パラメータに 'bindParam' /' bindValue'を指定すると、エスケープについて心配する必要はなく、PDOはそれを行います – a1ex07

答えて

6

あなたは使用しないaddslashesmysql_real_escape_stringのような適切なDB固有のエスケープ機能を使用します。

PDOを使用している場合、プリペアドステートメントを使用すると、バインディングプロセスの一部として変数がエスケープされます。

$pdo = new PDO($dsn, $user, $name); 
$stmt = $pdo->prepare('INSERT INTO your_table (col1, col2,col3) VALUES (?, ?, ?)'); 
$stmt->execute(array('value 1', 'value 2', 'value 3'); 

ORあなたはparamsという名前を使用することができ、余分な読みやすさとesier再利用のため:

$pdo = new PDO($dsn, $user, $name); 
$stmt = $pdo->prepare('INSERT INTO your_table (col1, col2,col3) VALUES (:col1, :col2, :col3)'); 
$stmt->execute(array(':col1' =>'value 1', ':col2' =>'value 2', ':col3' =>'value 3'); 
+0

ok ...あなたたちは少し矛盾しています... a1ex07はbindParamがデータをエスケープすると言うと、エスケープデータを準備します。 –

+0

paramtersをステートメントにバインドするには複数の方法があります... bindParamで行うこともできますし、ここでやったようにすることもできますし、 'PDO :: quote'を使って準備された声明。猫の皮膚には複数の方法がありますが、どちらも同じことを本質的に行います。どちらを使用するかは、機能をコード化する必要があるかどうかによって異なります。 [このチュートリアルをチェックしてください](http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/)の基本については、 – prodigitalson

0

addslashesはワンサイズであるために仮定される。この場合、すべてを行う必要があるようなものです - エスケープメカニズム。 MySQLエスケープaddslashエスケープ文字列の場合はもちろん、addslashスラッシュを含む値がデータベースに保存されます。または両方を使用するのではなく、両方を使用します。

と言われていますが、は、addslashesを使用していません。それは本当の目的を果たしません。適切な状況では、特定のエスケープ・メカニズムを使用してください。つまり、mysql_real_escape_stringのみを使用してください。または、完全な混乱を避けるために準備されたステートメント。

0

プリペアドステートメント(PDOやmysqliライブラリなど)を使用する場合は、エスケープやフィルタリングの必要はありません。

関連する問題