首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >当字符串可变时,攻击是如何发生的?

当字符串可变时,攻击是如何发生的?
EN

Stack Overflow用户
提问于 2021-01-05 08:57:31
回答 1查看 33关注 0票数 1

人们经常听到字符串是不可变的,这提高了安全性。我理解这样的想法,因为字符串是最终的,所以它们的内容不能在以后更改。但即使内容可以改变,我认为它仍然是安全的,因为代码是由开发人员而不是攻击者编写的。

或者在实践中,这种攻击实际上是如何进行的?

我在网上看到一个例子,表明如果字符串是可变的,攻击者就可以绕过安全机制。我还是不明白。以下代码是由开发人员编写的。这是攻击者永远不能接触的部分。不管字符串是不是可变的,攻击者都不能修改它们的值,对吧?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class FileInputStream
{
 private String filename;
 public FileInputStream(String filename)
 {
  if (!allowedToReadFile(filename))
  throw new SecurityException();
  this.filename = filename;
  }
  ...
 }
EN

回答 1

Stack Overflow用户

发布于 2021-01-05 09:02:32

我相信你指的是内存溢出,如果一个字符串是可变的,那么它有一个固定的内存大小,不能改变,如果它不是,你可以输入一个足够长的值,它可以溢出到其他内存区域,并覆盖其他变量的内容,从而引入安全风险。

例如,假设您的程序中有两个变量var1和var2,这两个变量都是3字节大小的预定义字符串,那么您的内存分配将如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[var1, var1, var1, var2, var2, var2]

初始化时的实际值为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[0,0,0,0,0,0]

然后查询用户输入,得到"aaaa",内存堆栈将如下所示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[a,a,a,a,0,0]

这意味着在第一个变量和第二个变量之间存在溢出。

这非常依赖于语言。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65575774

