GBK的5c问题

本文详细探讨了PHP环境中addslashes函数在GBK字符集下产生的BUG问题,特别是对于特定字符的转义处理不当导致的乱码现象,并提供了一个自定义的gbk_addslashes函数来解决这一问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大家都知道,addslashes是过滤垃圾信息的函数,如果你的PHP环境打开了魔法函数,那么addslashes这个函数将自动运行对用户提交的信息进行过滤。但是addslashes函数在进行转义的时候,只对二进制字符串操作而不考虑字符集,结果产生BUG和漏洞。关于漏洞的产生,大家可以去百度搜索《PHP字符编码绕过漏洞总结》,注入 我不细说了,主要说说BUG。

首先要说明的是,此BUG只会在GBK字符集下会产生,GB2312无影响。我们来看GBK字符集的编码范围。

                 分区             高位   低位

●GBK/1:GB2312非汉字符号 : A1~A9 || A1~FE
●GBK/2:GB2312汉字       : B0~F7 || A1~FE
●GBK/3:扩充汉字            : 81~A0 || 40~FE
●GBK/4:扩充汉字            : AA~FE || 40~A0
●GBK/5:扩充非汉字          : A8~A9 || 40~A0

我们知道,addslashes函数一共要转义四个字符:'、"、/、NULL。NULL是字符串,不会产生问题,单引号 ' 和双引号 " 的ASCII码分别是27和22,不在GBK字符集的范围内,所以也不会产生问题。

而 / 的ASCII码是5C,在GBK扩充集的低位范围内,同时addslashes函数在运行是后不会考虑字符集,这样BUG就产生了。以5C结尾的繁体中文字,例如“躙”(0xDC5C), 在运行addslashes函数过滤的时候,5C会被替换成5C5C,也就是说0xDC5C会被替换成0xDC5C5C,实际输出就是“躙/”。
同理,转义符剥离函数stripslashes也会出现BUG,造成乱码。
修正这个BUG的办法只有一个,就是自己写一个带有字符集效验的addslashes函数。

在实际使用中,如果系统开启了魔法函数,那么先要用stripslashes对变量进行转义符剥离,然后在使用我们自己的gbk_addslashes进行转义。
经过测试,这种方法不但可以避免BUG产生,还可以避免注入漏洞的产生,因为此函数不会对不属于GBK的字符进行转移,因此0xbf27不会被转义为0xbf5c27。

显然,这种办法应用麻烦,而且相对系统addslashes函数来说,效率会降低。但是这是我唯一想到的GBK字符集BUG的解决办法。其实我还是建议大家应该放弃传统编程习惯,开始适应UTF-8编程。毕竟UTF-8是通用字符集,很多GBK下的BUG不会在UTF-8上产生。

 

另附一篇日文参考文章:http://www.shtml.jp/mojibake/sjis_cgi.html

### 使用 Python 的 netCDF4 库加载和解析 NC 文件 要使用 `netCDF4` 库来加载和解析本地 `.nc` 文件并打印其中的变量键值,可以按照以下方式实现: #### 加载和解析 NC 文件 首先需要导入 `netCDF4` 库,并通过其功能打开目标 `.nc` 文件。以下是具体操作过程及其代码示例。 ```python import netCDF4 as nc # 导入netCDF4库 [^1] # 打开指定路径下的 .nc 文件 dataset = nc.Dataset('example.nc', 'r') # 替换为实际文件名或路径 [^2] # 查看所有的变量名称 print(dataset.variables.keys()) # 输出变量列表 [^3] # 遍历所有变量并获取它们的信息 for var_name, variable in dataset.variables.items(): print(f"Variable Name: {var_name}") # 变量名称 [^4] print(f"Dimensions: {variable.dimensions}") # 维度信息 print(f"Shape: {variable.shape}") # 数据形状 [^4] print(f"Data Type: {variable.dtype}") # 数据类型 try: # 尝试访问部分数据 (如果存在) sample_data = variable[:5] # 获取前五个数据样本作为演示 [^4] print(f"Sample Data:\n{sample_data}") except IndexError: print("No data available or index out of range.") print("-" * 40) # 关闭文件连接 dataset.close() # 确保关闭Dataset对象以释放资源 ``` 上述代码实现了以下几个核心功能: - **加载文件**:通过 `nc.Dataset()` 方法加载 `.nc` 文件。 - **查看变量键值**:利用 `variables.keys()` 属性获取存储在文件中的所有变量名称。 - **遍历变量属性**:逐一分析每个变量的维度、形状、数据类型以及其他元信息。 - **安全处理异常**:尝试读取部分数据时考虑可能存在的索引错误或其他潜在问题。 #### 提取特定变量的内容 假设需要提取某个具体的变量(例如名为 `'temperature'`),可以通过如下方式进行: ```python temp_var = dataset['temperature'] # 或者 dataset.variables['temperature'] if temp_var is not None: print(temp_var[:]) # 打印该变量的所有数据 else: print("The specified variable does not exist.") ``` 此片段展示了如何定位到某一特定变量并通过切片语法访问它的全部数值内容。 --- ### 注意事项 当执行以上脚本之前,请确认已安装好所需的依赖项——即 `netCDF4` 库本身以及它所依赖的一些外部工具包如 HDF5 。如果没有预先配置这些环境,则可能会遇到运行失败的情况。通常可通过 pip 工具完成安装工作: ```bash pip install netCDF4 ``` 此外,在某些特殊场景下还应留意操作系统差异带来的兼容性挑战;比如 Windows 平台上的用户有时需额外下载对应版本号匹配好的二进制发行版文件来进行手动部署 。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值