たとえば、重要なコントロールを持つ gridview 列があるとします。
通常のユーザーには見えないようにし、管理者ユーザーには見えるようにすると安全ですか?
If (Requst.Servervariables.Get("LOGON_USER").Split('\\')[1] == "MyAdminUser")
{
gridview1.columns[0].visible = true;
}
たとえば、重要なコントロールを持つ gridview 列があるとします。
通常のユーザーには見えないようにし、管理者ユーザーには見えるようにすると安全ですか?
If (Requst.Servervariables.Get("LOGON_USER").Split('\\')[1] == "MyAdminUser")
{
gridview1.columns[0].visible = true;
}
可視性が false に設定されている場合でも、コントロールは Viewstate に格納されます。ビューステートは暗号化されておらず、Base-64 でエンコードされているだけです。理論的には、viewstate を解析して値を抽出することは可能であるため、100% 安全というわけではありませんが、ほとんどの人にとって、この脆弱性を悪用して値を抽出することは困難です。
些細なことであれば、おそらくこれで問題ありませんが、非常に機密性の高いデータを保護している場合は、データを非表示にする別の方法を見つけるか、クライアントにまったく送信しないようにします. コントロールの場合、可視性を false に設定するのではなく、管理者ユーザーのコード ビハインドに動的に追加することができます。
そしてもちろん、多層防御を実践してください。
単純にコントロールを隠すことは「あいまいさによるセキュリティ」として知られていますが、これはあまりセキュリティではありません。これはセキュリティの有効な追加レイヤーですが、絶対に信頼すべきではありません (たとえば、URL がわからない場合はアクセスできないと仮定して、機密情報へのリンクを非表示にします)。リンクを非表示にするために使用する場合でも、リンクが「非表示」でない場合と同様に、それらのページを十分に保護する必要があります。攻撃者がそのような「隠された」リンクを見つける方法はたくさんあります。
@Davidの回答に加えて。RowBoundDataイベントでこの列のフォーマットを行うことができます。
管理者以外のユーザーの場合は、テキストをこのコントロールに設定しないでください。
protected void grd_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
Label SecuredColumn = (Label)e.Row.FindControl("SecuredColumn");
if (Request.ServerVariables.Get("LOGON_USER").Split('\\')[1] == "MyAdminUser")
{
SecuredColumn.Text = ((YourClass)e.Row.DataItem).YourPropertyName;
SecuredColumn.Visible = true;
}
else
{
SecuredColumn.Visible = false;
}
}
}