PHP太强大、太容易了,因此开发者常常忘记Web安全相关的问题。
抛开重要性不看,安全问题往往是网站中最容易被人忽视的一个部分。不幸的是,有很多种方法可以从内部或外部危害系统的安全,你必须不断的找出并修补这些潜在的危险因素。
在进行安全检测时,有很多需要强调的问题——不止是与安全直接相关的,还包括许多其他的内容。
要编写安全的程序,首先必须掌握一些基础技术,这样你才能应付本章的题目。
问题
1.以下哪种方法能防止你的PHP
程序遭受外部入侵?
A.使用复杂的加密算法
B.保护数据库密码
C.如果有可能的话,使用SSL
D.验证输入
E.只使用来源可信的输入
2.假设$action和$data变量用来接受用户输入,并且register_globals是打开的。以下代码是否安全? 复制PHP内容到剪贴板
PHP代码:
if(isUserAdmin()) { $isAdmin = true; }
$data = validate_and_return_input($data);
switch($action)
{
case 'add':
addSomething($data);
break;
case 'delete':
if($isAdmin) {
deleteSomething($data);
}
break;
case 'edit':
if($isAdmin) {
editSomething($data);
}
break;
default:
print "Bad Action.";
}
?>
A.安全。在执行受保护的操作前先检查$isAdmin是否为true
B.不安全。没有确认$action是不是合法输入
C.不安全。$isAdmin可以通过register_globals被篡改
D.安全。因为它验证了用户数据$data
E.A和B
3.要防止跨站攻击,以下哪些是需要做的?(三选)
A.永远不要使用include和require引入靠用户输入决定路径的文件(比如:include”$username/script.txt”;)
B.除非网站需要,否则关闭allow_url_fopen
C.避免使用如curl这类用来打开远程连接的扩展库
D.使用类似strip_tags()一类的函数过滤一个用户输入给另一个用户看的内容
E.以上都对
4.如果register_globals必须要被打开,如何才能防止恶意用户危害系统安全?(双选)
A.过滤所有来自非信任源的数据
B.过滤所有外部数据
C.所有变量在使用前先初始化
D.使用难猜变量名来防止用户篡改数据
E.以上都对
5.SQL查询常常基于用户输入的数据来构建。以下哪种方法能避免安全隐患?
A.在数据服务器和
web服务器之间放置防火墙
B.转义用户数据,使其中无法包含DBMS能执行的SQL命令
C.使用存储例程
D.使用面向对象编程,把每个查询定义为单独的类
6.某些时候需要在PHP脚本中使用第三方功能,来实现一些PHP不能完成的任务(比如调用压缩
软件压缩某种PHP不支持其格式的文件)。在PHP脚本中执行系统命令时,以下哪些选项能
确保没有命令注入?(双选)
A.总是给要在exec()中执行的命令加`
B.总是使用shell_exec函数,它能够在执行前对命令进行安全检查
C.使用escapeshellcmd函数转义命令中的特殊字符
D.在执行命令前,先用ini_set()打开safe_mode,
E.用escapeshellarg函数在执行前转义命令参数
7.处理HTTP文件上传时,PHP把文件储存在$_FILES中。在PHP脚本的执行周期中,这些文件将放在本地的临时文件夹里,而在脚本结束后,文件将被自动删除。在处理HTTP文件上传时,如果确保当前操作的文件是正确的文件?(双选)
A.操作前,将文件名与浏览器
报告的文件名对比
B.操作前,用file_exists函数确保文件存在
C.用is_uploaded_file函数确认你的文件的确是通过HTTP方式传输过来的
D.用move_upload_file()将文件移动到安全位置
E.只信任PHP存储临时文件的目录下的文件
8.在PHP的“安全模式”下,以下哪些设置有助于降低安全风险?(三选)
A.限制shell命令的执行
B.限制对系统环境变量的访问
C.限制PHP的文件包含目录
D.限制允许对数据库进行的操作
E.以上全部
9.要限制脚本只能访问一个指定的文件夹中的文件,