0

クエリで実行するときに mysql_real_escape_string を使用する必要があることはわかっています。次に例を示します。

$ProjectHasReservationQuery = ("
                        SELECT * 
                        FROM reservelist rl
                            INNER JOIN project p on rl.projectid = p.projectid
                        WHERE rl.projectid = ". mysql_real_escape_string($record['projectid']) ."
                        AND restype = 'res'
                        ");

しかし、次のようにエコーアウトするのはどうですか:

query1 = mysql_query("SELECT * FROM users");
while ($record = mysql_fetch_array($query1 ))
{
    echo "".stripslashes(mysql_real_escape_string($record['usersurname']))."";
    // OR
    echo "".$record['usersurname']."";
}

どちらですか?echo "".$record['usersurname']."";個人的には、これはクエリから来ており、INTO ではないためだと思います。しかし、100%確信したい。

(PDO と mysqli については承知しています)

4

1 に答える 1

2

クエリで実行するときに mysql_real_escape_string を使用する必要があることはわかっています

逆に、このようなクエリでは mysql_real_escape_string を使用しないでください。
それは何の役にも立ちませんが、誤った安心感をあなたに残してしまいます。

関数名からわかるように、数値を追加するときに文字列をエスケープするために使用されます。したがって、この関数は役に立たなくなりますが、クエリはまだインジェクションに対して広く開かれています。

この関数は、SQL クエリで引用符で囲まれた文字列をフォーマットする場合にのみ使用する必要があります。
したがって、このルールから答えを結論付けることができます。いいえ、この関数を出力に使用しても意味がありません。

保護に関しては、数値を文字列として扱う (引用符で囲んでエスケープする) か、intval() 関数を使用してキャストします。

または、この手動の書式設定を取り除き、プレースホルダーを使用してクエリ内の動的データを表現することをお勧めします。必ずしも準備されたステートメントではありません - 同じエスケープを使用できますが、プレースホルダー処理関数にカプセル化されます

于 2012-12-12T21:57:39.663 に答える