首页 > 解决方案 > 无法从发布请求中检测到字符串中的 \n 字符

问题描述

在此处输入图像描述我需要将私钥、公钥(使用ursa包生成)和文件发布到 NodeJs 服务器以对此文件进行签名。这些键的格式如下:

    -----BEGIN RSA PRIVATE KEY-----\nMIICXQIBAAKBgQCt6tv2w4sEuHrvCtIgmajM3Dbf7S0aXdM1aG2kON/uG4ibd7R1\n6o
osp847tXgYYJaOB1lKRRDqUETLg1n6LqMHnzNF1NvC0bEtXym90TIXd2CosmWm\nX/R+52
JdM5vuH5kOMuzmYhBTkd8uJln7P+FbuRe9mikRcNSDD2pWojWF3QIDAQAB\nAoGAXhEUrj
Bvpbr+SwKoSpex1DQbvhwzc/phfZahDtzwSYI87hHd2pVj7OlKQ8NQ\nVKcRZ3qUEfavQn
zt6MF/zjChXl67pEG9P6Jv1EAoZjLXf58w0iTJbLZU12Ds53kl\nI4OxnyOCDmPMQiUuDE
XbiJaornSr8Wve8nGje98Ew/WiC6ECQQDUYyJKyGWJXKby\nTe4jj7Wu184v/kgMgRPeOV
3IQZ3WaZDV10BqHd6Nz8ey9sY9hFJML2naSMNSyDXR\nSV5sn/QZAkEA0aFtOvu7K+TEIW
mT14KLN+53IwZ5TVZFomyogkORDe9Q1reIAzV0\n2pNHXiJqMr/MKlp8RD1AKtiWkl6RC/
L4ZQJBAJHy/eG+DGh0jxT7kKZHX2ajTkGU\n0BYnrWuMqHGxBbIOIUWSAeXqWMHDA0xsYJ
Ztk9Be1LL4RaFhi/oiHQ0wbiECQGPY\nnn08jz7t3FkJv2gjfonqZAZju/0Q/WPKm0xIQF
vBw+AxVHAq0viUs6Zrf+eiIO1/\nYbbi8aA2vykCL9XgKV0CQQCeMDc0AJBunncUSgWDnx
AJgW7Th3ukYpEBrJ5gUOpx\n8HKTaIQRv8KLsOkkBhNc5vndTjNDkhJ/ToSkk3tkU29v\n
-----END RSA PRIVATE KEY-----\n

问题是当我将这样的字符串发布到服务器时,服务器无法检测到换行符,并且我在签名时出错(No start line detected)。但是,如果我将此行直接粘贴到服务器的函数中 - 没关系。所以,我的客户html是:

<form id="addFile">
 <div>
   <textarea type="text" id="publicKey" name="publicKey" placeholder="public"></textarea>
 </div>
 <div>
   <textarea type="text" id="privateKey" name="privateKey" placeholder="private"> </textarea>
 </div>
 <div>
   <input type="file" id="document" name="document">
 </div>
 <div>
   <input type="submit" onclick="post()" value="Submit">
 </div>
 </form>

    <script>
      function post() {
        var form = new FormData(document.getElementById('addFile'));
          fetch("http://localhost:3001/postfile", {
            method: "POST",         
            body: form
          });
        }
    </script>

我试图按\n符号分割这一行,但它不起作用,我还尝试使用match带有参数\n\n\ros.EOL 参数的方法 - 不起作用。

请求后来自 Firefox 的控制台说:

表单包含文件输入,但表单上缺少 method=POST 和 enctype=multipart/form-data。该文件将不会被发送。索引.html

TypeError:尝试获取资源时出现 NetworkError。[学到更多]

我的服务器端代码:

const express = require("express");
const bodyParser = require("body-parser");
const multer = require('multer');
const path = require('path');
const os = require('os');
const fs = require('fs');
const crypto = require('crypto')

const app = express();

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(express.static(path.join(__dirname, 'app')));

const storage = multer.diskStorage({
  destination: './documents',
  filename: function (req, file, cb) {
    cb(null, (file.originalname).split('.')[0] + '-' + Date.now() + path.extname(file.originalname));
  }
});

const upload = multer({
  storage: storage,
  limits: { fileSize: 10000000 }
})

app.post('/postfile', upload.single('document'), (req, res, next) => {
  var publicKey =  req.body.publicKey;
  var privateKey = req.body.privateKey;
  const sign = crypto.createSign("SHA256");
  sign.update('Some data');
  sign.sign(privateKey, "hex"); //Error: no start line
})

标签: node.jsrsa

解决方案


换行符不是你的问题。您的问题出在 中textarea,您在开头发布了一个带有空格的私钥。

<textarea> </textarea>
<!--      ^ this bad boy -->

当您关注该文本区域并复制粘贴密钥时,这很可能就是您正在做的事情。空格不会被删除。请注意,插入符号从位置 1 开始,而不是 0。

document.getElementById('privateKey').selectionStart; // 1

除了删除文本区域中的空白

<textarea><textarea>

您可能应该.trim在服务器端执行 a ,以避免用户添加空格出现任何问题。

const publicKey =  req.body.publicKey.trim();
const privateKey = req.body.privateKey.trim();

发生该特定错误,因为密钥必须-----BEGIN RSA PRIVATE KEY-----

更新

你实际上是在粘贴一个私钥:(\n那些不是换行符,只是文字\\n,你不应该这样做,但要修复它:

 const privateKey = req.body.privateKey.replace(/\\n/g, '\n').trim();

当您在 textarea 中发布字符串时,包含\n它的字符串将不等于:\n在 javascript 中,它将等于\\n

const text = document.getElementById('text').innerHTML;

console.log(`${text}: ${text === '\n'}`);
console.log(`${text}: ${text === '\\n'}`);
<textarea id="text">\n</textarea>


推荐阅读