【问题标题】:Send XMLHttpRequest containing script-tags发送包含脚本标签的 XMLHttpRequest
【发布时间】:2020-03-29 12:20:58
【问题描述】:

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

这是我的 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']);
  }
}

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

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

【问题讨论】:

    标签: javascript php utf-8 xmlhttprequest base64


    【解决方案1】:

    好的,所以我想通了。 MySQL aparrently 不允许您在数据库中存储可执行脚本,以防止我猜的 SQL 注入。正确的方法是存储已编码的数据,然后将其解码到您希望输出的位置。

    这就是我更改 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(),一切就绪。那里 - 希望那里的其他人发现这很有用。 :)

    【讨论】:

      猜你喜欢
      • 2012-02-24
      • 1970-01-01
      • 2019-08-30
      • 1970-01-01
      • 2018-04-21
      • 2023-03-19
      • 1970-01-01
      • 2019-07-17
      • 2021-01-21
      相关资源
      最近更新 更多