在现有的Web应用程序项目中,需要防止将原始ID提供给前端。像下面的html:
<select name="InvoiceId">
<option value="1">Bill_1</option>
<option value="2">Bill_2</option>
</select>
自
<select name="InvoiceId">
<option value="encryptedString1">Bill_1</option>
<option value="encryptedString2">Bill_2</option>
</select>
除此之外,还会有带有敏感 ID 的隐藏输入字段、属性等。它们由控制器的操作填充,返回 JsonResult、ViewResult 等。
目的是保护在前端 html 源代码中看到的原始私有 ID,最后使前端 ID 的更改无用(因为解密后更改的 id 将是随机乱码(。
对于解密,一种选择是在 MVC 管道中使用模型绑定器,它将读取值并检查它是否加密(也许通过检查它是否以某个 std 字符串(如 BCrypt(开头(,然后解密,有助于不在整个应用程序中进行任何解密代码更改。
就像这样,如果有人可以建议一种将加密作为应用程序管道的一部分实现的方法(也许通过结果过滤器?(,以便开发人员也被迫加密任何携带敏感数据的属性(也许用自定义属性标记,如"SensitiveInfo"(
加密/解密的密钥也存在问题,也许它将以随机盐记录在用户的会话ID中。和算法,这将足够快。
有人可以建议在现有Web应用程序中实现它的最佳方法吗?
请注意,应用程序堆栈是.net MVC 5,JavaScript/jQuery,Dapper。
我认为做这个服务器端更动态,因为你已经Razor pages
你的端。正如你所说:
防止向前端提供原始 ID。
在这种情况下: 在 C# 中加密和解密字符串
在倾斜方面的情况下。看看下面:JavaScript 字符串加密和解密?
在这里,您可以找到CryptoJs文档/示例和用法: https://cryptojs.gitbook.io/docs/
下面是加密值的示例: https://jsfiddle.net/monvtf7j/3/
不要忘记检查控制台的输出,否则导航到 HTML 元素并检查值(在 fidler 的浏览器中(
var sensitiveIdOne = "1129932ABC";
var encrypted = CryptoJS.MD5(sensitiveIdOne);
$("#1").attr("value", encrypted);
console.log($("#1").attr("value"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js"></script>
<select name="InvoiceId">
<option id="1">Bill_1</option>
<option id="2">Bill_2</option>
</select>