2

MySQLインジェクションの試行を停止するphp関数を作成しようとしています。私が行っているのは、str_replace()を使用して記号を削除し、それらをHTML文字コードに置き換えることです。私の問題は、すべてのコードに&#;が含まれていることです。しかし、それらの記号をそれらのコードに置き換えたいとも思います。コードを次のようなものに変更せずにこれを行うにはどうすればよいですか?

&#38&#59;&338&#59;#35&#59;32&#59;

これが私の関数です:

function replaceSymbols( $text )
{
   $text = str_replace( '#', '&#35', $text );
   $text = str_replace( '&', '&' $text ); 
   $text = str_replace( ';', '&#59', $text );

   $text = str_replace( ' ', ' ' $text );
   $text = str_replace( '!', '!' $text );
   $text = str_replace( '"', '"' $text );   
   $text = str_replace( '$', '$' $text );
   $text = str_replace( '%', '%' $text );  
   $text = str_replace(  "'" '&#39', $text );
   $text = str_replace( '(', '(' $text );
   $text = str_replace( ')', ')' $text );
   $text = str_replace( '*', '*' $text );   
   $text = str_replace( '+', '&#43', $text );
   $text = str_replace( ',', ',' $text );
   $text = str_replace( '-', '-' $text );
   $text = str_replace( '.', '.' $text );   
   $text = str_replace( '/', '&#47', $text );
   $text = str_replace( ':', ':' $text );   
   $text = str_replace( '<', '&#60;' $text );
   $text = str_replace( '=', '&#61;' $text );
   $text = str_replace( '>', '&#62;' $text );   
   $text = str_replace( '?', '&#63', $text );
   $text = str_replace( '[', '&#91', $text );
   $text = str_replace( '\\', '&#92;' $text );
   $text = str_replace( ']', '&#93;' $text );
   $text = str_replace( '^', '&#94;' $text );   
   $text = str_replace( '_', '&#95', $text );
   $text = str_replace( '`', '&#96', $text );
   $text = str_replace( '{', '&#123;' $text );
   $text = str_replace( '|', '&#124;' $text );   
   $text = str_replace( '}', '&#125', $text );
   $text = str_replace( '~', '&#126', $text );

   return $text;

}
4

6 に答える 6

12

見たことがありmysql_real_escape_stringますか?

mysql_query()に安全に配置できるように、接続の現在の文字セットを考慮して、エスケープされていない文字列内の特殊文字をエスケープします。

于 2009-06-15T03:10:19.380 に答える
3

mysql_real_escape_string($ text)がニーズを満たさない理由はありますか?

于 2009-06-15T03:10:21.907 に答える
2

他の人は、mysql_real_escape_string()どれが非常にうまく機能するかについて言及しました。本当にエンティティに変換したい場合は、をご覧くださいhtmlentities()。それでも必要なすべての文字が変換されない場合は、次のstrtr()ように使用することもできます。

$entities = array(
    '#' => '&#35;',
    '&' => '&#38;',
    ....
);

$converted = strtr($input, $trans);
于 2009-06-15T03:23:26.943 に答える
1

そのような根本的な問題を解決しようとしないでください - それらはすでに解決されています。基本を学びたいが、本番環境でソリューションを使用しない場合を除きます。クエリのエスケープの問題mysql_real_escape_string、パラメーター化されたクエリを使用するか使用することで解決され、機能します。自家製のソリューションには、しばしば微妙なバグや特殊性があり、役に立たなくなります。私は今記事を見つけることができませんが、コーディングホラーのジェフアトウッド(またはそれはジョエルでしたか?) は、自分のstrip_tags関数を実行しようとした友人について書いていました...そして失敗しました. 最近、暗号化についても同じです。自作はほとんどの場合失敗します。

あなたの方法:
... は、従来の文字列エスケープが完全に元に戻せるため、現在のタスクにはあまり適していませんが、メソッドは一方向関数です (ハッシュと無関係ではありません ^^)。

于 2009-06-15T10:02:07.930 に答える
0

なぜプレースホルダを使用しないのですか? 何かを忘れてしまったり、突然他の形式 (HTML 文字エンティティが機能しなくなった場合) で出力したくなったりしたために、どのようなエスケープ方式も機能しません。

ドライバーに依存し、安全性を超えて、より高速なネットワーク転送 (文字列の代わりにネイティブの int、float などとして転送される数値) や解析、準備されたステートメントを使用することによるネットワーク速度の向上など、プレースホルダーから追加の追加の利点が得られる場合もあります。

更新どうやら mysql_インターフェイスはプレースホルダーをサポートしていません。これは基本的に、どのような展開にも安全ではない、または適していないことを意味します。別のドライバーを探してください。

于 2009-06-15T03:37:25.630 に答える
0

など、他の人が投稿した定型ソリューションに従うことを強くお勧めしますmysql_real_escape_string()。とはいえ、あなたの機能には重要な点で欠陥があります。何かを保護する場合、デフォルトのポリシーはデフォルトで拒否する必要があります。つまり、特定の入力または要求が攻撃であると想定し、入力を調べて、何かが明らかに攻撃ではないと判断できる場合は、それを許可します。関数のコンテキストでは、入力が既知の許容可能な文字のセットに含まれているかどうかを確認し、それ以外はすべてエスケープすることを意味します。疑似コード:

function replaceSymbols(text):
    result = ""
    for each character c in text:
       if isalpha(c) or isdigit(c):
           append c to result
       else
           append escape(c) to result
    return result
于 2009-06-15T18:38:53.687 に答える