复制
相关文章
当 Redis 发生高延迟时,到底发生了什么
Redis 是一种内存数据库,将数据保存在内存中,读写效率要比传统的将数据保存在磁盘上的数据库要快很多。但是 Redis 也会发生延迟时,这是就需要我们对其产生原因有深刻的了解,以便于快速排查问题,解决 Redis的延迟问题
Bug开发工程师
2019/11/15
1.6K0
当 snapshot 失败时发生了什么
工作中遇到了与 snapshot 异常相关的问题,特此总结一下,与 snapshot 相关的流程图如下:
shengjk1
2020/10/16
1K0
当 snapshot 失败时发生了什么
当 Redis 发生高延迟时,到底发生了什么
Redis 是一种内存数据库,将数据保存在内存中,读写效率要比传统的将数据保存在磁盘上的数据库要快很多。但是 Redis 也会发生延迟时,这是就需要我们对其产生原因有深刻的了解,以便于快速排查问题,解决 Redis的延迟问题
程序员历小冰
2019/12/05
6260
当 Redis 发生高延迟时,到底发生了什么
Redis 是一种内存数据库,将数据保存在内存中,读写效率要比传统的将数据保存在磁盘上的数据库要快很多。但是 Redis 也会发生延迟时,这是就需要我们对其产生原因有深刻的了解,以便于快速排查问题,解决 Redis的延迟问题
程序员历小冰
2019/11/12
1.2K0
当 Redis 发生高延迟时,到底发生了什么
项目延期是如何发生的?
项目延期可能困扰任何行业,任何团队和任何单个项目,一旦延期就可能导致高昂的损失。项目延期对于任何公司而言都可能是代价高昂的事件。
PM吃瓜
2020/07/23
9580
Python 存储字符串时,是如何节省空间的?
从 Python 3 开始,str 类型代表着 Unicode 字符串。取决于编码的类型,一个 Unicode 字符可能会占 4 个字节,这个有些时候有点浪费内存。
一墨编程学习
2019/05/10
2.6K0
为什么Java字符串是不可变对象?
本文主要来介绍一下Java中的不可变对象,以及Java中String类的不可变性,那么为什么Java的String类是不可变对象?让我们一起来分析一下。
哲洛不闹
2018/09/19
5390
为什么Java字符串是不可变对象?
当删库时如何避免跑路
删库跑路也是个老梗了,可见在运维数据库的过程中误删除数据,或者开发的代码有bug,造成数据的误删除屡见不鲜。不过现在也有许多用于恢复或预防误删除的方案,例如SQL管理系统,将要执行的SQL先交由管理员审核,然后由管理员备份一个镜像数据库,在镜像上执行该SQL,并在执行后还原镜像。这样经过层层把关就可以大大减小出现误操作的几率。
端碗吹水
2020/09/23
9990
当删库时如何避免跑路
为什么Java字符串是不可变对象?
本文主要来介绍一下Java中的不可变对象,以及Java中String类的不可变性,那么为什么Java的String类是不可变对象?让我们一起来分析一下。
java思维导图
2019/11/04
6760
灵魂拷问:为什么 Java 字符串是不可变的?
在逛 programcreek 的时候,发现了一些精妙绝伦的主题。比如说:为什么 Java 字符串是不可变的?像这类灵魂拷问的主题,非常值得深思。
沉默王二
2019/11/14
6440
灵魂拷问:为什么 Java 字符串是不可变的?
Java 中,什么是字符串的不可变性?
字符串的不可变性是指字符串一旦被创建,就会在堆上生成这个字符串的实例,并且不可被改变,任何方法都不会改变字符串本身,而只会创建一个新的字符串。
水货程序员
2018/11/13
1.4K0
CC攻击是如何防御的?
CC攻击是DDOS的一种,前身名为Fatboy攻击,也是一种常见的网站攻击方法。CC攻击原理就是模拟多个用户对一些资源消耗较大的页面不断发出请求,从而达到消耗服务器资源的目的,当服务器一直都有处理不完的大量数据请求时,服务器资源浪费过多,就会造成堵塞,而正常用户的访问也会被终止,网站陷入瘫痪状态。
德迅云安全-小戴
2022/06/09
1.8K0
为什么说 Go 语言字符串是不可变的?
最近有读者留言说,平时在写代码的过程中,是会对字符串进行修改的,但网上都说 Go 语言字符串是不可变的,这是为什么呢?
AlwaysBeta
2023/06/02
3160
灵魂拷问:为什么 Java 字符串是不可变的?
在逛 programcreek 的时候,发现了一些精妙绝伦的主题。比如说:为什么 Java 字符串是不可变的?像这类灵魂拷问的主题,非常值得深思。
纯洁的微笑
2019/11/20
4360
灵魂拷问:为什么 Java 字符串是不可变的?
当输入getsystem会发生什么?
“Meterpreter的getsystem命令是非常nice的!在输入getsystem的命令之后,Meterpreter就会神奇的将权限从本地管理员提升为SYSTEM用户。”
Gamma实验室
2020/12/23
1.1K0
当输入getsystem会发生什么?
当输入getsystem会发生什么?
getsystem命令包含有三种技术,前两个基于命名管道模拟,最后一个依靠令牌复制。
MssnHarvey
2022/08/10
3870
当一个模块被导入两次时,会发生什么?
然后在另一个模块 consumer 中,将上述模块 increment 导入两次:
疯狂的技术宅
2020/03/27
7930
软件项目延期是如何发生的?怎样避免?
软件项目延期可能困扰任何行业,任何团队和任何单个项目,一旦延期就可能导致高昂的损失。项目延期对于任何公司而言都可能是代价高昂的事件。
Hopestarit
2021/11/25
6100
软件项目延期是如何发生的?怎样避免?
java的内存泄露是如何发生的,如何避免和发现?
马克-to-win:上一节讲了,(i)对象被置成null.(ii)局部对象(无需置成null)当程序运行到右大括号.(iii)匿名对象刚用完,垃圾回收线程就早早晚晚都能把它过去占的内存给回收了。这么说,java中难道就没有c++的内存泄露的问题了吗?(内存泄露的定义就是: 咱自己程序不用的内存,系统本应回收但由于各种原因却没有回收成功)马克-to-win:答案: 错,java中有内存泄露。下面我们就通过一个例子来说明。下面的例子中,Mark_to_win m作为实例是占有内存空间的。即使后来m = null;把它置为null,垃圾回收线程也回收不了它占有的空间。因为等我们后面集合框架学习了Vector以后,你就会知道:Vector v是一个类似数组的东西。马克-to-win: 任何通过v.add(m);加到Vector里的东西,Vector都会保留一个对它的引用。正因为有这个引用,垃圾回收系统当中的有向图会认为,这个对象还是可达的,所以不会回收它的内存空间。因为size_Make_to_win非常大,(是maxMemory的0.8倍),所以系统最后就崩溃了。马克-to-win: 用专业术语讲,就是开始时是内存泄漏,泄露多了就造成内存溢出了,所以就曝出OutOfMemoryError的错误了。
马克java社区
2021/03/29
7700
java的内存泄露是如何发生的,如何避免和发现?
点击加载更多

相似问题

当模式“前缀”是可变的时,如何使用Regex拆分字符串

24

当表是varchar()时,如何验证数据免受注入攻击?

20

当格式是可变的时,如何格式化双倍?

23

在Java中,字符串是不可变的,那么当这样做时到底会发生什么呢?

30

当项最初必须是可变的时,返回不可变的集合

40
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文