0

重複の可能性:
SQLインジェクションを防ぐための最良の方法は?

SQLインジェクションに対してphpをサニタイズする方法を理解するのに苦労しています。コードを安全にするために、ここで何を変更する必要があるかを誰かが親切に説明してくれることを願っています。

<?php
$dbConnection = mysqli_connect('****', '****', '****', 'db');

$query = "INSERT INTO `table` (`1`, `2`, `3`) VALUES ('$_POST[1]', '$_POST[2]', '$_POST[3]')";

if (mysqli_query($dbConnection, $query)) {
echo "Successfully inserted " . mysqli_affected_rows($dbConnection) . " row";
} else {
echo "Error occurred: " . mysqli_error($dbConnection);
}
?>
4

4 に答える 4

2

MySQLiは、手動でエスケープするよりも優れたプリペアドステートメントをサポートしています。

手続き型MySQLiを使用しているので、次に例を示します。

/* create a prepared statement */
if ($stmt = mysqli_prepare($dbConnection, "INSERT INTO `table` (`1`, `2`, `3`) VALUES (?, ?, ?)"))
{

    /* bind parameters for markers */
    mysqli_stmt_bind_param($stmt, "sss", $_POST[1], $_POST[2], $_POST[3]);

    /* execute query */
    if(mysqli_stmt_execute($stmt))
    {
        echo "Successfully inserted " . mysqli_affected_rows($dbConnection) . " row";
    }
    else
    {
        echo "Error occurred: " . mysqli_error($dbConnection);
    }

    /* close statement */
    mysqli_stmt_close($stmt);
}
于 2012-11-29T11:24:48.313 に答える
1

SQLインジェクションを防ぐために、プリペアドステートメントを使用できます。mysqli_そのためには、さらにいくつかの関数が必要になります。

これらを使用すると、次のようなものを書くことができます。

$dbConnection = mysqli_connect('****', '****', '****', 'db');

// prepare the query
$query = mysqli_prepare( $dbConnection, "INSERT INTO `table` (`1`, `2`, `3`) VALUES (?, ?, ?)";

// bind parameters; 2nd parameter is for data-types
mysqli_stmt_bind_param( $query, "sss", $_POST[1], $_POST[2], $_POST[3] );

// execute query
if ( mysqli_stmt_execute($query) ) {
  echo "Successfully inserted " . mysqli_affected_rows($dbConnection) . " row";
} else {
  echo "Error occurred: " . mysqli_error($dbConnection);
}
于 2012-11-29T11:24:15.197 に答える
0

古いmysql_*関数を引き続き使用する場合は、http: //php.net/manual/en/function.mysql-real-escape-string.phpを参照してください。

$datapoint1 = mysql_real_escape_string($_POST[1]);
...
$query = "INSERT INTO `table` (`1`, `2`, `3`) VALUES ('$datapoint1', '$datapoint2', '$datapoint3')";
于 2012-11-29T11:22:19.170 に答える
0

プリペアドステートメントまたはmysqli_real_escape_stringを使用できます

于 2012-11-29T11:22:34.620 に答える