0

2つの質問があります

  1. 次のコードはSQLインジェクションに対して練習するための良い方法です(挿入メソッドとしては問題なく機能するようです)

  2. 完全な例でこのエラーメッセージをどのように配置しますか?

    if (!mysqli_query($query,$link))
    {
        die('Error: ' . mysqli_error());
    }
    

これが完全な例です:

<?php

$link = mysqli_connect("localhost","root","", "runtracker");
if (!$link)
{
    die('Could not connect: ' . mysqli_error());
}

$query="INSERT INTO userinfo (UserName) VALUES (?)";

if ($stmt = mysqli_prepare($link, $query)) {

    // Lets create the variables
    $name = $_POST['UserName'];

    // Bind the variables and execute the query
    mysqli_stmt_bind_param($stmt,"s", $name);
    mysqli_stmt_execute($stmt);

    // And now we close the statement
    mysqli_stmt_close($stmt);
}

echo "1 record added";

mysqli_close($link);
?>
4

1 に答える 1

1

はい、バインドされたパラメータを使用することは、SQLクエリの動的な値に対してSQLインジェクションから保護するための良い方法です。SQLインジェクションの詳細については、私のプレゼンテーション「SQLインジェクションの神話と誤謬」をお勧めします。

API関数を呼び出した後にエラーをチェックするのは良いことです。ほとんどのmysqli関数はエラー時にFALSEを返しますが、接続の処理は少し異なります。

また、Mysqliエラーを読み取り可能なログに出力するのが好きですが、ユーザーのブラウザーには出力しません。

これが私がそれをコーディングする方法です:

<?php

$mysqli = new mysqli("localhost","root","", "runtracker");
if (mysqli_connect_error())
{
    error_log("Connect error in file ".__FILE__.", line ".__LINE__.": "
      .mysqli_connect_error());
    die("Could not connect to database");
}

if (($stmt = $mysqli->prepare($link, $query)) === false) {
  error_log("Error on prepare in file ".__FILE__.", line ".__LINE__.": "
    .$mysqli->error);
  die('Error on prepare');
}

// Lets create the variables
$name = $_POST['UserName'];

// Bind the variables and execute the query
if ($stmt->bind_param("s", $name) === false) {
  error_log("Error on bind in file ".__FILE__.", line ".__LINE__.": "
    .$stmt->error);
  die('Error on bind');
}
if ($stmt->execute() === false) {
  error_log("Error on execute in file ".__FILE__.", line ".__LINE__.": "
    .$stmt->error);
  die('Error on execute');
}

// And now we close the statement
$stmt->close();

echo "1 record added";

$mysqli->close();
于 2012-12-09T19:37:26.260 に答える