2017-01-20 12 views
1

私は、バックスラッシュを含む文字列である定数を持っています\MySQLとPHPエスケープバックスラッシュ

問題は、MySQLが期待した動作ではないこの文字をエスケープしているようです。ここで

コードです:

const METHOD_TYPE_CREDITCARD = "Braintree\CreditCard"; 

$sql = "SELECT transaction_id AS id, 
    CASE 
    WHEN source_type = '0' THEN '".PaymentGateway::METHOD_TYPE_CREDITCARD."' 
    END AS source 
FROM transactions WHERE invoice_id = :id" 

それは確かに適切にクエリを実行しますが\をエスケープします。出力は次のようになります。

[id] => myx0kpe8 
[source] => BraintreeCreditCard 

何を試してみましたか?同じ結果を

const METHOD_TYPE_CREDITCARD = "Braintree\\CreditCard"; 
+0

これはバックスラッシュです。 \\それがエスケープします。よく書かれているメソッドの数と同じです。 – Strawberry

+0

@Strawberryはい、\\でエスケープすることができます。\\ PHPでエスケープしますが、MySQLはまだエスケープして 'BraintreeCreditCard'を出力しているようです。 – user3284463

+3

' pdo 'または' mysqli' –

答えて

3

あなたが行ったことは、自己作成のSQLインジェクションです。

既にコメントされているように、文字列連結の代わりにprepared statements(PDOまたは同等のものはmysqli)の形式でパラメータを使用する必要があります。

$stmt = $dbh->prepare("SELECT transaction_id AS id, 
    CASE 
    WHEN source_type = '0' THEN ':creditcard' 
    END AS source 
FROM transactions WHERE invoice_id = :id"); 
$stmt->bindParam(':creditcard', PaymentGateway::METHOD_TYPE_CREDITCARD); 

セキュリティのために、常にパラメータを使用する必要があります。最近ではSql Injectionのためにそれを使用しないのは難しいです。

+1

+1セキュリティだけでなく、簡単に。パラメータへの切り替えが完了したら、それを使用するのはとても簡単です。また、値をエスケープしたり、引用したり、前処理したりする方法について考える必要はありません。あなたは単にMySQLに: "Here is an int"または "Here is a string"と言って、残りは世話をします。実際にはパフォーマンスも向上します。 – GolezTrol