Web Security C # Grammatik lernen

Damit andere erkennen können, dass der Code ein Sicherheitsproblem aufweist, müssen Sie die Entwicklungssprache genau kennen. Sie waren noch nie zuvor mit C # vertraut und fassen jetzt die Sicherheitswissenspunkte in der C # -Sprache über die statische Analyseplattform für den Quellcode zusammen:

SQL-Injection

string sql = String.Format("UPDATE TBND_IE SET B_E={0} WHERE BEG_DATE='{1}' AND I_E='{2}' AND A_E='{3}' AND M_E='{4}'", Volume, Date, Id.I_E, Id.A_E, Id.M_E);
...
...
using (DbCommand dbCommand = DBFactory.MD.GetSqlStringCommand(sql))  //sink点

String.Format ist das Textäquivalent zum Ersetzen jedes Formatelements in den angegebenen Daten vom Typ String durch den Wert des entsprechenden Objekts. Wenn der Wert des obigen Datums und anderer Objekte aus einer nicht vertrauenswürdigen Datenquelle stammt, befindet sich in der SQL-Zeichenfolge Es können Verschmutzungsdatenquellen eingeführt werden, und SQL-Injection kann verursacht werden, wenn später Datenbankoperationen ausgeführt werden.

Die GetStoredProcCommand-Methode wird für Befehle für gespeicherte Prozeduren verwendet. Die
GetSqlStringCommand-Methode wird für SQL-Textbefehle verwendet. Beide Methoden geben ein DbCommand-Objekt zurück

DbCommand-Objekt für SQL-Anweisungen

Verwenden Sie die GetSqlStringCommand-Methode, um ein DbCommand-Objekt für Inline-SQL-Anweisungen zu erstellen. Der spezifische SQL-Befehl wird beim Aufruf der Methode als Parameter übergeben. Der folgende Code zeigt, wie GetSqlStringCommand verwendet wird:

Database db = DatabaseFactory.CreateDatabase();
string sqlCommand = "Select ID, LastName, FirstName From Cs";
DbCommand dbCommand = db.GetSqlStringCommand(sqlCommand);

DbCommand-Objekte für gespeicherte Prozeduren
Um gespeicherte Prozeduren auszuführen, müssen Sie die GetStoredProcCommand-Methode verwenden, um ein DbCommand-Objekt zu erstellen. Der Name der auszuführenden gespeicherten Prozedur wird beim Aufruf der Methode als Parameter übergeben. Der folgende Code zeigt, wie GetStoredProcCommand verwendet wird:

Database db = DatabaseFactory.CreateDatabase();
DbCommand dbCommand = db.GetStoredProcCommand("GetProductsByCategory");**

XML-Injektion externer Entitäten

var path = HttpContext.Current.Server.MapPath("~/Configuration/Ak.xml");
...
System.Xml.XmlDocument document = new System.Xml.XmlDocument();
document.Load(path);   //sink

Der beste Weg, um XXE-Angriffe zu verhindern, besteht darin, die Auflösung von XML-Entitäten zu deaktivieren. Setzen Sie daher am besten die XmlResolver-Eigenschaft des Dokuments auf null, um die Auflösung von XML-Entitäten zu deaktivieren. Wie zum Beispiel:

document.XmlResolver = null;

Wenn Sie mit externen Entitäten in Ihrer Anwendung arbeiten müssen, sollten Sie einen benutzerdefinierten XmlResolver mit den folgenden Funktionen erstellen: - Legen Sie das
Zeitlimit für Anforderungen fest, um Angriffe mit unendlicher Verzögerung zu verhindern. -
Begrenzen Sie die Datenmenge, die abgerufen werden soll. -
Begrenzen Sie den XmlResolver, um Ressourcen auf dem lokalen Host abzurufen

Eine andere: [Jede Klasse, die XmlDocument erbt, überlädt und erweitert, wird als Senkenpunkt betrachtet]

Lagertyp XXS

