0.27 条件判断:让程序看情况办事
第〇篇【零基础预科】免费。现实问题几乎都有"如果……就……否则……",这一篇用代码表达它。
一、if 的基本结构
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。把"比较"理解成一台只吐"真/假"两种结果的小机器,就不容易把它和普通计算混在一起了。
三、逻辑运算:组合多个条件
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 是空而报错。你现在知道有这回事即可,真遇到了不会一头雾水。
四、安全脚本里的条件判断
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 讲循环,让程序重复干活而不重复写代码。