发送包含 script-tags 的 XMLHttpRequest

Send XMLHttpRequest containing script-tags

因此,我构建了自己的基本 CMS,其中包含一个后端页面,管理员可以在其中输入页面标题、描述、社交媒体配置文件等内容。我还在 head 和 body 中输入了代码注入——用于跟踪。我通过将表单数据制成字符串并将其与 XMLHttpRequest 一起发布到 PHP 文件来保存表单数据。为了将数据变成字符串,我使用了 base64 编码。然而——虽然文本、url 和简单的 html 标记工作正常,但它不能很好地与引号或脚本标签一起使用。它们要么在插入后产生格式错误的字符,要么似乎根本无法插入字符串。有人body知道如何实现吗?

这是我javascript的相关部分:

const request = new XMLHttpRequest();    
siteInfo.addEventListener('submit', function (e) {
  e.preventDefault();
  let trackingHead = btoa(codeEditorHead.getValue());
  let trackingBody = btoa(codeEditorBody.getValue());
  let requestString = 'tracking-head=' + trackingHead + '&tracking-body=' + trackingBody;
  request.open('POST', '/includes/update-siteinfo.php', true);
  request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
  request.send(requestString);
});

哦,顺便说一句,我将 CodeMirror 用于输入字段,因此使用了 getValue 函数。

这里是对应的PHP:

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  if (!empty($_POST['tracking-head'])) {
    $trackingHead = base64_decode($_POST['tracking-head']);
  }
  if (!empty($_POST['tracking-body'])) {
    $trackingBody = base64_decode($_POST['tracking-body']);
  }
}

之后是一些错误处理和插入语句。显然 none 我的错误处理程序触发了,这让我相信问题出在 javascript 请求中而不是 php.

这是编码问题吗?我用错了 headers 吗? base64 是字符串化代码的最佳方式吗?或者我是否误解了有关 XMLHttpRequests 工作原理的一些基本知识? ¯\_(ツ)_/¯

好的,我明白了。 MySQL 显然不允许您在数据库中存储可执行脚本,以防止 SQL-injections 我猜。正确的做法是把编码后的数据存储起来,然后在你想要输出的地方解码。

这就是我改变 Javascript 的方式:

const request = new XMLHttpRequest();    
siteInfo.addEventListener('submit', function (e) {
  e.preventDefault();
  let trackingHead = encodeURIComponent(codeEditorHead.getValue());
  let trackingBody = encodeURIComponent(codeEditorBody.getValue());
  let requestString = 'tracking-head=' + trackingHead + '&tracking-body=' + trackingBody;
  request.open('POST', '/includes/update-siteinfo.php', true);
  request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
  request.send(requestString);
});

注意我使用 encodeURIComponent() 而不是 btoa() 来转义特殊字符。我猜你可以使用任何一种,但对我来说,等到下一步使用 base64 编码更有意义——这样编码和解码都在 PHP.

中完成

这是 PHP 文件:

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  if (!empty($_POST['tracking-head'])) {
    $trackingHead = base64_encode($_POST['tracking-head']);
  }
  if (!empty($_POST['tracking-body'])) {
    $trackingBody = base64_encode($_POST['tracking-body']);
  }
}

然后您可以在回显数据库中的行时使用 base64_decode(),一切就绪。那里 - 希望其他人发现这很有用。 :)