2012-03-21 13 views
2

における記号:(「)私は私の変数の保護以下の作ったSQL

$ad_title=htmlentities($ad_title); 
$ad_title=mysql_real_escape_string($ad_title); 
$ad_title=stripslashes($ad_title); 

しかし、私は引用記号を含む文字列を提出しようとするたびに(」) - すべてそれが悪いSQLクエリとして認識された後。

私が逃したものを教えていただけますか?

私はmysql_real_escape_stringを修正する必要がありますが、修正しないとわかります。

+2

そのソリューションは、SQLインジェクションの脆弱性あなたを残します@mikelbringに耳を傾けることはありません。 – dqhendricks

+2

@mikelbring:** NO ** addslashesは完全なもので、PHPから削除する必要があります。 –

+0

'mysql_real_escape_string'を使用する場合、' addslashes'は必要ありません。(もちろん 'stripslashes'もありません)アドバイス:ドキュメントを読む –

答えて

4

あなたの問題は、stripslashesがmysql_real_escape_stringの処理を元に戻してしまうことです。

starting out with: Miles O'Brien 
after m_r_e_s(): Miles O\'Brien 
after strip_slashes: Miles O'Brien 
+0

+1の例 –

0

コードから3行目を削除します。

$ad_title=htmlentities($ad_title); 
$ad_title=mysql_real_escape_string($ad_title); 
2

mysql_real_escape_stringをstripslashesに変更しても効果的にキャンセルされます。

また、データベースに保存するときではなく、出力する前に自分のものをhtmlでエスケープする必要があります。

代わりに、準備された文を使用できますが、私はこの答えを説明するのが怠惰だと感じています。 (それについてSO上の記事の何百万人をあります。)

+0

いいえ、* o * lazy :-) –

+0

@TheNail文法ナチ'd?ワオ。悲しい部分は、私はあまりにも正しいバリエーションを知っています。私はおそらく鍵を逃したでしょう。とにかく、簡単な文法訂正で楽しくてください。(もしあなたが非常に技術的になりたいのであれば、大文字小文字や句読点のない文章を書いただけです) – Corbin

+0

申し訳ありませんが、ややこしい言い訳はありませんでした。 –

0
$ad_title=htmlentities($ad_title); 

あなたはそれが(すぐに)HTMLドキュメントではなく、データベースに挿入する前に...しかしhtmlspecialcharsは十分なものでなければならないことができます。

$ad_title=mysql_real_escape_string($ad_title); 

あなたは(すぐに)MySQLの宛てのSQL文の中に一緒にいくつかの文字列をマッシュアップする前に...あなたはprepared statements and bound argumentsを使用してオフに非常に優れている買うことを行うことができます。

$ad_title=stripslashes($ad_title); 

あなたがマジッククオートをオンにしているサーバー上で立ち往生しているかもしれない場合は...うーん...それを実行してください...しかし前に、任意のエスケープを行う...あなたは魔法のオフクオートを回すことができない場合にのみ。

mysql_real_escape_stringを実行しても、それをしないでください(ほとんど)その効果が逆転します。

0

あなたは使用すべきではないライン

$ad_title=stripslashes($ad_title); 

を追加しました。あなたは基本的にSQLインジェクション保護をその行で取り除いています。行を削除し、それは正常でなければなりません。

0
<?php 
//This should be called first, but ONLY if it is required, or it will corrupt your data. 
//This must be done before you manipulate the data in any other way. 
//Generally, this is used on the data if your server has magic quotes on. 
//I've added code to detect if it is on or not. 
$ad_title = (get_magic_quotes_gpc()) ? stripslashes($ad_title) : $ad_title; 

//This line is fine, but only do it if you know it is necessary, because it is changing your data. 
//If you are doing it just because you were receiving an SQL error, I would recommend you comment this out. 
$ad_title = htmlentities($ad_title); 

//This should be the last thing you do to your data before using it in SQL. 
//This will take care of all required escaping, and protect you from SQL injection. 
$ad_title = mysql_real_escape_string($ad_title); 
?> 
+0

データベースに挿入する前にHTMLとしてエスケープしてはならない可能性が非常に高いです。マジッククォートについては、それを有効にしたホスティングプロバイダを絶対に使用しません。それは、PHP時代の後ろにあるという非常に強い兆候です。 – Corbin

+0

私は@Corbinに、データベースに挿入する前にHTMLとしてエスケープすることに同意します。 HTMLではなく、SQLのみでエスケープする必要があります。これは、元のデータではなく、変更されたバージョンを保存していることを意味します。これは何らかの理由で元に戻る必要があると感じると難しくなります。マジッククォートをオンにしているホストについては、それはばかげているかもしれませんが、多くは依然としてそうです。私は過去10年間に専用サーバを使用していたため、どのようなことが言えるかはわかりません。 –

関連する問題