2

関数と配列を使用してデータをmysqlテーブルに投稿する簡単な関数を作成しました。配列は、フォーム上の$_POSTアイテムから作成されます。私が知りたいのは、私が見ていない潜在的なセキュリティホールはありますか?

関数は次のとおりです。

            public function add_sql_data($table,$array){
            $tot = count($array);
            $c=0;
            foreach($array as $k => $v){
                $fields = $fields.$k;
                $values = $values."'".$v."'";
                $c++;
                if($c < $tot){
                    $fields = $fields.","; 
                    $values = $values.","; 
                }
            }
            $sql = "INSERT INTO ".$table."(".$fields.") values(".$values.")";
            if (mysql_query($sql)){
                return "succesfull";
            }else{
                return "error";
            }
        }

SQLインジェクションを作成するために知っている少量のPHPを使用しようとしましたが、配列が実際に実行する有害な構文を停止していることがわかります。ありがとう!!

4

4 に答える 4

5

安全ではありません。$_POSTからMySQLにデータを直接挿入しないでください。SQLインジェクションについて読んでください。

于 2012-09-22T07:29:59.440 に答える
5

まったく安全ではありません

質問のSQLでは、サニタイズやエスケープはありません。次のような個々のフォーム入力で何が起こるかを考えてみましょう。

  • 「そして彼は「まさかホセ」と言った」
  • 「何とか」)」
  • '")、(テーブル制限1からフィールドを選択))-'

最初の例では、ある種の構文エラーが発生し、2番目の問題も発生します。

3つ目は、あなたが可能にしている種類の注射の氷山の一角にあるヒントにすぎません。ここでは、別のテーブルの値をこの挿入ステートメントに挿入しています。そのフィールドがエンドユーザーに表示されている場合、エンドユーザーはこのようなことを行ってデータベースを探索し、表示できないはずの情報にアクセスできます。ただグーグルSQLインジェクションとあなたは例の無限のリストを見つけるでしょう。

正しい方法

本当に、本当に、古いmysql_ *関数の代わりに、PDOとできればプリペアドステートメントを使用する必要があります。

あなたがしていることに似た、注射から安全なものの例は次のとおりです。

$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
$stmt = $dbh->prepare("INSERT INTO table (name, value) VALUES (?, ?)");
$stmt->bindParam(1, $name);
$stmt->bindParam(2, $value);

// insert one row
$name = 'one';
$value = 1;
$stmt->execute();

このように、何である$name$valueは関係ありません-それらは適切にエスケープされます。

于 2012-09-22T08:41:51.763 に答える
0

私は3つの問題を見ます:

  1. 古いmysql_*関数を使用しています。それらは非推奨であり、まもなくPHPから削除されます
  2. あなたはSQLインジェクションに広くオープンです
  3. クロスサイトスクリプティングに対して脆弱です

この方法でデータを挿入することにより(関数、すべてのデータを配列に含める)、パラメーターバインディングを使用することからほんの数ステップで、witchはSQLインジェクションの問題を解決します。クロスサイトスクリプティングを使用するには、検証メカニズムを使用する必要があります。

于 2012-09-22T08:18:02.883 に答える
0

このようにコードを試すことができます。

public function add_sql_data($table,$array){
        $tot = count($array);
        $c=0;
        foreach($array as $k => $v){
            $fields = $fields.$k;
            $values = $values."'".$v."'";
            $c++;
            if($c < $tot){
                $fields = $fields.","; 
                $values = $values.","; 
            }
        }
    /* To protect MySQL injection you can do like this */
    $values= stripslashes($values);
    $values = mysql_real_escape_string($values);

        $sql = "INSERT INTO ".$table."(".$fields.") values(".$values.")";
        if (mysql_query($sql)){
            return "succesfull";
        }else{
            return "error";
        }
    }
于 2012-09-22T07:43:01.307 に答える