Skip to content
📌知识点小结
  • 条件判断让程序“满足某条件才做某事”,用 if / elif / else。
  • if 后是一个能得出 True/False 的表达式,冒号结尾,下一行缩进执行。
  • 比较运算:== 相等、!= 不等、> < >= <=;逻辑运算:and、or、not。
  • elif 表示“否则如果”,else 表示“以上都不满足时”。
  • 安全脚本常用条件判断响应特征、决定是否存在漏洞。
✅自测一下

0.27 条件判断:让程序看情况办事 ​

第〇篇【零基础预科】免费。现实问题几乎都有"如果……就……否则……",这一篇用代码表达它。

一、if 的基本结构 ​

python
status = 200

if status == 200:
    print("页面正常")
elif status == 404:
    print("页面不存在")
else:
    print("其他状态:", status)

读法:

  • if 条件::条件为真,执行下面缩进块;
  • elif:否则如果(可以有多个);
  • else:都不满足时执行。

把这段代码翻译成大白话,就是检票口的场景:机器先看你这张票的状态码是多少。是 200?放行、提示"页面正常";是 404?告诉你"这页不存在";都不是?那就把实际的数字原样报出来,别瞎猜。你看,程序做事的方式和人不一样——人会"看情况灵活处理",程序只会一条路走到黑,严格按条件落进某个分支,落不进去就走 else。这也正是它可靠的地方:同一个输入,永远得到同一个结果,不会"今天心情好就放行"。

你可能会问:为什么 if 那一行末尾非要写个冒号 :?漏掉会怎样? 这个冒号是 Python 的"语句边界"记号,相当于告诉它"条件到此结束,下面缩进的这一段才是真要执行的"。新手十有八九漏过它,一运行就报 SyntaxError: expected ':'(语法错误:这里该有个冒号)。看到这种错别慌,回到上一行末尾补个 : 多半就好。同理,缩进不齐、用了 Tab 又混着空格,也会报 IndentationError——Python 是靠缩进判断"这段代码归谁管"的,这一点和别的语言不一样,后面循环、函数都会反复用到。

二、比较运算 ​

运算含义
==相等
!=不相等
> <大于 / 小于
>= <=大于等于 / 小于等于

结果一定是布尔值 True / False。

再次强调:= 赋值,== 比较,初学者最容易写错。

说个真实踩坑场景:有人想写"如果状态码等于 200 就做某事",手快写成了 if status = 200:,结果 Python 直接报 SyntaxError——它不允许在 if 的条件里做赋值(新版里你得写成 if (status := 200): 这种海象运算符,初学者先别管)。另一种更隐蔽的错是在别处用了单个 =:你本想比较,结果把值覆盖了,程序不报错、却跑成了你完全没想到的分支,这种 bug 比报错更难查。记住一个直觉:判断"是不是"用 ==,把东西存进变量用 =,两个符号各管一件事。

True 和 False 本身也是值,可以存进变量、也能直接打印。你在终端里敲 3 > 2 回车,它会回你 True;敲 3 == 5 回 False。把"比较"理解成一台只吐"真/假"两种结果的小机器,就不容易把它和普通计算混在一起了。

三、逻辑运算:组合多个条件 ​

python
age = 25
has_ticket = True

if age >= 18 and has_ticket:
    print("可以进入")

if age < 18 or not has_ticket:
    print("不符合条件")
运算含义
and两个都为真才真
or任一为真就真
not取反

日常例子能帮你记牢:进游乐园要"年满 18 并且有票"——两个条件同时满足才放行,这就是 and;"学生 或者 65 岁以上老人免票"——满足其一即可,这就是 or;"不是 VIP 就要排队",这就是 not。三个词和中文里的意思几乎一一对应,不用硬背。

还有个叫"短路"的细节,写多了自然会懂:and 只要左边已经是假,右边就懒得看了(因为整体必假);or 只要左边已经是真,右边也懒得看了。它在安全脚本里其实很有用——比如 if response is not None and "特征" in response.text:,先判"响应存在"再去查内容,就不会因为 response 是空而报错。你现在知道有这回事即可,真遇到了不会一头雾水。

四、安全脚本里的条件判断 ​

python
response_text = "...rmi://evil..."

if "rmi://" in response_text:
    print("发现可疑 JNDI 特征")
elif response_text == "":
    print("响应为空")
else:
    print("暂未发现特征")

判断"返回里是否包含某个特征"是漏洞检测脚本的核心:if 特征 in 响应:。

这里的 in 和前面的 == 不一样:它不要求"整段文字完全相等",而是问"这个小片段在不在一大段文字里"。真实的网页响应可能有几千个字,你不可能逐字比对,只要里面出现了 rmi:// 这种特征串,就值得怀疑——这就是为什么 in 在检测脚本里用得最多。

你可能会问:光靠"包含某个字符串"判断,会不会误报? 会,而且这正是检测脚本常被吐槽的地方。比如某个正常页面的帮助文档里刚好写了一句"本系统不支持 rmi://",脚本也会喊"发现可疑特征"。所以成熟一点的脚本会叠条件:不只要 if "rmi://" in text,还要 and 状态码、and 响应长度落在某个范围,and 排除已知的正常页面。这就是把 and 用起来的真实理由——单一条件太脆,组合条件才靠谱。你后面自己写 PoC 时,一定会经历"先粗判、再加条件压误报"这个过程。

五、嵌套与简洁 ​

  • 条件可以嵌套(if 里再 if),但层级太深难读,应尽量扁平化;
  • 简单判断有时可写成一行,但初学时优先清晰。

为什么层级深了难读?你可以想象 if 里套 if、再套 if,像俄罗斯套娃,每一层缩进一格,读到第五层时你早忘了最外层是在判什么。真实代码里更常见的做法是"提前排除":开头先 if 条件不成立: return/跳过,把不正常的情况挡掉,剩下的主流程就不用再缩进一层。这不是语法要求,而是让人能顺着读下去的写法。

至于"一行写完",Python 里有 print("正常" if status == 200 else "异常") 这种三元写法,确实短。但刚开始写检测脚本,我建议你老老实实写成多行 if/else——多打几行字,换来的是出错时能一眼看出哪个分支走错了。可读性,永远比省那几行重要。

六、本篇小结 ​

  • 条件用 if / elif / else,条件得布尔值、冒号结尾、缩进执行。
  • 比较:==、!=、>、<、>=、<=;逻辑:and、or、not。
  • = 赋值、== 比较,别混淆。
  • 漏洞检测常用 if 特征 in 响应: 做判断。

下一篇 0.28 讲循环,让程序重复干活而不重复写代码。