1

1行のフォームを使用してデータベースに投稿し、後でその$comment変数をページにエコーする非常に基本的なサイトを開始しています。私は PDO を知りませんが、この単純なことに本当に必要かどうかを知りたいと思っています。

else
mysql_query("INSERT INTO posts (postid, post_content)
VALUES ('', '$comment <br />')");
}
mysql_close($con);

このコードの上に、投稿したくないもののいくつかをブロックするための基本的な strpos コマンドがあります。

私がこれをどのように行っているかによって、注射で問題が発生することはありますか?

4

5 に答える 5

3

はい、これは危険です。誰かがしなければならないことは、一重引用符を置き、その後に必要な SQL コードを配置することだけです。古い方法で修正する場合、または PDO プリペアード ステートメントを新しい方法として使用する場合は、このステートメントの前に$comment = mysql_real_escape_string ($comment) を使用します。ドキュメントの基本的な例を次に示します。

<?php
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam(':name', $name);
$stmt->bindParam(':value', $value);

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

// insert another row with different values
$name = 'two';
$value = 2;
$stmt->execute();
?>
于 2012-06-28T05:35:34.893 に答える
3

いいえ、安全ではありません。mysql_real_escape_stringを使用してエスケープする必要があります$comment

しかし、PDO は難しくなく、コードをより強力にします。

// create the connection. something like mysql_connect/mysql_error
try {
    $dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}

// create the prepared statement.
$stmt = $dbh->prepare("INSERT INTO posts (postid, post_content) VALUES (?, ?)");
// execute it with parameters.
$stmt->execute(array('', $comment.'<br>'));
于 2012-06-28T05:43:37.930 に答える
0

フォーム入力データを mysql クエリにバインドすることは、SQL インジェクションに対する完璧なソリューションです。この目的には binaParam メソッドを使用します。

于 2012-06-28T06:24:24.323 に答える
0

これは、$comment がユーザーからの入力であるため、SQL インジェクションの影響を受けやすく、SQL コマンドを入力することもでき、PHP コードも同じように実行されます。

$comment 値が'TRUNCATE TABLE USERS;'USERS テーブルに設定されていることを考慮してください。これは、アプリにとって重要な可能性があるものであれば何でもかまいません。

PHPでは、を使用してSQLインジェクションから保護すると信じていますmysql_real_escape_string()。それを読んでください。

SQL インジェクションの詳細については、このドキュメントを参照してください: https://docs.google.com/document/d/1rO_LCBKJY0puvRhPhAfTD2iNVPfR4e9KiKDpDE2enMI/edit?pli=1

于 2012-06-28T05:38:40.800 に答える
0

いいえ、ここに投稿したコードだけから判断すると、SQL インジェクションから保護されていません。の簡単な例を次に示し$commentます。

'), (null, (select concat(user(),':',password) s from mysql.user where concat(user,'@',host)=user() LIMIT 1) --

これにより、現在のユーザーのログイン資格情報を含む別の行が追加されます。また、LOAD_FILEファイル システムからファイルを読み取ることもできます。また、ファイル システムに任意のファイルを書き込むこともできます。

' + (select '<?php echo "Hello, World!";' into dumpfile '/path/to/your/document_root/foobar.php')) --

この手法を使用すると、攻撃者は任意のファイルをサーバーにアップロードできます。たとえば、システム上で任意のコマンドを実行する Web シェルなどです。

そのため、SQL インジェクションから身を守る必要があります。SQL インジェクションでは、準備済みステートメントまたはパラメーター化されたステートメントを使用した自動エスケープが、 などの関数を使用した手動エスケープよりも優先されますmysql_real_escape_string

于 2012-06-28T18:17:56.193 に答える