字符类型及逃逸字符

字符类型

  • 单个的字符是一种特殊的类型:char

  • 用单引号表示的字符字面量:'a' , '1'

  • Java使用的Unicode来表示字符,可以表示包括汉字在内的多种文字

字符运算

import java.util.Scanner;
​
public class Demo01 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        char a = 'A';
        char b = '汉';
        char c = 'C';
        
        a++;
        b++;
        System.out.println(a); //B
        System.out.println(b); //汊
        System.out.println(a-c); //1
        System.out.println((int)a); //66
​
        int i = 'Z'- 'A'; 
        System.out.println(i); //25
    }
}

大小写转换

  • 字母和数字在Unicode表中是顺序排列的

  • '0' 、'1' ... '9'

  • 大写字母和小写字母是分开排列的,并不在一起

import java.util.Scanner;
​
public class Demo02 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        char c = 'A';
        char d = (char)(c + 'a'-'A');
        System.out.println(d); //a
    }
}

字符大小

  • 字符可以被比较大小,依据是它们在Unicode表中的编号

  • '0' —> '9'

  • 'A' —> 'Z'

  • 'a' —> 'z'

  • 'Z' < 'a

逃逸字符

  • 用来表示无法印出来的控制字符或特殊字符,它由一个反斜杠“\”开头,后面跟上另一个字符,这两个字符合起来,组成了一个字符

字符意义字符意义
\b回退一格\n双引号
\t到下一个表格位'单引号
\n换行\\反斜杠本身
\r回车
System.out.println("abc\bd"); //输出为abcd
                              //终端输出为abd

制表位

  • 每行的固定位置

  • 一个\t使得输出从下一个制表位开始

  • 用\t才能使得上下两行对齐

### PHP 反序列化过程中的字符逃逸问题 在 PHP 中,反序列化操作会严格依据对象定义的结构来进行解析。当遇到一个属性声明其长度为特定数值时,PHP 将按照这个指定的数量去读取后续字节作为该属性的实际内容[^1]。 #### 字符逃逸现象描述 如果程序逻辑允许用户输入影响到最终要被反序列化的字符串,则攻击者可能通过精心设计输入来改变预期的对象状态或触发异常行为。特别是,在某些情况下,即使原始数据经过了某种形式的安全处理(比如转义特殊字符),但如果这些措施未能考虑到所有潜在风险点,仍然可能发生安全绕过的情况[^2]。 对于字符串长度不匹配的情形,即实际提供的字符数少于或超过了声明的大小,这通常会导致反序列化进程终止并抛出错误,而不是简单地截断多余部分或是填充不足之处。不过需要注意的是,这种表现可能会因不同的 PHP 版本而有所差异[^3]。 ```php // 示例代码展示了一个简单的类及其序列化/反序列化流程 class Example { public $data; } $originalObject = new Example(); $originalObject->data = 'safe string'; // 序列化后的字符串看起来像这样:"O:7:"Example":1:{s:4:"data";s:11:"safe string";}" $serializedString = serialize($originalObject); // 假设这里的 $maliciousInput 是由外部传入且未充分验证过的恶意构造的数据 $maliciousInput = str_replace('s:11:', 's:999:', $serializedString); // 修改 s 后面表示长度的部分 try { @unserialize($maliciousInput); } catch (Exception $e) { echo "Unserialization failed due to invalid input."; } ``` 上述例子展示了如何利用不当的字符串长度声明造成反序列化失败。尝试解码带有虚假长度说明的字符串将会引发致命错误或者返回 `false` ,取决于具体的环境配置和使用的 PHP 版本。 #### 解决方案建议 为了防止此类漏洞的发生: - **避免直接反序列化不受信任的数据源**:始终确保只对来自可靠渠道的信息执行此操作。 - **实施严格的输入验证机制**:不仅限于基本类型的检查,还应考虑更复杂的模式匹配以及上下文敏感分析。 - **采用白名单策略而非黑名单**:尽可能限定可接受的数据格式范围,拒绝任何不符合预定义标准的内容。 - **定期更新依赖库和技术栈**:保持应用程序所基于的技术组件处于最新稳定版可以有效降低已知缺陷带来的威胁水平。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值