java string.format()是否阻止字符串注入?

ws51t4hk  于 2021-07-12  发布在  Java
关注(0)|答案(1)|浏览(648)

关闭。这个问题需要细节或清晰。它目前不接受答案。
**想改进这个问题吗?**通过编辑这个帖子来添加细节并澄清问题。

昨天关门了。
改进这个问题
我一直在准备技术面试。所以有一点我不确定。如果我写一个例子

try {
...
} catch (InterruptedException ie) {
    throw new IllegalStateException(String.format("Player [%s]: failed to reply message [%s]"), ie);
}

这是否已经阻止了字符串注入?或者我必须这样写:

String errorMsg = String.format("Player [%s]: failed to reply message [%s]");
throw new IllegalStateException(errorMsg, ie);
bqjvbblv

bqjvbblv1#

这两个片段没有区别。两者都不能防止“字符串注入”。
针对字符串注入攻击,只有4种非bonehead缓解措施:
确保字符串结束时,不可能以任何方式或形式成为安全问题。例如,如果您的数据将进入一个二进制文件,其中所有系统操作员都知道内容直接来自web,那么上传的内容并不重要。
根本不渲染字符串。把孩子和洗澡水一起扔出去。
使用白名单。如果字符串仅由这些允许的内容组成,请允许它。默认情况下,不允许。
使用逃生器。
值得一提的是黑名单的概念:有一个已知的恶意内容列表,并允许所有字符串,除非它们包含在黑名单上的东西。这是骨头,永远不应该使用。例如,如果您扫描传入数据 <script> ,你搞砸了。别这样。它不起作用。黑名单被忽略了。白名单就是你要找的。
最常见的策略是第四种:逃避者。例如,当您有一个web服务器,它接收用户名、用户电话号码和用户全名,然后将所有这些信息显示在其公共网站上,然后:
应该使用白名单策略减少电话号码。一个+、0-9之间的数字、空格、破折号等。如果输入是这样的,那就允许吧。否则不要。
应通过转义来减轻用户的真实姓名:按提供的方式获取数据并将其逐字注入数据库,但在与该数据的所有交互中,都将此数据视为受污染的数据:例如,在呈现该公共页时,需要通过html转义器(例如,替换所有内容)清洗“全名”字符串 <&lt; .
你的代码不做这4件事中的任何一件(它的任何一个版本)。
一般来说,考虑异常的 .getMessage() 已经“安全”(转义/通过白名单验证)。相反,调用 .getMessage() 需要应用上述4种缓解措施之一。

相关问题