이 책의 초점은 애플리케이션 보안에 있지만 보안에 관심이 있는 개발자라면 반드시 숙지해야 할 몇 가지 구성 옵션이 있습니다. PHP 구성은 작성하는 코드의 동작과 사용하는 기술에 영향을 미치며 필요할 경우 애플리케이션 외부에 대한 책임을 어느 정도 져야 합니다.
PHP의 구성은 주로 php.ini라는 파일에 의해 지정됩니다. 이 파일에는 많은 구성 옵션이 포함되어 있으며 각 옵션은 PHP에 매우 특정한 영향을 미칩니다. 파일이 없거나 파일에 옵션이 없으면 기본값이 사용됩니다.
php.ini 파일이 어디에 있는지 모른다면 phpinfo( ) PHP에서 파일 경로 정의를 확인하려면:
<?php phpinfo(); ?>
그림 A-1 표시된 여섯 번째 줄(구성 파일(php.ini) 경로)은 php.ini의 전체 경로를 보여줍니다. (파일 이름 없이) 경로만 표시되면 PHP가 표시된 경로에서 php.ini 파일을 찾을 수 없다는 의미입니다.
파일에는 자체 지침이 잘 포함되어 있으므로 파일을 읽고 자신에게 맞는 구성 옵션을 선택할 수 있습니다. 매뉴얼이 더욱 자세하게 나와 있으니 특정 옵션에 대한 추가 정보가 필요할 때 http://www.php.cn/
그림 A-1. phpinfo( ) 함수를 사용하여 php.ini 파일을 찾을 수 있습니다.
A.1.allow_url_fopen
in the six 1장에서 볼 수 있듯이, allowed_url_fopen 옵션을 사용하면 원격 리소스를 로컬 파일인 것처럼 참조할 수 있습니다.
include 또는 require는 5장에서 공개됩니다:
<?php $contents = file_get_contents('http://example.org/xss.html'); ?>
애플리케이션에 필요한 경우가 아니면 허용_url_fopen 옵션을 끄는 것이 좋습니다.
A.2.disable_functions
비활성화_기능 옵션은 잠재적으로 위험한 일부 기능을 사용할 수 없도록 하는 데 매우 유용합니다. 이러한 기능의 사용을 금지하도록 사양을 설정할 수 있지만 개발자가 사양을 따르도록 하는 것보다 PHP 구성에 제한을 가하는 것이 훨씬 더 안정적입니다.
부록 B에 나열된 기능을 확인하여 일부 기능에 제한이 있는지 살펴보겠습니다.
A.3.display_errors
PHP의 오류 보고 기능은 작성한 코드에서 오류를 찾는 데 도움이 될 수 있습니다. 애플리케이션을 개발할 때 오류 메시지를 표시하는 것은 즉각적인 피드백을 얻고 개발 속도를 높이는 효과적인 방법입니다.
프로덕션 등급 애플리케이션에서 이 동작은 보안 위험이 될 수 있습니다. 오류 메시지가 표시되면 모든 사람이 앱에 대한 중요한 정보를 알 수 있습니다.
제품에서 display_errors 옵션을 꺼주셔야 합니다.
A.4.enable_dl
활성화_dl 옵션은 dl을 제어하는 데 사용됩니다. () 기능 활성화된 경우 이 기능을 사용하면 런타임에 PHP 확장을 로드할 수 있습니다.
dl() 함수를 사용하면 공격자가 open_basedir 제한을 우회할 수 있으므로 필요하지 않은 한 애플리케이션에서 이를 비활성화해야 합니다.
A.5. 오류 보고
많은 보안 취약점은 초기화되지 않은 변수나 기타 무계획적인 프로그래밍 기술을 사용하여 발생합니다. PHP의 error_reporting 옵션을 E_ALL 또는 E_ALL | E_STRICT, PHP는 위의 동작을 묻는 메시지를 표시합니다. 이 설정은 공지 수준 오류를 보고하기 위한 것입니다.
我建议把error_reporting至少设定为E_ALL。(译注:在开发中)
A.6. file_uploads
file_uploads选项决定了是否允许上传文件。因此,如果你的应用不需要用户上传文件,那么关闭该选项就是最好的选择。
只是简单地在PHP代码中不对上传文件进行处理是不够的,因为在执行你的代码前,PHP就做了一些工作(如根据相关部据生成$_FILES数组)。
A.7. log_errors
当log_errors设为有效时,PHP会向error_log配置选项指定的文件中写入所有出错信息。
当display_errors设为无效时,将log_errors设为有效是很重要的;否则你将无法看到睛出错信息。
我建议将log_errors设为有效并在error_log设定日志文件所在位置。
A.8. magic_quotes_gpc
magic_quotes_gpc是一个常用的选项,它目的是防止SQL注入。但出于很多原因,包括它转义输入的方式,证明了它是不完善的。
它对$_GET, $_POST, 以及 $_COOKIE中的数据使用同样的规则即addslashes( )函数进行处理。从而,它并没有根据你的数据库选用对应的转义函数进行处理。
基于两个主要的原因,你需要把get_magic_quotes_gpc设为无效:
首先,它会加大你的输入过滤逻辑的复杂性,这是由于它在执行你的代码前首先对数据进行了编辑。例如,你需要对输入的姓名进行过滤,其逻辑是只允许字母、空格、连词符以及单引号,当magic_quotes_gpc生效时,你必须适应形如O\'Reilly的姓名或者使用stripslashes( )尝试将它恢复原形。这一不必要的复杂性(或者说不严谨的过滤规则)加大了发生错误的可能性,同时,你的输入过滤机制中的缺陷必然会导致安全漏洞。
其次,它并没有根据你的数据库选用对应的转义函数进行处理。这样,由于它可以抵挡一些低层次或偶发的攻击,掩盖了它是一个糟糕的过滤或转义机制这个事实,从而留下了一个安全漏洞,使你的应用无法抵挡如针对字符集的攻击等更复杂的攻击手段。
A.9. memory_limit
为防止写得糟糕的脚本占用所有的可用内存,可以使用memory_limit选项对最大内存使用量进行限制(以字节方式或缩写方式如8M指定)。
尽管最佳的取值是与运行的应用是相关的,我还是建议在大多情况下使用默认值8M。
memory_limit选项只有在PHP指定了enable-memory-limit方式编译时才会生效。
A.10. open_basedir
open_basedir选项会限制PHP只能在它指定的目录中打开文件。尽管它不能取代正确的输入过滤,但该选项能减少利用文件系统相关函数如include及require进行的攻击。
该选项的值会被当做前缀使用,因此当你想表示指定目录时请小心不要漏了最后的斜杠:
open_basedir = /path/to/
小提示
请确认enable_dl选项是关闭的,否则open_basedir的限制可能会被绕过。
A.11. register_globals
见第二章
A.12. safe_mode
见第八章
以上就是PHP安全-配置选项的内容,更多相关内容请关注PHP中文网(www.php.cn)!