public partial class IBCashTransferSearch : xQuant.Web.UI.Base.PageBaseEx
{
    protected void gvTrade_RowDataBound(object sender, GridViewRowEventArgs e){
        HyperLink btnView = e.Row.FindControl("btnView") as HyperLink;
        string sD = DataBinder.Eval(e.Row.DataItem, "SD").ToString(); //source点
        string strMsg = string.Empty;
        OTCManager mgr = new OTCManager();
        XPOTCTrade trade = mgr.GetId(int.Parse(sD));
        switch (strType)
           {
            case TradeType.CashTransferSealIn:
                 btnView.NavigateUrl = string.Format("../Trade/Special/frmClear CashTransferDown.aspx?FromUrl=AccountSearch&TradeID={0}", sD);   //sink点
             ...
           }
    }
}

Die DataBinder.Eval-Methode (Object, String) berechnet den Datenbindungsausdruck zur Laufzeit (gibt den Wert des Objekts zurück).

GridViewCommandEventArgs stammt von webcontrol, daher wird e.Row.DataItem als nicht vertrauenswürdige Daten betrachtet

Der Grund, warum btnView.NavigateUrl als Senkenpunkt angesehen wird, besteht darin, dass über das Steuerelement "HyperLink" ein Link auf einer Webseite erstellt werden kann, über den der Benutzer zwischen verschiedenen Webseiten in der Anwendung wechseln kann. Das Steuerelement "HyperLink" kann anklickbaren Text oder Bilder anzeigen. Im Gegensatz zu den meisten ASP.NET-Steuerelementen löst ein Benutzer, der auf das Steuerelement "HyperLink" klickt, kein Ereignis im Servercode aus. Dieses Steuerelement spielt nur eine Rolle bei der Navigation.

Reflektierendes XSS

      string strInst = Request["iD"].ToString();//source点
      ClientScript.RegisterStartupScript(this.GetType(), "para", "<script>iD=" + strInst.Trim() + "</script>"); //sink点

ClientScript.RegisterStartupScript (this.GetType (), *), führen Sie das JS-Skript für die Front-End-Seite aus. This.GetType () verweist auf die aktuelle Seite.

