Utilizați HttpUtility.HtmlEncode sau creați o metodă de extensie (Inginerie software, C#,.Net)

GMon a intrebat.

Ar trebui să folosesc HttpUtility.HtmlEncode sau să scriu o metodă de extensie?

Avantajul utilizării HttpUtility.HtmlEncode este că alți dezvoltatori pot vedea și recunoaște instantaneu ce face.

Avantajul utilizării unei metode de extensie este că este mai puțin cod de scris peste tot și mai puțin zgomot.

Deci, cred că întreb evident lizibilitate vs cod mai ordonat.

3 răspunsuri

Presupunând că veți apela HttpUtility.HtmlEncoded() din metoda de extensie (altfel nu se poate) și, de asemenea, că vei folosi un nume semnificativ pentru metoda ta (altfel nu vei face decât să faci codul mai puțin clar). Având în vedere:

string someText = "This is some text";

Să comparăm:

string htmlEncoded1 = someText.ToHtmlEncodedString();
string htmlEncoded2 = HttpUtility.HtmlEncode(someText);

Sincer, nu văd nicio îmbunătățire mare. Acum să prezentăm caracteristica C# 6 static using:

string htmlEncoded1 = someText.ToHtmlEncodedString();
string htmlEncoded2 = HtmlEncode(someText);

Cred că este clar care dintre ele este mai bună. De asemenea, rețineți că HttpUtility.HtmlEncode() are trei metode supraîncărcate și de obicei consider o practică foarte proastă să poluarea object cu metode de extensie inutile.

Rețineți că „…mai puțin cod de scris…” nu este întotdeauna și fără îndoială mai bine. Conversiile de șiruri de caractere sunt un element important și critice (atât pentru performanță, cât și pentru securitate). Dacă numiți metoda dvs. ToHtmlString() dar – cu ajutorul Intellisense – scrieți ToString() este posibil să aveți un potențial mare bug latent în codul dumneavoastră, care poate trece neobservat într-o sesiune de revizuire a codului.

DeadMG

Cel mai bun sfat este să nu folosiți HttpUtility.HtmlEncode. Problema este că acesta returnează un șir de caractere, ceea ce înseamnă că sistemul de tipuri nu poate prinde neconcordanțele de codificare.

Cea mai bună soluție este de a avea o structură HTML care reprezintă strict și numai HTML, iar apoi de a folosi instanțe ale acesteia pentru a reprezenta HTML, mai degrabă decât șiruri de caractere. În acest caz, compilatorul vă poate asigura că nu există neconcordanțe între HTML și text.

În mod ideal, ar trebui să folosiți, de asemenea, o altă structură pentru textul simplu.

Eren

Puteți obține ce este mai bun din ambele lumi dacă suprascrieți comportamentul HtmlEncode. Acest lucru se realizează prin suprascrierea clasei HttpEncoder astfel:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Web;
using System.Web.Util;
using System.Text;
using System.IO;

/// <summary>
/// Summary description for CustomHttpEncoder
/// </summary>
public class CustomHttpEncoder : HttpEncoder
{
    //
    // TODO: Add constructor logic here
    //
    public CustomHttpEncoder()
    {
    }

    protected override void HtmlEncode(string value, TextWriter output)
    {
        if (value != null) {
            MyHtmlEncode(value, output);
        }
    }

    protected override void HtmlAttributeEncode(string value, TextWriter output)
    {
        if (value != null) {
            MyHtmlEncode(value, output);
        }
    }

    private void MyHtmlEncode(string value, TextWriter output)
    {
        if (value != null) {
            string encodedValue = "";

            for (int i = 0; i <= value.Length - 1; i++) {
                byte[] asciiVal = Encoding.ASCII.GetBytes(value.Substring(i, 1));
                encodedValue += "&#" + asciiVal(0).ToString + ";";
            }

            output.Write(encodedValue);
        }
    }

}

După aceasta, trebuie doar să faceți referire la clasa de suprapunere în Web.config:

<system.web>
    <httpRuntime encoderType="CustomHttpEncoder" />

Clasa Encoder furnizată aici este cea pe care am folosit-o în cadrul proiectelor mele de la serviciu. Suita noastră de pentesting este foarte pretențioasă în ceea ce privește codificarea ieșirii, astfel încât clasa de mai sus codifică pur și simplu fiecare caracter din șirul pe care i-l furnizați. Nu ezitați să vă scoateți pălăria de staniol și să cereți ca MyHtmlEncode() să codifice doar anumite caractere.

Comentarii

  • Nu văd în nici un fel cum se leagă acest lucru de întrebarea lui OP. –  > Por Jesse C. Slicer.
  • Din câte am înțeles, OP întreabă dacă este mai bine să folosească HtmlEncode sau să scrie o metodă de extensie care să modifice într-un fel rezultatul final al HtmlEncode. Precizez că este posibil să suprascrieți HtmlEncode, ceea ce vă permite să apelați în continuare HtmlEncode, dar să folosiți logica pe care o definiți dumneavoastră. Îmi cer scuze dacă am înțeles greșit întrebarea. –  > Por Eren.
  • Nu am dat un vot negativ, ci doar am comentat – dar am înțeles că trebuie să folosesc HtmlEncode așa cum este, sau să îl includ într-o metodă de extensie pentru a fi folosit „nativ” pe șiruri de caractere. –  > Por Jesse C. Slicer.

Tags:,