Ole varovainen kopioidessasi: Lisää käyttäjänimet näkymättömästi tekstiin nollaleveisillä merkeillä

Etkö halua lukea? Kokeile demoa

Nollaleveät merkit ovat näkymättömiä, "tulostamattomia" merkkejä, joita ei näytetä suurimmassa osassa sovelluksia. Tai esimerkiksi, olen kirjoittanut 10 ze ro-leveä spa-ces tähän lauseeseen, c an you tel l? (Vihje: liitä lause Diff Checkeriin nähdäksesi merkkien sijainnit!). Näitä merkkejä voidaan käyttää "sormenjäljen" tekstin kirjoittamiseen tietyille käyttäjille.

Se varmasti voi tehdä, ja sinulla ei olisi aavistustakaan

Miksi?

Alkuperäinen syy ei ole liian jännittävä. Muutama vuosi sitten kuulin joukkueeseen, joka osallistui kilpailuturnauksiin monien videopelien parissa. Ryhmällä oli yksityinen viestitaulu, jota käytettiin muun muassa tärkeiden ilmoitusten lähettämiseen. Lopulta nämä ilmoitukset ilmestyvät muualla verkossa, lähetetään joukkueen pilkkaamiseksi ja mikä vielä tärkeämpää; varmistaa, että viestitaulu oli tarpeeton luottamuksellisten tietojen ja taktiikoiden jakamiseen.

Sivuston turvallisuus näytti melko tiukalta, joten teorian mukaan kirjautunut käyttäjä kopioi ilmoituksen ja postitti sen muualle. Loin komentosarjan, jonka avulla joukkue voi sormenjäljet ​​näkymättömästi jokaisen ilmoituksen käyttäjän käyttäjänimen kanssa, jolle se näytetään.

Huomasin paljon kiinnostusta nollaleveisiin hahmoihin Zach Aysanin äskettäisestä viestistä, joten ajattelin julkaista tämän menetelmän täällä yhdessä vuorovaikutteisen demon kanssa, jotta voin jakaa sen kaikkien kanssa. Koodiesimerkit on päivitetty käyttämään nykyaikaista JavaScriptiä, mutta yleinen logiikka on sama.

Millä tavalla?

Tarkat vaiheet ja logiikka on yksityiskohtaisesti alla, mutta yksinkertaisesti sanottuna; käyttäjänimi merkkijono muunnettaisiin binaarimuotoonsa ja sitten binaari muunnettaisiin nollaleveisiksi merkkisarjoiksi, jotka edustavat kutakin binaarinumeroa. Nollaleveys merkkijono voitiin sitten lisätä näkymättömästi tekstiin. Jos mainittu teksti lähetettiin muualle, nollaleveys merkkijono voitaisiin purkaa ja prosessi kääntää päinvastaiseksi sen selvittämiseksi, kuka sen kopioi!

Tekstin sormenjälki:

1: Sisäänkirjautuneiden käyttäjien käyttäjänimien ottaminen ja muuntaminen binaariksi
Tässä muuntamme vain käyttäjänimen jokaisen kirjaimen sen binääriseksi vastineeksi.

const zeroPad = num => '00000000'.slice (merkkijono (num) .pituus) + num;
const textToBinary = käyttäjänimi => (
  käyttäjänimi.split ('') .kartta (char =>
    zeroPad (char.charCodeAt (0) .toString (2))). liittyä ('')
);

2: Binaarimuunnetun käyttäjänimen ottaminen ja muuntaminen edelleen nollaleveiksi
Tämä toistuu binaarisen merkkijonon läpi ja muuntaa jokaisen 1 nollaleveystilaan ja jokainen 0 nollaleveykseksi ei-puuseppämerkiksi. Kun kirje on muunnettu, lisäämme nollaleveän puhemiehen merkin ennen siirtymistä seuraavaan.

const binaryToZeroWidth = binary => (
  binary.split (''). map ((binaryNum) => {
    const num = parselent (binaryNum, 10);
    if (num === 1) {
      palata ''; // nollaleveä tila
    } muuten, jos (num === 0) {
      palata '‌'; // nollaleveä ei-puuseppä
    }
    palata '‍'; // nollaleveä puuseppä
  }). liittyä ('') // nollaleveä välitöntä tilaa
);

3: Lisää nollaleveä 'käyttäjänimi' luottamukselliseen tekstiin
Tämä oli juuri nollalevyisten merkkien lisääminen luottamukselliseen tekstiin.

Käyttäjätunnuksen purkaminen sormenjäljetiedoista

Logiikan peruuttaminen.

1: Poista nollaleveä käyttäjänimi luottamuksellisesta tekstistä
Odotettu luottamuksellinen teksti poistetaan merkkijonosta jättämällä vain nollaleveät merkit.

2: Muuta nollaleveä 'käyttäjänimi' takaisin binaariksi
Tässä jaksomme merkkijono aiemmin lisättyjen nollaleveysten välimatkojen välille. Tämä antaa meille käyttäjänimen jokaisen kirjaimen binäärisen vastineen nollaleveyden! Toistamme nollaleveyden merkkien läpi ja palautamme 1 tai 0 luomalla binaarijono uudelleen. Jos emme löydä vastaavaa arvoa 1 tai 0, meidän on oltava osuma nollaleveyspuusepään ja siten täyttänyt merkin binaari; voimme sitten lisätä yhden välilyönnin merkkijonoon ja siirtyä seuraavaan merkkiin.

const zeroWidthToBinary = merkkijono => (
  string.split (''). map ((char) => {// nollaleveä tyhjää tilaa
    if (char === '') {// nollaleveä
      palauta '1';
    } else if (char === '‌') {// nollaleveä ei-puuseppä
      palauta '0';
    }
    palata ''; // lisää yksi välilyönti
  }).liittyä seuraan('')
);

3: Muunna binaarinen käyttäjänimi takaisin tekstiksi
Lopuksi jäsentämme binaarimerkkijonon ja muunnamme jokaisen sarjan 1 ja 0 vastaavaan merkkiin.

const binaryToText = merkkijono => (
  string.split ('') .map (num =>
    String.fromCharCode (parseInt (num, 2))). Join ('')
);

johtopäätös

Yritykset pyrkivät enemmän kuin koskaan välttämään tiedon vuotamista ja lopettamaan ilmoittajat. Tämä temppu on vain yksi monista, joita voidaan käyttää. Tehtävästäsi riippuen voi olla elintärkeää ymmärtää tekstin kopiointiin liittyviä riskejä. Hyvin harvat sovellukset yrittävät tehdä nollaleveä merkkejä. Voit esimerkiksi toivoa, että terminaalisi yrittää näyttää ne (minun ei ole!).

Palataksesi takaisin ilmoitustaulun skenaarioon suunnitelma toimi odotetusti. Uusi ilmoitus julkaistiin pian komentosarjan käyttöönoton jälkeen. Muutaman tunnin sisällä teksti oli jaettu muualle nollaleveällä kiinni. Syyllisen käyttäjänimi tunnistettiin oikein ja heidät kiellettiin; onnistunut projekti!

Tietysti tähän menetelmään liittyy joitain huomautuksia. Esimerkiksi, jos käyttäjä tunsi komentosarjan, hän voi teoriassa lisätä omat nollaleveytensä ja syyttää toista. Parempi ratkaisu olisi lisätä käyttäjänimen sijasta yksilöllinen käyttäjätunnus, jota ei ole yleisesti saatavilla.

Jos haluat pelata ympärilläsi, katso demo tai katso lähdekoodi

Haluatko keskustella tästä lisää? Ota yhteyttä Twitteriin