【问题标题】:How to encode Javascript [duplicate]如何编码Javascript [重复]
【发布时间】:2021-08-07 17:29:44
【问题描述】:

如何解码\x6a\x61\x76\x61\x73\x63\x72\x69\x70\x74\x3a\x61\x6c\x65\x72\x74\x28313\x29 到: javascript:alert(313)

有谁知道编码,请指导我,我将非常感谢你!

谢谢!

【问题讨论】:

  • 第一个字符串是什么?您应该提及和/或标记它。
  • @user2263572 这和 UTF8 有什么关系?
  • 从十六进制使用.toString()?
  • @biberman “javascript:alert(313)”的 utf-8 编码是什么?我给你一个猜测。
  • console.log("\x6a\x61\x76\x61\x73\x63\x72\x69\x70\x74\x3a\x61\x6c\x65\x72\x74\x28313\x29")

标签: javascript


【解决方案1】:

您可以编写一个简单的解析器,将 Unicode 代码点转换为等效字符。

const main = () => {
  const convertBtn = document.querySelector('.convert');
  convertBtn.addEventListener('click', onConvert);
  triggerEvent(convertBtn, 'click');
};

const onConvert = e => {
  const input = document.querySelector('.input');
  const output = document.querySelector('.output');
  output.value = parseUnicodeString(input.value);
};

const parseUnicodeString = unicodeSring => {
  let result = '', buffer = null;
  for (let i = 0; i < unicodeSring.length; i++) {
    if (unicodeSring[i] === 'x') {
      buffer = '';
    } else if (/[0-9a-f]/.test(unicodeSring[i])) {
      if (buffer != null) {
        if (buffer.length === 1) {
          result += parseCodePoint(buffer + unicodeSring[i]);
          buffer = null;
        } else {
          buffer += unicodeSring[i];
        }
      } else {
        result += unicodeSring[i];
      }
    }
  }
  if (buffer != null && buffer.length > 0) {
    result += parseCodePoint(buffer);
  }
  return result;
}

const parseCodePoint = codePoint =>
  String.fromCodePoint(parseInt(codePoint, 16));

const triggerEvent = (el, eventName, data) => {
  let event;
  if (window.CustomEvent && typeof window.CustomEvent === 'function') {
    event = new CustomEvent(eventName, {detail: data});
  } else {
    event = document.createEvent('CustomEvent');
    event.initCustomEvent(eventName, true, true, data);
  }
  el.dispatchEvent(event);
};

main();
body,html{width:100%;height:100%;margin:0;padding:0;background:#000;color:#fff}body{display:flex;flex-direction:column}button{background:#c46;border:thin solid #d26;color:#eee;padding:.125em;font-weight:700;cursor:pointer}button:hover{background:#f47;color:#fff}textarea{flex:1;background:#222;color:#eee;resize:none;border:none;outline:0;padding:.25em}
<textarea class="input">\x6a\x61\x76\x61\x73\x63\x72\x69\x70\x74\x3a\x61\x6c\x65\x72\x74\x28313\x29</textarea>
<button class="convert">Convert</button>
<textarea class="output">
</textarea>

如果你把String.prototype.replace和一个正则表达式结合起来,你可以简单地将上面的逻辑变成一个单行。

const main = () => {
  const convertBtn = document.querySelector('.convert');
  convertBtn.addEventListener('click', onConvert);
  triggerEvent(convertBtn, 'click');
};

const onConvert = e => {
  const input = document.querySelector('.input');
  const output = document.querySelector('.output');
  output.value = parseUnicodeString(input.value);
};

const parseUnicodeString = unicodeSring =>
  unicodeSring.replace(/\\x([0-9a-f]{2})/ig, (match, codePoint) =>
    String.fromCodePoint(parseInt(codePoint, 16)));
    
const triggerEvent = (el, eventName, data) => {
  let event;
  if (window.CustomEvent && typeof window.CustomEvent === 'function') {
    event = new CustomEvent(eventName, {detail: data});
  } else {
    event = document.createEvent('CustomEvent');
    event.initCustomEvent(eventName, true, true, data);
  }
  el.dispatchEvent(event);
};

main();
body,html{width:100%;height:100%;margin:0;padding:0;background:#000;color:#fff}body{display:flex;flex-direction:column}button{background:#c46;border:thin solid #d26;color:#eee;padding:.125em;font-weight:700;cursor:pointer}button:hover{background:#f47;color:#fff}textarea{flex:1;background:#222;color:#eee;resize:none;border:none;outline:0;padding:.25em}
<textarea class="input">\x6a\x61\x76\x61\x73\x63\x72\x69\x70\x74\x3a\x61\x6c\x65\x72\x74\x28313\x29</textarea>
<button class="convert">Convert</button>
<textarea class="output">
</textarea>

【讨论】:

  • 这不能实现为JSON.parse('"' + userInput + '"')吗? :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-13
  • 1970-01-01
  • 1970-01-01
  • 2011-01-14
相关资源
最近更新 更多