-5

私は完全なPHP初心者であり、MySQLインジェクションとスクリプトの保護について読んでいる間、これまでに持っているものをここに投稿すると思いました。

以下は私の現在の(機能しているが悪い習慣)コードです。誰かが私の弱点を提供できますか、そして私が修正するために何ができますか?

<?php
require_once 'login.php'; //database information

$db_server = mysql_connect($db_hostname, $db_username, $db_password)
    or die("Unable to connect to MySQL: " . mysql_error());

mysql_select_db($db_database)
  or die("Unable to select database: " . mysql_error());

$email = $_POST['email'];

$sql="INSERT INTO users (email)
VALUES ('$email')";

$result = mysql_query($sql);

if($result){
header('Location: ../thankyou.php');
}
else {
echo "ERROR";
}

mysql_close();
?> 
4

1 に答える 1

0

あなたは自分の言葉で言えば初心者なので、良い習慣を身につけるのに今ほど良い時はありません :)

$email = $_POST['email'];
$sql="INSERT INTO users (email) VALUES ('$email')";

はSQL インジェクションの脆弱性の教科書的な例であり、このコードは遅かれ早かれあなたを苦しめるでしょう。その理由は、受け取った変数を信頼し、それを SQL エンジンに渡すためです。誰かが入ったらどうなるか想像してみてください

'); drop table users; --

メールアドレスとして...

入力をクリーンアップするためにあらゆる種類の洗練されたスキームを考案する代わりに、コードをインジェクション攻撃から保護する鉄壁の手法が 1 つあります。それは、プリペアド ステートメントです。php が提供する非推奨の mysql_ 呼び出しの開発を開始すべきではないため、PDO または mysqli_ に切り替える必要があります。準備済みステートメントをサポートする PDO をお勧めします。準備済みステートメントの詳細については、こちらを参照してください。PDO と準備済みステートメントを使用すると、サンプルは次のようになります。

$stmt = $dbh->prepare("INSERT INTO users (email) VALUES (:email)");
$stmt->bindParam(':email', $email);
$stmt->execute();

MySQL 以外のデータベース システムですぐに使用でき、インジェクション攻撃の影響を受けない、将来性のあるコードが得られます。

于 2013-03-05T01:07:28.200 に答える