2016-08-18 4 views
0

私は外部のWebサイトに送信されるユーザーフォームを持っており、そのWebサイトからの応答には固有のコード(「a87ju89y」など)が含まれています。そのコードは私にとって重要なので、準備されたステートメントを使用してデータベースに入力します。私は、PHPスクリプトにこのような新しいコードがあるかどうかを確認するために、データベースを照会分ごとに実行し、cronジョブ持っているバックエンドに2段目のSQLインジェクション

$con = mysqli_connect($servername, $username, $password, $database); 
if (mysqli_connect_errno()){ 
echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
} 
$results = mysqli_query($con, "SELECT user FROM stack ORDER BY ID"); 
$cronresults = mysqli_query($con, "SELECT run FROM kook ORDER BY ID"); 
$row = mysqli_fetch_assoc($results); 
$cron = mysqli_fetch_assoc($cronresults); 
$row2 = $row['user']; 
$cron2 = $cron['kook']; 

を私の質問は、それは私が準備されたステートメントを必要とするです単に情報を引き出して、ある種のSQLインジェクションを防ぐのですか?もし私がそれについてどうやって行くのですか?

+0

セカンドレベルの注入が発生した最初の結果を使用する場合の結果

  • は、SQLの終わりにLIMIT 1を追加します別のクエリ。あなたが 'select userdata from table'をしてから、' userid = userid = 'から削除しました。 $ row ['userdata'] '、' userdata'がidであると期待していますが、実際には '0または1 = 1'です。今すぐすべてのデータがなくなります。 https://en.wikipedia.org/wiki/SQL_injection#Second_order_SQL_injection – chris85

  • +0

    大丈夫です、ありがとう! – electricjelly

    +0

    ほとんどの場合、SQLに値を渡すときはいつでも、パラメータ化されたクエリを使用してください。 – chris85

    答えて

    3

    クエリにデータを渡していないため、ここで準備済みのステートメントは必要ありません。プリペアドステートメントは、クエリをクエリ自体(プレースホルダ付き)と処理されるデータに分割します。このようにして、データとクエリは混同することはありません。

    テーブル内のすべての行を選択すると、データは必要ありません。

    +0

    素晴らしい!本当の簡単な答え私はそれを感謝します! – electricjelly

    1

    プリペアドステートメントは、値をクエリに挿入する必要がある場合にのみ便利です。これは通常、検索する値を含むWHERE句がある場合です。あなたのケースでは、どちらのクエリにも動く部分がないので、準備された文があなたのためにできることはありません。サイドノートでは

    、あなたのスクリプトを改善するために、物事のカップルを行うことができます。

    • 効率のための1つに2つのクエリを組み合わせる:常にあなたがフェッチする前に、クエリが正常に実行されたことを確認
    • あなただけあなたが直接あなたのDBにすでにデータを使用する場合
    +0

    提案に感謝します!どのように約1と2を参照することができるすべてのドキュメントに行くのかわからない? – electricjelly

    +0

    @electricjelly 2つのテーブルの 'ID'フィールドは同じものを指していますか? – BeetleJuice

    +0

    いいえ、それらはどちらも自動番号フィールドです。 – electricjelly

    関連する問題