node.js - 无法从发布请求中检测到字符串中的 \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\r
os.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
})
解决方案
换行符不是你的问题。您的问题出在 中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>
推荐阅读
- c# - windows窗体中如何根据DataGridView更改某些按钮的属性
- java - Tomcat 收到 HTTP 400 但 CURL 收到 200
- azure - Azure 存储 API 应用程序的 DR 测试以从次要区域访问数据
- excel - 如何让公式遵循 excel 中的特定模式?
- python - 如何为我的 datafrmae 中的每个标记分配标签?
- javascript - 表中的简单手风琴js问题
- c++ - 如何使用 CLion 设置 Vulkan 开发环境?
- java - ehcache 2:SelfPopulatingCache 丢失刷新
- qt - 如何使用 Macports 包管理器删除 libexec/qt4 和 libexec/qt5?
- ios - 快速查找最小值及其索引号