一部のまれなエンコーディングの場合、GBkなど> -はい。
しかし、この理由ではなく、元に戻す必要があります。とにかく魔法の引用符はオフにする必要があります(そして次のPHPバージョンになります)。したがって、mysql_real_escape_string()が唯一のエスケープ関数として残されています。 SQLインジェクション防止機能ではありませんのでご注意ください。多くの人がこの点を理解していません。それは構文の一部にすぎません。これは、何かを「保護」するためではなく、構文的に正しいSQLクエリをアセンブルするために使用する必要があります。また、データの取得元に関係なく、クエリを作成するたびに使用する必要があります。副作用として、SQLインジェクションからも保護されます。
もちろん、mysql_real_escape_string()
引用符で囲まれた文字列内でのみ機能します。だから、もしそうなら
$num=mysql_real_escape_string($num);
$sql="SELECT INTO table SET data=$num"; /BAD!!!
何も保護しません。引用符で囲まれていない数字を使用する場合は、次のように、必須の適切なタイプにキャストする必要があります。
$num=intval($num);
$sql="SELECT INTO table SET data=$num"; /GOOD
- mo make
mysql_real_escape_string()
であることを覚えておいてください 意図したとおりに機能し、適切なクライアントエンコーディングを設定する必要があり、のみ可能です。mysql_set_charset()
を使用 関数、SETNAMESクエリはそれを設定しません。
これらすべての複雑さを取り除きたい場合は、プリペアドステートメント ただし、mysqlドライバーをmysqliまたはPDOに切り替える必要があります。
適切な構文やプリペアドステートメントは、リテラル以外のクエリ部分では役に立たないことに注意してください。識別子や演算子をエスケープすることはできません。これらの部分を動的に使用する場合は、次のようにスクリプトにハードコーディングする必要があります(ORDER BY句の場合):
$orders=array("name","price","qty");
$key=array_search($_GET['sort'],$orders));
$orderby=$orders[$key];
$query="SELECT * FROM `table` ORDER BY $orderby";
またはこれ(WHERE句)
$w=array();
if (!empty($_GET['rooms'])) $w[]="rooms='".mysql_real_escape_string($_GET['rooms'])."'";
if (!empty($_GET['space'])) $w[]="space='".mysql_real_escape_string($_GET['space'])."'";
if (!empty($_GET['max_price'])) $w[]="price < '".mysql_real_escape_string($_GET['max_price'])."'";
if (count($w)) $where="WHERE ".implode(' AND ',$w); else $where='';
$query="select * from table $where";