0

SQL実行可能ステートメントのユーザー入力を削除したいのですが、コードベースの方法では、mysqli_real_escape_string(connection、string)が必要とするDB接続を確立したくありません。

ストリングを消毒するためのエレガントな正規表現/交換用ワンライナーとは何ですか?

<?php
$naughty = array("\\", "{", "}", ")", "(", "[", "]", "\"", ";", ":", ">", "&");
$sanitized = str_replace($naughty, " ", $input_string);
?> 

---UPDATE----ソリューションの例。入力してくれてありがとう。

<?PHP 
      $testsql = "';\"\\ bork bork bork %A 0x33\n";
      echo $testsql;
     /* $translate = array("0x" => "[HEX]",  ";" => "[SEMICOLON]", "'" => "[QUOTE]", "%" => "[PERCENT]","\"" => "[DOUBLEQUOTE]",
      "\\" => "[BACKSLASH]" ); */
      $translate = array("0x" => " ",  ";" => " ", "'" => " ", "%" => " ","\"" => " ", "\\" => " ");
      echo "<br>";
      $testsql=strtr($testsql, $translate);
      echo $testsql;
?>
4

2 に答える 2

3

私はコメントに間違いなく同意し、準備されたステートメントを使用すること、そしてこれを自分で行わないことは、より賢く、多くの点で優れており、それらを使用できる場合は常に推奨されると答えています。現在はセキュリティ上の問題はないかもしれませんが、将来突然発生する可能性があります。そして、準備されたステートメントのリスクは、はるかに低くなります。回避策が見つかった場合は、それを実行してください。

ここで真剣に受け止められるためには、その免責事項を提示しなければならないような気がします。

なぜなら、すべてのエスケープを手動で行うことも間違いなく可能だと私は信じているからです。環境が管理されていることを考えると。これは、javascriptなどの他の形式のエスケープと同じです。時々これが必要です。私は、データベースが利用できない状態でSQLエクスポートスクリプトを作成する必要がありました。

これを正しく行うには、次のことを想定する必要があります。

  • 入力文字列はUTF-8です。これを検証しました。
  • 後でmysql文字列を実行すると、完全なsqlステートメントがUTF-8になり、接続も同様になります。
  • phpのmbstring関数のオーバーロードでクレイジーなことは起こっていません。
  • あなたは私のテストされていないコードを信用せず、私が言っていることを確認します;)

なぜUTF-8がそれほど重要なのですか?この記事を読む

これらの2つのポイントを前提として、mysql_real_escape_stringをエミュレートするには、次の文字をエスケープする必要があります。

NUL (ASCII 0), \n, \r, \, ', ", and Control-Z. 

ソース:php.net

これを行うには、これで十分です。

$translate = array(
  "\x00" => '\\0',
  "\n"   => '\\n',
  "\r"   => '\\r',
  "'"    => '\\\'',
  "\""   => '\\"',
  "\x1a" => '\\Z',
);

$output = "'" . strtr($input, $translate) . "'";

ご覧のとおり、出力が引用符で囲まれていることを確認しました。それがなければ、このエスケープ手法(またはmysqli::real_escape_string)は十分ではありません。

私が見た代替技術:

于 2012-11-14T22:02:18.747 に答える
2

接続がないとクエリデータを適切にエスケープできないため、文字セットの知識が必要です。

これを自分でやろうとしないでください。あなたの実装は安全ではないはずです。とにかく、データをクエリから分離するには、準備されたクエリを使用する必要があります。

于 2012-11-14T21:25:57.897 に答える