web-dev-qa-db-ja.com

フォーム送信データの改ざんや、アカウントの詳細の変更を防ぐにはどうすればよいですか?

これは従業員のみが利用できるものですが、とにかく改ざんを防ぎたいと思います。安全でないコードは好きではありません。これは恐ろしく安全ではありません。

リンクの例は次のとおりです。

_<a href="#' + j.id + '" onclick="LoadThis(\'Test.aspx?id=' + obj.id + '\', \'post\', null, null);">Edit User #' + j.id + '.</a>
_

JQueryを使用してこれをクライアント側に送信しました。

_$.ajax({
    url: "Test.aspx/RemoveUsernameByID",
    type: "POST",
    data: 1,
    beforeSend: function (before) { /* do stuff */ },
    success: function (success) { /* do stuff */ },
    error: function (error) { /* do stuff */ }
});
_

...そして、悪いことを避けるためにSqlCommand.Parameters.Add()を必ず使用してください:

_    [WebMethod]
    public static void RemoveUsernameByID(int derp)
    {
        string ConnectionString = "Data Source=herp;Initial Catalog=derp;Integrated Security=True";
        string QueryString = @"DELETE FROM [Herp] where [uid] = @derp";


        using (SqlConnection con = new SqlConnection(ConnectionString))
        using (SqlCommand cmd = new SqlCommand(QueryString, con)) 
        {
            con.Open();
            cmd.Parameters.Add("@derp", SqlDbType.Int).Value = derp;
            cmd.ExecuteNonQuery();
        }
    }
_

ご覧のとおり、これは陽気に悪いです。 _data: 1_のIDを改ざんし、任意の番号をWebサーバーに送信して、必要なユーザーをそのIDで削除できます。この種のコードを使用すると、自分自身を管理者にしたり、必要なユーザーを削除したり、できないはずの情報を収集したりできます。

ユーザーの姓名や一意のGUIDなど、追加の情報を要求して送信することを考えましたが、誰かがこの情報を盗聴するだけです-これはたった今実行したことです! -収集して、彼らがやりたいことを何でもできるようにします。

私は何をすべきか?

1
heh

これは、SQLインジェクションの脆弱性よりも ダイレクトオブジェクトリファレンス の脆弱性のようです。

これを保護する適切な方法は、サーバー側で要求されたアクションを実行する権限が現在のセッションにあることを確認することです。これがどのようにダウンするかの詳細は、アプリケーションに認証をどのように実装したかによって異なりますが、私が提供したリンクの防止セクションを読むことから始めるのが良いでしょう。

1
Abe Miessler