134     namespace xQuant.Web.WebSite.UI.Limit.Report
145     {
156         public partial class VaRDetailRpt : System.Web.UI.Page
167         {
168             public string P_ID
179             {
280                 get
251                 {
252                     return this.hdP_ID.Value;
243                 }
254                 set
265                 {
276                     this.hdP_ID.Value = value;   //sink点
287                 }
278             }

System.Web.UI.Page, die Page-Klasse, repräsentiert die ASPX-Datei (auch als Webformularseite bezeichnet), die vom Hostserver der ASP.NET-Webanwendung angefordert wird.
this.hdP_ID.Value = value; Ähnlich wie beim Zuweisen von Werten zu Seitensteuerelementen.

public partial class AcctSubjectBalanceView : xQuant.Web.UI.Base.LogonPageBase
{
    protected void ge_Rd(object sender, GridViewRowEventArgs e){
         e.Row.Cells[0].Text = "<a href=\"#\" οnclick=\"openwindow('" + string.Format(url, DataBinder.Eval(e.Row.DataItem, "fefe"), txtDate.Text.Trim(), InstID, "1") + "','grg',800,580)\" style=\"color:blue;\">what </a>&nbsp;" +
         ...

e.Row.Cells [0] .Text: Der von einem Steuerelement anzuzeigende Inhalt. Wenn hier nicht vertrauenswürdige Daten übergeben werden, kann reflektierendes XSS auftreten.

236     string currentClearingDate = TTRD_DAYEND_FLOW.GetCurrentDate();
        ....
335         ReStart(txtDate.Text);   //source点

txtDate.Text, um den Wert in einem Steuerelement zu erhalten, kann dieser Wert aus nicht vertrauenswürdigen Daten stammen.

Cross-Site-Scripting: schwache Überprüfung

this.gvTaskParamList.Rows[StringHelper.GetInt(this.txtT_XML.ToolTip)].Cells[3].Text =Server.HtmlEncode(this.txtT_XML.Text);

Die StringHelper.GetInt zugewiesenen Daten (this.txtT_XML.ToolTip)]. Cells [3]. Das Textsteuerelement stammt aus nicht vertrauenswürdigen Datenquellen, was zu Sicherheitslücken bei Cross-Site-Scripting führen kann.

Xpath-Injektion

33         public class LimitClient : xQuant.Web.UI.Base.ServiceBase
            ... 
1037           private string GetNodeValue(XmlDocument xmlDoc, string strAttribute, string strKey)    //sink点
1038           {
1039               if (string.IsNullOrEmpty(strAttribute.Trim()) || string.IsNullOrEmpty (strKey.Trim())) return string.Empty;  
1041               XmlNodeList nodeList = null;
1042               string[] strKeys = strKey.Split('&');
1043               if (strKeys.Count() == 2)
1044                   nodeList = xmlDoc.SelectNodes("//ATYPE[@KEY='" + strKeys[1] + "']/PTYPE[@KEY='" + strKeys[0] + "']");  //sink点
                }

Wenn der Strkey Daten verunreinigt hat, verursacht er eine xpath-Injektion in Zeile 1044.
xmlDoc.selectNodes (XPath, Namensraum) // xmlDoc als Wurzelknoten, um die Abfrage in dem gesamten Dokument annehmen
oder xmlDoc.ChildNodes [i] .SelectNodes (XPath, Namensraum) // Abfrageknoten unter

Fehlende XML-Validierung

8      namespace xQuant.Model.IrCurve
9      {
10         [Serializable]
11         public class GroupItem
12         {
            ...
21             public static List<GroupItem> LoadFromXml(string xmlString)
22             {
23                 List<GroupItem> r = new List<GroupItem>();    
25                 if (string.IsNullOrEmpty(xmlString))
26                     return r;
 [1]XmlTextReader.Create(new StringReader(xmlString)):semantic_25
27                 XmlReader xml = XmlTextReader.Create(new StringReader(xmlString));//sink

Das Programm analysiert das unzuverlässige XML-Dokument direkt, wodurch Angreifer die Möglichkeit für böswillige Injektionen und andere illegale Angriffe erhalten. Wenn das Programm das XML aus nicht vertrauenswürdigen Ressourcen analysiert, sollte es DTD, XDR oder XSD verwenden, um das XML-Dokument zu überprüfen. Weitere Informationen finden Sie in der detaillierten Überprüfungsmethode.
Weitere Informationen finden Sie unter Verwenden von C # zum Überprüfen von XML-Dokumenten über DTD, XDR oder XSD in .NET

Pfadüberquerung

33     string fileName = Path.Combine(HttpRuntime.BinDirectory, logConfigFile);
34     if (!File.Exists(fileName))
       ...

HttpRuntime.BinDirectory: Ruft den physischen Pfad des Verzeichnisses / bin der aktuellen Anwendung ab. Es ist nicht sicher, diesen Pfad direkt für Dateivorgänge zu verwenden.
Pfadüberquerung ist die Anwendung von vom Benutzer steuerbaren Eingaben auf eine Datei-API ohne angemessene Überprüfung. Ein Angreifer kann einige Sonderzeichen (wie ".." und "/") verwenden, um geschützte Einschränkungen und den Zugriff zu beseitigen Einige geschützte Dateien oder Verzeichnisse, damit auf vertrauliche Daten zugegriffen oder mit nicht autorisiertem Zugriff überschrieben werden kann.

Die Verteidigung der Pfadüberquerung besteht hauptsächlich darin, den von Benutzern übermittelten Inhalt streng zu filtern. Hier bezieht er sich hauptsächlich auf das Filtern von Verzeichnissprungzeichen "..", "/", Zeichen zum Abschneiden von Zeichen "% 00", Befehl dir usw. Eine Schwarz-Weiß-Listenstrategie kann ebenfalls verwendet werden. Wenn Sie beispielsweise eine Ressourcen-Whitelist erstellen, lassen Sie Zeichen im Ressourcennamen zu, und im Ressourcennamen werden nur Dateien mit zulässigen Suffixen angezeigt.

Nicht verwaltete Ressourcen werden nicht freigegeben

        {
        ...
            XPBond xp = new XPBond(true); //source
            xp.SaveType = SaveType.Insert;
            QueryBond(xp, reader, true);
                return xp; //sink点
        }

Das Programm kann möglicherweise nicht verwaltete Ressourcen nicht freigeben, wenn eine Ausnahme auftritt oder nicht ordnungsgemäß behandelt wird. Die häufigste Art von nicht verwalteten Ressourcen sind Objekte, die Betriebssystemressourcen wie Dateien, Fenster, Netzwerkverbindungen, Datenbankverbindungen, Pinsel und Symbole umschließen.

Jede Klasse, die nicht verwaltete Ressourcen enthält, sollte die IDisposable-Schnittstelle erben, die Dispose () -Methode implementieren, mit der verwaltete und nicht verwaltete Ressourcen freigegeben werden, und das Objekt selbst aus dem Garbage Collector entfernen (der Garbage Collector recycelt diese Ressource nicht). ; Implementieren Sie einen Klassendestruktor, in dem nicht verwaltete Ressourcen freigegeben werden.
MSDN empfiehlt die Implementierung der IDisposable-Schnittstelle gemäß dem folgenden Modell:

 public class Foo: IDisposable
 {
     public void Dispose()
     {
        Dispose(true);
        GC.SuppressFinalize(this);
     }

     protected virtual void Dispose(bool disposing)
     {
        if (!m_disposed)
        {
            if (disposing)
            {
               // Release managed resources
            }

            // Release unmanaged resources

            m_disposed = true;
        }
     }

     ~Foo()
     {
        Dispose(false);
     }

     private bool m_disposed;
 }

HTTP-Nachrichtenkopfinjektion

            cookie.Value = Request.QueryString["token"];

Das Programm fügt nicht verifizierte Daten direkt in die HTTP-Header-Datei ein. Dies kann zu Angriffen wie dem Abschneiden von HTTP-Antworten, zu Cross-Site-Scripting, Cookie-Manipulation und anderen Sicherheitslücken führen.
Die Verteidigungsmethode für die Injektion von HTTP-Nachrichtenkopfzeilen: Die Überprüfung und Filterung der Eingabe an der richtigen Stelle. Die sicherste Methode besteht darin, eine weiße Liste sicherer Zeichen zu erstellen und nur zuzulassen, dass Zeichen in der weißen Liste in der HTTP-Nachrichtenkopfdatei angezeigt werden.

NUll Zitat

                                   试图将secuInstructionOut转为SecuInstruction类型,如失败,则返回null                      
     SecuInstruction secuInstructionIn = secuInstructionOut.Clone() as SecuInstruction; //source
     secuInstructionIn.BizType = xQuant.Model.XPO.Set.XPSetInstructionSecu.BIZTYPE_TRANSFERIN;//sink

Der as-Operator ähnelt einer Cast-Operation. Wenn Sie den Operator as für die Typkonvertierung verwenden, bestimmen Sie zuerst den Typ des aktuellen Objekts und konvertieren Sie dann, wenn der Typ die Anforderungen erfüllt. Wenn die Konvertierung jedoch nicht möglich ist, wird null zurückgegeben, anstatt eine Ausnahme auszulösen.

Verzeichnis

Veröffentlicht 30 Originalartikel · Gefällt mir 13 · Besuche 100.000+

Ich denke du magst

Origin blog.csdn.net/u013224189/article/details/49584587
Empfohlen
Rangfolge