Frage

Was ist der beste Weg, um einen Besucher konstruieren ihre eigene URL zu handhaben und zu ersetzen, was wir erwarten eine ID zu sein mit allem, was sie wollen?

Zum Beispiel:

ASP.Net MVC - Umgang mit schlechten URL-Parametern

Aber der Benutzer könnte genauso einfach die URL ersetzen mit:

https://stackoverflow.com/questions/foo

Ich habe gedacht, ein String jeden Controller-Funktionsparameter der Herstellung und Verwendung von Integer.TryParse() auf sie - wenn das passiert, dann habe ich eine ID und kann fortgesetzt werden, sonst kann ich den Benutzer zu einer unbekannten / nicht gefunden oder Indexansicht umleiten .

Stack-Überlauf behandelt es schön, und ich möchte auch - wie Sie es tun, oder was würden Sie vorschlagen

War es hilfreich?

Lösung

Hier ist ein Beispiel einer Route wie bei Ihnen, mit einer Beschränkung der Zahl:

routes.MapRoute(
    "Question",
    "questions/{questionID}",
    new { controller = "StackOverflow", action = "Question" },
    new { questionID = @"\d+" } //Regex constraint specifying that it must be a number.
);

Hier stellen wir die QuestionID mindestens eine Nummer zu haben. Dies wird blockieren, auch alle Urls alles andere als eine ganze Zahl enthält, und verhindert auch die Notwendigkeit für eine nullable int.

Hinweis: Diese nehmen nicht berücksichtigt Zahlen, die größer als der Bereich von Int32 (-2147483647 - +2147483647). Ich lasse dies als eine Übung für den Benutzer zu lösen. :)

Wenn der Benutzer die URL „Fragen / foo“ eingibt, wird sie die Frage Aktion nicht getroffen, und fallen durch sie, weil es die Parameterbedingung fehlschlägt. Sie können es weiter unten in einer catchall / Standardroute handhaben, wenn Sie wollen:

routes.MapRoute(
    "Catchall",
    "{*catchall}", // This is a wildcard routes
    new { controller = "Home", action = "Lost" }
);

Damit wird der Benutzer in die verlorene Aktion im Home-Controller senden. Mehr Informationen über die Platzhalter finden Sie hier zu finden .

. NB: Die Catchall sollte als die letzte Route befinden es weiter oben in der Kette platzieren bedeutet, dass dies alle anderen darunter behandelt, die faule Art von Routen in ASP.NET MVC gegeben.

Andere Tipps

Hier finden Sie einige nützliche infromation, die helfen könnten. Wenn Sie eine Aktion-Methode haben

public ActionResult Edit(int? id)
{}

dann, wenn jemand Typen in

/Home/Edit/23

die Parameter-ID wird 23 sein. aber wenn jemand Typen in

/Home/Edit/Junk

dann wird id null sein, was ziemlich cool ist. Ich dachte, es würde ein gegossenes Fehler oder etwas werfen. Es bedeutet, dass, wenn id nicht ein Nullwert ist dann eine gültige ganze Zahl ist und für db Interaktion auf Ihre Dienste usw. übergeben werden.

Hope dies bietet Ihnen ein paar Informationen, die ich während Tests gefunden haben.

In ASP.NET MVC, können Sie einen Filter Implementierung IActionFilter Schnittstelle definieren. Sie werden in der Lage sein, Ihre Aktion mit diesem Attribute zu dekorieren, so dass es auf ausgeführt wird, vor oder nach Ihrer Aktion.

In Ihrem Fall legen Sie fest, es „vor“ der Aktion ausgeführt werden soll. So dass Sie in der Lage sein, es zu kündigen, wenn ein Fehler in den übergebenen Parametern ist. Der entscheidende Vorteil hier, dass Sie nur den Code schreiben, die einmal die übergebenen Paramater Überprüfung (das heißt Sie definieren es in Ihrem Filter) und es verwenden, wo immer Sie in Ihrem Controller-Aktionen wollen.

Lesen Sie mehr über MVC-Filter hier: http: // Haacked. com / Archiv / 2008/08/14 / aspnetmvc-filters.aspx

Sie können Einschränkungen als reguläre Ausdrücke angeben oder benutzerdefinierte Einschränkungen definieren. Werfen Sie einen Blick auf diesen Blog-Post für weitere Informationen:

http://weblogs.asp.net/stephenwalther/archive/2008/08/06/asp-net-mvc-tip-30-create-custom-route-constraints.aspx

Sie müssen noch mit der Situation umgehen, wo ID 43243 nicht auf etwas abbildet, die mit als IActionFilter behandelt werden könnte oder in Ihrem Controller direkt an.

Das Problem mit diesem Ansatz ist, dass sie nach wie vor könnten eine ganze Zahl übergeben, die auf einer Seite nicht zugeordnet werden. Ist gerade ein 404, wenn sie das tun, so wie man es mit „foo“. Es ist nicht etwas zu befürchten, wenn Sie klare Auswirkungen auf die Sicherheit haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top