-1

私は Webpages モデルで ASP.NET を使用しており、ユーザーが投稿するデータベースを作成しました。これはすべて素晴らしいことです。次に、ユーザーが自分の投稿を編集できるようにページを作成しましたが、ユーザーが自分の投稿のみを編集できるようにしたい.

これを行うために、次のことを試しました。

変数を作りました

var EmailMatch = WebSecurity.CurrentUserName;

したがって、@EmailMatch を html マークアップの任意の場所に配置すると、現在ログインしているユーザーのメール アドレスが表示されます。このユーザーが作成した投稿のみを表示するために、次の select ステートメントを使用しました。

var selectAllString = "SELECT * FROM SaleData WHERE Email = '@EmailMatch'";

理論的には、ユーザーが投稿すると、「電子メール」フィールドの下のデータベースに電子メールアドレスが送信され、現在ログインしているユーザーと等しいレコードが表示されるため、これは機能するはずだと考えています。ただし、このステートメントは 0 を返します。結果、考えられる限りのことを試しましたが成功しませんでした。これが最後の手段です。何が欠けているのか教えてください。前もって感謝します..

4

4 に答える 4

4

これを行う正しい方法は、パラメーター化されたクエリを使用することです。制御できない文字列をクエリに連結しないでください。

var EmailMatch = WebSecurity.CurrentUserName;
var selectAllString = "SELECT * FROM SaleData WHERE Email = @EmailMatch";
SqlCommand cmd = new SqlCommand(s);
cmd.Parameters.Add("@EmailMatch", EmailMatch);
var resultsTable = cmd.ExecuteReader();
于 2012-12-26T03:14:53.617 に答える
1
var selectAllString = "SELECT * FROM SaleData WHERE Email = '" + EmailMatch + "'";

注:これにより、SQLインジェクション攻撃にさらされる可能性があります。

于 2012-12-26T03:07:00.697 に答える
1

これを試して:

var selectAllString = "SELECT * FROM SaleData WHERE Email = '"+EmailMatch+"'";

または、SQL Injectonを回避するには、SQLステートメントは正しいですが、コードにこれを追加する必要があります。

using (OleDbConnection CON = new OleDbConnection("your connection string")) {
   OleDbCommand Com = CON.CreateCommand();
   Com.CommandText = "SELECT * FROM SaleData WHERE Email = @EmailMatch";
        Com.CommandType = CommandType.Text;
        Com.CommandTimeout = 0;
        Com.Connection.Open();
        Com.Parameters.AddWithValue("EmailMatch",EmailMatch);
   ...
   // continue your code from here... 
}
于 2012-12-26T03:07:12.133 に答える
1
cmd = new MySqlCommand("SELECT * FROM SaleData WHERE Email = @EmailMatch", MySqlConn.conn);
cmd.Parameters.AddWithValue("@EmailMatch", EmailMatch);
cmd.Prepare();
cmd.ExecuteReader();
于 2012-12-26T03:22:12.547 に答える