8

SQL インジェクションを回避するには多くの方法がありますPHP で SQL インジェクションを防ぐ方法は? .

問題は、どのようにして sql-inject を実行できるかということremoveBadCharactersです。

function removeBadCharacters($s)
{
   return str_replace(array('&','<','>','/','\\','"',"'",'?','+'), '', $s);
}

危険な文字を捨てようとします (アプリケーションはそれらの文字を必要としません) :

$x = removeBadCharacters($_POST['data']);

mysql_query("insert into table (x) values ('".$x."');");

// or

mysql_query("select * from into where name = '".$x."';"); 
4

4 に答える 4

9

文字列リテラルのコンテキストから任意の SQL を挿入できるようにするには、その文字列リテラルを残す必要があります。これは、文字列の終了区切り文字 (この場合は単一の ) を導入する'か、文字列リテラルを先行する に展開することによってのみ可能です'。たとえば、エスケープ文字 を使用します\

$a = '\\';
$b = ' OR 1=1 OR ';
$c = ' --';

$query = "SELECT * FROM t1 WHERE a='$a' AND b='$b' AND c='$c'";
// result:
// SELECT * FROM t1 WHERE a='\' AND b=' OR 1=1 OR ' AND c=' --'
//                          \_________/           \_______/

関数が and を削除する'\、文字列リテラルをそのままにしたり拡張したりすることが不可能になり、任意の SQL を挿入することができなくなります。

ただし、関数は実際の文字エンコーディングを考慮していないため、MySQL の文字エンコーディングが GBK の場合、これを悪用することができますaddslashesmysql_real_escape_string

$a = "\xbf";
$b = " OR 1=1 OR ";
$c = " --";

$query = "SELECT * FROM t1 WHERE a='$a' AND b='$b' AND c='$c'";
// result:
// SELECT * FROM t1 WHERE a='縗 AND b=' OR 1=1 OR ' AND c=' --'
//                          \_________/           \_______/

したがって、安全にプレイするには、SQL インジェクションを防ぐために、または他の実績のある方法を使用mysql_real_escape_stringしてください。

于 2013-06-01T14:36:53.227 に答える
5

文字を削除するという考え自体が完全に間違っています。

それが本質的にあなたのアプローチが間違っていることです。

SQL リテラルを台無しにするのではなく、適切にフォーマットする必要があります。

このサイトがそのような「保護」を使用していると想像してみてください。質問を投稿できなかったでしょう!

あなたの質問に文字通り答えるために-はい、状況によっては注入が非常に簡単です. オールインワンのサニタイズという考えそのものが壊れているからです。PHP には、かつて「マジック クォート」と呼ばれる同様の機能がありました。大変なレッスンでしたが、今では言語から取り除かれています。私があなたに言ったまさにその理由のために:

  • 「データ」を「安全」にするわけではありません
  • 代わりにデータを台無しにします

すべての SQL リテラルは、その役割に応じて個別に扱う必要があります。

于 2013-06-01T13:16:29.077 に答える
2

あなたの関数は異なるエンコーディングを扱いません。

自分で衛生方法を考え出そうとせず、すでに作られたものを使用してください。の場合はmysql_*になりますがmysql_real_escape_string、もう使用しないでくださいmysql_*。代わりに PDO または mysqli を使用してください。

参照: PHP で SQL インジェクションを防ぐにはどうすればよいですか? 詳細については。

于 2013-06-01T13:13:07.770 に答える
2

はい、これは Unicode 文字を使用して文字セットを操作することで無効にすることができます。

詳細については、 https://security.stackexchange.com/questions/11391/how-did-anonymous-use-utf-16-ascii-to-fool-php-escapingを参照してください。

于 2013-06-01T13:13:08.870 に答える