4

すべての整数を a で実行して(int)Integer、クエリ文字列で安全に使用できるようにします。

また、この関数コードを使用して文字列を実行します:-

if(!get_magic_quotes_gpc()) {
           $string = mysql_real_escape_string($string);
        }

$pattern = array("\\'", "\\\"", "\\\\", "\\0");
$replace = array("", "", "", "");
if(preg_match("/[\\\\'\"\\0]/", str_replace($pattern, $replace, $string))) $string = addslashes($string); 


$cleanedString = str_replace('%','',$string);

私は明らかに $cleanedString 変数を返します。% 文字は mySQL のワイルドカードであり、ユーザーが挿入するとクエリが遅くなる (または正しくないデータが返される) 可能性があるため、ここで % 文字を置き換えます。心配する必要がある mySQL のその他の特殊文字はありますか?

2 番目のメモとして、私の検索と置換の後に間違っていることや冗長なことはありmysql_real_escape_stringますか? 私が最初に始めたときにウェブサイトからそれを入手しました.(私の記憶が正しければ)エスケープ文字列に加えてこの検索/置換を使用する必要があると書かれていました. 以前にエスケープされたインジェクション文字を削除しようとしているように見えますか?

4

5 に答える 5

7

さて、私はいくつかのコメントがあります:

  • マジック クォート機能は非推奨です。PHP 環境でマジック クォートを有効にしないでください。そのため、マジック クォートを (不注意に) 有効にしている他の顧客の環境にデプロイされる可能性のあるコードを設計している場合を除き、チェックは不要です。

  • 文字のシーケンスを検索している場合、 の正規表現preg_match()は正しくありません。のような正規表現は、単一文字 x、y、または z のいずれ[xyz]に一致します。文字列 xy または yz と一致しません。とにかく、この方法で特殊文字を検索または置換する必要はまったくないと思うので、これは学術的です。

  • mysql_real_escape_string()SQL 文字列の引用符内に挿入する文字列リテラルをエスケープするのに十分です。他の引用符、バックスラッシュなどの文字列置換を行う必要はありません。

  • %およびは、式でパターン マッチングを使用する場合にのみ_、SQL のワイルドカードです。これらの文字は、等値または不等値の演算子または正規表現と比較するだけでは意味がありません。式を使用している場合でも、SQL インジェクションに対する防御のためにこれらの文字をエスケープする必要はありません。それらをリテラル文字 (バックスラッシュでエスケープする場合) として扱うか、式のワイルドカードとして扱う (この場合そのままにしておく) かは、あなた次第です。LIKELIKELIKE

  • 上記のすべては、リテラル文字列値の代わりに PHP 変数を SQL 式に補間する場合に適用されます。補間の代わりにバインドされたクエリ パラメータを使用する場合、エスケープはまったく必要ありません。バインドされたパラメーターは、プレーンな「mysql」API では使用できませんが、「mysqli」API でのみ使用できます。

  • もう 1 つのケースは、SQL テーブル名、列名、またはその他の SQL 構文の代わりに PHP 変数を補間する場合です。このような場合、バインドされたパラメーターは使用できません。バインドされたパラメーターは、文字列リテラルの代わりにのみ使用されます。列名を動的にする必要がある場合 (たとえばORDER BY、ユーザーの好みの列に)、列名を逆引用符 (MySQL の場合)、角括弧 (Microsoft)、または二重引用符 (その他の標準 SQL)で区切る必要があります。 .

したがって、コードは次のように簡単に削減できると思います。

$quotedString = mysql_real_escape_string($string);

これは、文字列を補間に使用する場合です。バインドされたパラメーター値として使用する場合は、さらに簡単です。

$paramString = $string;
于 2008-12-04T00:25:19.890 に答える
3

ええ、私は物事が少し奇妙に進んでいると思います。

まず、魔法の引用符をチェックし、オンになっている場合はスラッシュを削除します。そうすれば、必要な情報を実際に表す文字列が得られます (スラッシュで処理されたものではありません)。

特に % ワイルドカードを削除したい場合は、それをエスケープするか、完全に削除できます。文字列を SQL クエリに挿入する前に、最後に mysql_real_escape_string を実行すると、すべてうまくいきます。

$string = $_POST['searchTerm'];
if (get_magic_quotes_gpc()) {
    $string = stripslashes($string);
}
$string = str_replace("%", "", $string);
$safeString = mysql_real_escape_string($string);
于 2008-12-03T23:59:54.077 に答える
2

SQLインジェクションの問題が本当に心配な場合は、プリペアドステートメントの使用を強く検討する必要があります。SQLステートメントは、ユーザーデータが提供される前に評価されるため、コードははるかに安全です。

PDOおよびMysqliを参照してください

于 2008-12-04T01:01:44.840 に答える
2

mysql_real_escape_string() はこれらの文字をエスケープします:

\x00、\n、\r、\、'、"、\x1a

したがって、自分でそれらをエスケープする必要はありません。魔法の引用符がオンになっている場合はスラッシュを削除してから、mysql_real_escape_string() を使用することをお勧めします。

if(get_magic_quotes_gpc()) {
    $string = stripslashes($string);
}

$string = mysql_real_escape_string($string);

$cleanedString = str_replace('%','',$string);

また、MySQL のアンダースコアは単一文字のワイルドカードであるため、それについて何かしたい場合があります。

于 2008-12-04T00:01:49.207 に答える
-1

2 番目のポイント:
完全に冗長です。mysql_real_escape_string() を実行すると、すべての文字が適切にエスケープされます。

于 2008-12-03T23:58:12.677 に答える