0

これらのデータがデータベースの状態を変更しない場合、$_GET からのデータもサニタイズする必要があります。

データベースの状態を変更する例は INSERT であり、DELETE
の状態を変更しない例は SELECT です。

サニタイズしないことについて私が考える問題はこれです

内部コード

$word = $_GET['word'];
$query = "SELECT * FROM tbl_example WHERE name LIKE '%$word%'"; 
mysqli_query($query);


次に、検索するデータは

testword%';DROP TABLE tbl_example; -- 


したがって、 $query の最終値は

SELECT * FROM tbl_example WHERE name LIKE '%testword%';DROP TABLE tbl_example; -- %'

しかし、mysqli_query と mysql_query() は単一の SQL ステートメントしか実行できないため、これは機能しないと思います。

また、$_GET をサニタイズすると、データベース内に 'then you search' があり、検索は DB 内のものと一致しますか?

SQL インジェクションの例も教えてもらえますか?

4

3 に答える 3

2

テーブルに 100 万行あり、上記の例のように $_GET をサニタイズしないと、誰かがあなたの検索を悪用して 100 万行すべてを返すと、サーバーはそれらすべてを表示しようとし、ダウンします。それはほんの一例です。

$_GET["word"]="test%' or name LIKE '";
$word = $_GET['word'];
$query = "SELECT * FROM tbl_example WHERE name LIKE '%$word%'"; 

クエリ

SELECT * FROM tbl_example WHERE name LIKE '%test%' or name LIKE '%'
于 2012-12-28T08:16:16.903 に答える
1

データをサニタイズしない言い訳を見つけようとしているようです。「半マイルしか運転しないのなら、シートベルトを着用する必要はありませんよね?」と言っているようなものです。一貫してベスト プラクティスを使用することを躊躇するのはなぜですか?

さらに、わざわざデータをサニタイズしないでください。代わりに、他の回答で指示されているように、パラメーター化されたクエリを使用してください。

他の人は、SELECT でさえ悪意のある入力の影響を受けやすいという例を示しましたが、それらの理由を回避したいと考えているようです。それと戦わないでください。良い習慣を身につけ、正しく行いましょう。

于 2012-12-28T08:37:52.560 に答える
1

使用する必要があるのは、 $_GET からのデータをサニタイズする代わりに、準備されたクエリです

あなたはmysqlのようにmysqliを使用しており、GETをエスケープしていません...準備されたクエリを使用する必要があります

あなたはのように使う必要があります

/* create a prepared statement */
if ($stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?")) {

    /* bind parameters for markers */
    $stmt->bind_param("s", $city);

    /* execute query */
    $stmt->execute();

    /* bind result variables */
    $stmt->bind_result($district);

    /* fetch value */
    $stmt->fetch();

    printf("%s is in district %s\n", $city, $district);

    /* close statement */
    $stmt->close();
}

PHPマニュアルより

よく読んだ

GET by PHP でユーザーのデータをサニタイズする

于 2012-12-28T08:15:32.520 に答える