PHP 接收参数时需要检测吗?

2016 年 4 月 29 日
 Exin
比如

$val = $_GET[$key];
func ($val); // 使用$val 的函数

如果不事先 $paraSet = isset($_GET) && isset($_GET[$key]);
那么可能返回状态码 500(?) ,但是程序会立即终止。

这样在没有收到参数时通过异常自动结束程序,有没有什么危害?
2428 次点击
所在节点    问与答
16 条回复
b821025551b
2016 年 4 月 29 日
关键词: sql 注入, xss
shiny
2016 年 4 月 29 日
可以考虑 filter_input 或者框架集成
chend
2016 年 4 月 29 日
对于 整形 我直接 intval()
对于字符串 直接 htmlspecialchar()

也不知道 有没有隐患。。。
Exin
2016 年 4 月 29 日
@b821025551b 不是这个问题。
我的问题是"检测变量是否被传入"而不是验证"已传入变量的安全性"。
b821025551b
2016 年 4 月 29 日
@Exin 个人感觉:安全性(数据库)方面应该没什么影响,但是基于书本上说的,“安全性是系统设计、实现和管理的一部分,其作用是保证系统可以完全按照人们想要的方式运行”,那么不监测是否传入空值,从而产生异常程序死掉,这个程序就是“不安全”的。至于危害,
站在测试人员角度:空值导致程序非正常运行, bug ,滚回去改;
站在运维人员角度:满屏的 500 ,这么多 bug 滚回去改;
站在用户角度:什么**网站, f ** k ,又**死了。
那么你就第 N + 1 遍改代码喽。
Exin
2016 年 4 月 29 日
@b821025551b 谢谢。
zrp1994
2016 年 4 月 29 日
xmbaozi
2016 年 4 月 29 日
isset($_GET) 必定是 true 啊
Exin
2016 年 4 月 29 日
@xmbaozi 噢,对的。。手抖了
xmbaozi
2016 年 4 月 29 日
如果没有参数就是数组的键不存在,会有一个 notice ,不是致命错误,所以不会 500
iyaozhen
2016 年 4 月 29 日
还是要检测的,自己封装一个方法吧,不存在的时候给个默认值。
zjqzxc
2016 年 4 月 29 日
$val = isset($_GET['key']) ? $_GET['key']:0;
如果不存在就给个默认值进去
Exin
2016 年 4 月 29 日
@xmbaozi 的确不是直接 500 。一般是在 func($val)里面异常导致 500 。
mahone3297
2016 年 4 月 29 日
这跟 php 没什么关系吧,其他语言,你也要判断吧。。。
Exin
2016 年 4 月 29 日
@mahone3297 限定一下范围有助于话题展开。
msg7086
2016 年 4 月 30 日
@mahone3297 ruby 可以用 guard operator ,不用这么麻烦。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://study.congcong.us/t/275317

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX