2012-01-06 22 views
5

PHPとmySQLデータベースを使用してコードスニペットを格納できるWebサイトを構築しています。しかし、私は自分のデータベースにユーザーが入力したコードを安全に挿入する方法を理解できません。私は通常、使用する安全機能(trimstripslashesなど)で入力を変換することができません。なぜなら、コードはデータベースに入力されたとおりに表示できるからです。私はmy_real_escape_string()を見ましたが、%_をエスケープしていないことがわかりました。これはMySQLワイルドカードとして使用できます。それは脅威を引き起こすのでしょうか、それともmy_real_escape_stringを使うことができますか?あらかじめThanx。安全にmySQLデータベースにコードを挿入する方法

+0

['addcslashes'](http://php.net/addcslashes)は、通常のエスケープや、LIKE式のプレースホルダをマスクするためのパラメータのバインディングによく使用されます。 – mario

+0

トリム/ストライプスラッシュは安全機能ではありません。固定長テキスト/文字列フィールドでデータが失われるのを心配している場合を除き、余分なスペースはSQLでは心配することはありません。 stripslashesは、magic_quotesが土地の王だったPHPの初期の時代から残っているごみの馬鹿げた頭脳の断片です。 –

+0

previous StackOverFlow質問にお答えできる質問:http://stackoverflow.com/questions/60174/best-way-to-stop-sql-injection-in-php http://stackoverflow.com/questions/4461759/parameterized -queries –

答えて

6

ワイルドカードは、SELECTクエリで使用された場合にのみ有効になり、特定の機能を使用する場合にのみ有効になります。したがって、コードを挿入する場合は、効果がないのでmysql_real_escape_string()を使用すると問題ありません。

パラメータバインディングを使用できるように、PHPs PDOを使用することをお勧めします。次の例では、the PHP manualからです:

PDOを使用して
<?php 
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)"); 
$stmt->bindParam(':name', $name); 
$stmt->bindParam(':value', $value); 

// insert one row 
$name = 'one'; 
$value = 1; 
$stmt->execute(); 

// insert another row with different values 
$name = 'two'; 
$value = 2; 
$stmt->execute(); 
?> 
1

パラメータ化された挿入文を使用します。実際には、選択と更新でもパラメータ化を使用してください。

これらは自動的に処理されます。

+1

なぜ賛成投票ですか? –

+2

私のdownvoteではありませんが、間違いなくOPの質問への答えではありません。さらに、使用するライブラリを説明していない –

0

$dsn = 'mysql:dbname=testdb;host=127.0.0.1'; 
$user = 'dbuser'; 
$password = 'dbpass'; 

try { 
    $dbh = new PDO($dsn, $user, $password); 
} catch (PDOException $e) { 
    echo 'Connection failed: ' . $e->getMessage(); 
} 

$calories = 150; 
$colour = 'red'; 
$sth = $dbh->prepare('INSERT INTO fruit(name, colour, calories) VALUES(?, ?);'); 
$sth->execute(Array($calories, $colour)); 
4

mysql_real_escape_string()を使用して文字列値のための完全な保護を提供します。データに%_が存在する可能性があるという事実は関連性がなく、セキュリティ上の脅威にはならない。 int型の値について

、あなたはどちらか、彼らが実際に数字であるかどうかを検証し、または引用符にそれらをラップする必要があります。引用符なし

$intValue = mysql_real_escape_string($_POST["intValue"]); 
$query = mysql_query("INSERT INTO table SET intValue ='$intValue'"); 
                 // note the quotes 

mysql_real_escape_string()は数値に無用です!

@Daniel A. Whiteがすでに述べたように、あなたが始めているのであれば、代わりにPDO libraryの使用を検討してください。これは古いmySQL関数よりも新しいものであり、適切に使用するとSQLインジェクションを不可能にするパラメータ化されたクエリを提供します。

0

これは私にとってはうまくいきました。[adscript]はコードスニペットです。

<textarea rows="6" cols="80"><input name="adscript" type="text/javascript" class="text-input textarea" id="adscript" value="<?php echo htmlentities($row['adscript']);?>" size="80" height="40" maxlength="1000"></textarea> 
関連する問題