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> " +
...
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.