3

以下で使用している単純なコードについての洞察を期待していた、あらゆる種類の攻撃からコードを可能な限り安全にしたいと考えています。脆弱な場合に安全にする方法と、その理由についての指針は素晴らしいでしょう。プリペアド ステートメントを使用することが、攻撃から保護するためのベスト プラクティスであることを読みました。

<?php 

    try {
    $conn = new PDO('mysql:host=localhost;dbname=test', 'user', 'XXXXX');
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $stmt = $conn->prepare('INSERT INTO people (name, email) VALUES (:name, :email)');

    $stmt->execute(array(':name' => $_POST['name'], ':email' => $_POST['email']));

    #If one or more rows were returned...

    } catch(PDOException $e){
        echo'ERROR: ' . $e->getMessage();
    }
    echo "Added $_POST[name] with email $_POST[email] succsessfully";
    $conn = null;
    ?>
4

4 に答える 4

7

SQL インジェクションから安全に見えますが、エコーで XSS に問題があります。エコーする前に、常にユーザー入力をサニタイズ/エスケープするようにしてください。

echo "Added $_POST[name] with email $_POST[email] succsessfully";

なるべき

echo "Added" . htmlspecialchars($_POST['name']) . "with email" . htmlspecialchars($_POST['email']) . "succsessfully";
于 2012-10-31T03:03:22.033 に答える
5

準備済みステートメントのため、SQL インジェクションに対して安全です。ただし、これらの変数をブラウザーに表示すると、XSS の問題が発生する可能性があることに注意してください。最善の方法は、常にユーザー入力がクリーンであることを確認することです。通常、出力には htmlspecialchars で十分です。データベースに送信する前にユーザー入力をクリーンにすることをお勧めします。

于 2012-10-31T03:02:19.373 に答える
4

はい、SQL クエリでパラメーターを使用すると、SQL インジェクション攻撃の可能性が減少します。しかし、私は POST から受信したデータを消去し、それが存在するかどうかも確認します。

$name = isset($_POST['name']) ? htmlspecialchars($_POST['name']) : NULL;
$email = isset($_POST['email']) ? htmlspecialchars($_POST['email']) : NULL;
$stmt->execute(array(':name' => $name, ':email' => $email));

null を渡す場合、これらのデータベース フィールドは null 値を受け入れる必要があることに注意してください。

于 2012-10-31T03:05:12.333 に答える
1

また、習慣からbindParamを使用することも検討します.. 私の理解では、PDO は型チェックを行います (PARAM_STR にとっては重要ではありません)。これにより、他の攻撃ベクトルから救われる可能性があります。

(そして、Skatox、Ryan、および John のメンションをサニタイズする XSS を追加します。)

$name = isset($_POST['name']) ? htmlspecialchars($_POST['name']) : NULL;
$email = isset($_POST['email']) ? htmlspecialchars($_POST['email']) : NULL;
stmt = bindParam(':name',$name, PDO::PARAM_STR);
stmt = bindParam(':email',$email, PDO::PARAM_STR);
$stmt->execute();
于 2012-10-31T03:12:13.267 に答える