>  기사  >  백엔드 개발  >  PHP에서 안전 모드(safe_mode) 구문 분석

PHP에서 안전 모드(safe_mode) 구문 분석

藏色散人
藏色散人앞으로
2020-01-31 18:40:456335검색

PHP 안전 모드란 무엇입니까? 간단히 말해서 PHP 안전 모드는 안전 모드에서 PHP를 실행하는 것입니다.

php의 안전 모드는 여러 사용자 계정이 존재하는 PHP 개방형 웹 서버에서 기본적인 보안 공유 환경을 제공합니다. 웹 서버에서 PHP가 안전 모드로 실행되면 일부 기능이 완전히 비활성화되고 일부 사용 가능한 기능이 제한됩니다. PHP에서 안전 모드(safe_mode) 구문 분석안전 모드에서는 파일 시스템에 접근하려는 일부 기능이 제한됩니다. 웹 서버 사용자 ID를 실행하여 특정 파일을 조작하려면 해당 파일을 읽거나 쓸 수 있는 접근 권한이 있어야 합니다. PHP에서는 이 제한 기능을 구현하는 데 문제가 없습니다.

안전 모드가 켜져 있을 때 로컬 파일을 읽거나 쓰려고 할 때 PHP는 현재 액세스하는 사용자가 대상 파일의 소유자인지 확인합니다. 소유자가 아닌 경우 작업이 비활성화됩니다. safe_mode(쓰기 권한 : 낮은 수준의 파일 접근 권한 하에서, 시스템 운영체제에서 파일을 읽거나 쓰는 것이 허용될 수 있으며, 이는 다른 사용자가 조작하는 것을 방지하기 위해 PHP의 안전 모드를 통해 구현됩니다. 물론 웹 서버는 전역 쓰기 권한으로 임의의 파일에 액세스할 수 있습니다.)

안전 모드가 켜져 있으면 다음 기능 목록의 기능이 제한됩니다.#🎜 🎜 #

chdir, move_uploaded_file, chgrp,parse_ini_file, chown, rmdir, 복사, 이름 바꾸기, fopen, 요구, 하이라이트 파일, show_source, 포함, 심볼릭 링크, 링크, 터치, mkdir, 연결 해제

# 🎜 🎜#

마찬가지로 PHP 확장의 일부 기능도 영향을 받습니다. (모듈 로딩: 안전 모드에서는 dl 기능이 금지됩니다. 확장을 로딩하려면 php.ini에서 확장 옵션만 수정하고 PHP 시작 시 로딩하면 됩니다.)

In php 안전 모드 열릴 때 시스템 프로그램을 실행해야 하는 경우 safe_mode_exec_dir 옵션에 지정된 디렉터리에 있는 프로그램이어야 합니다. 그렇지 않으면 실행이 실패합니다. 실행이 허용되더라도 필터링을 위해 자동으로 escapeshellcmd 함수에 전달됩니다.

명령 실행을 위한 다음 함수 목록이 영향을 받습니다:

exec,shell_exec,passthru,system,popen

#🎜 🎜#또한 뒷마킹 연산자(`)도 꺼집니다.

안전 모드로 실행하면 오류는 발생하지 않지만 putenv 기능이 무효화됩니다. 마찬가지로, PHP 환경 변수를 변경하려고 시도하는 다른 함수 set_time_limit 및 set_include_path도 무시됩니다.

PHP 안전 모드 켜는 방법(PHP5.3에는 더 이상 안전 모드가 없다는 점에 유의하세요)

켜기 또는 끄기 PHP 안전 모드 php.ini에서 safe_mode 옵션을 사용하는 것입니다:

safe_mode=On(使用安全模式)
safe_mode=Off(关闭安全模式)
Apache의 httpd.conf에서 VirtualHost의 해당 설정 방법

php_admin_flag safe_mode On(使用安全模式)
php_admin_flag safe_mode Off(关闭安全模式)
或者:
php_admin_value safe_mode1(使用安全模式)
php_admin_value safe_mode0(关闭安全模式)

영향 안전 모드 활성화 :

기능이 파일 시스템에 액세스하면 파일 소유자를 확인합니다. 기본적으로 파일 소유자의 사용자 ID가 체크되어 있다. 파일 소유자의 그룹 ID(gid)를 수정할 수 있는 경우 safe_mode_gid 옵션으로 지정한다.

시스템에 공유 라이브러리 파일이 있는 경우 포함하거나 요구해야 할 경우 safe_mode_include_dir 옵션을 사용하여 코드가 정상적으로 작동하도록 경로를 설정할 수 있습니다. (포함 경로: safe_mode_include_dir 옵션을 사용하여 더 많은 포함 경로를 포함하려는 경우, include_path 옵션과 같이 unix/linux 시스템에서는 콜론을 사용하고 창에서는 세미콜론을 사용하여 구분할 수 있습니다.) 예를 들어, 안전 모드에서 /usr/local/include/php에 파일을 포함시키려면 옵션을 다음과 같이 설정할 수 있습니다:

safe_mode_include_dir=/usr/local/include/php

포함된 파일을 실행해야 하는 경우 다음을 설정할 수 있습니다. safe_mode_exec_dir 옵션.

예를 들어, /usr/local/php-bin 경로에 있는 파일을 실행 가능하게 해야 하는 경우 옵션을 다음과 같이 설정할 수 있습니다:

safe_mode_exec_dir=/usr/local/php-bin

(실행 가능: 프로그램을 실행하면 /usr/bin 디렉터리에 있으며, 지정한 옵션에 따라 실행될 수 있는 경로에 이 바이너리 파일을 연결할 수 있습니다.)특정 환경 변수를 설정하려는 경우 , safe_mode_allowed_env_vars 옵션을 사용할 수 있습니다. 이 옵션의 값은 환경 변수의 접두사입니다. 기본적으로 php_로 시작하는 환경 변수가 허용됩니다. 이를 변경하려는 경우 이 옵션의 값을 쉼표로 설정하여 여러 환경 변수 접두사를 구분할 수 있습니다.

예를 들어 시간대의 환경 변수 tz가 아래에서 허용되는 경우 이 옵션의 값을 다음과 같이 수정합니다.

safe_mode_allowed_env_vars=php_,tz

안전 모드 외에 PHP도 PHP 안전을 보장하기 위해 다른 많은 기능을 제공합니다.

1. [PHP 버전 번호 숨기기]

php.ini에서 visible_php 옵션을 사용하면 웹 서버에서 PHP가 유출되는 것을 방지할 수 있습니다. 정보를 보고합니다. 다음과 같습니다:

expose_php=on

이 전체 설정을 사용하면 웹 서버를 대상으로 하는 자동화된 스크립트의 일부 공격을 막을 수 있습니다. 일반적으로 http 헤더 정보에는 다음과 같은 정보가 포함됩니다.

server:apache/1.3.33(unix)php/5.2.4mod_ssl/2.8.16openssl/0.9.7c

exposure_php 옵션을 활성화한 후에는 위 헤더 정보에 PHP 버전 정보가 포함되지 않습니다.

当然,用户访问网站的时候同样能够看到.php的文件扩展名。如果你想整个的使用不同的文件扩展名,你需要在httpd.conf中找到如下这行:

addtype application/x-httpd.php

你就可以修改.php为任何你喜欢的文件扩展名。你能够指定任意多个的文件扩展名,中间使用空格进行分割。如果你想在服务器端使用php来解析.html和.htm文件的时候,那么你设置选项如下:

addtype application/x-httpd.html.htm

(解析html:配置你的web服务器使用php去解析所有的html文件,但是如果非服务器端代码也需要php去解析,会影响服务器的性能。静态页面你可以使用不同的扩展名,这样能够消除对php脚本引擎的依赖,增强性能。)

2、[文件系统安全]

安全模式限制了脚本所有者只能访问属于自己的文件,但是你可以使用open_basedir选现来指定一个你必须访问的目录。如果你指定了一个目录,php将拒绝访问除了该目录和该目录子目录的其他目录。open_basedir选项能够工作在安全模式之外。

限制文件系统只能访问/tmp目录,那么设置选项为:

open_basedir=/tmp

3、[函数访问控制]

你能够在disable_functions选项中使用逗号分割来设定函数名,那么这些函数将在php脚本中被关闭。这个设置能够工作在安全模式之外。

disable_functions=dl

当然,同样的你能够使用disable_classes选项来关闭对一些类的访问。

4、[数据库安全]

假设你的php脚本中包含一个基于表单值来执行的mysql查询:

$sql=”update mytable set col1=”.$_post[“value”].”where col2=’somevalue'”;
$res=mysql_query($sql,$db);

你希望$_post[“value”]包含一个整数值来更新你的列col1。可是,一个恶意用户能够输入一个分号在表单字段里,接着,是一段他/她想被任意执行的sql语句。

举例,假设下面是$_post[“value”]提交的值:

0;insert into admin_users(username,password) values (‘me’,’mypassword’);

那么当这个查询发送给mysql查询的时候,那么就变成了下面这条sql:

update mytable set col1=0;
insert into admin_users(username,password) values (‘me’,’mypassword’);
where col2=’somevalue';

这明显是一个有害的查询!首先这个查询会在mytable表里更新col1。这个并没有什么麻烦的,但是第二个表达式,它将执行insert表达式 来插入一个能登陆的新管理员。第三个表达式就废弃了,但同时sql解析器将抛出一个错误,这个有害的查询才完成。这个攻击就是大家常说的sql injection(注:sql注入)。

当然,sql injection存在一个问题,对方必须了解你的数据库结构。在这个例子中,攻击者是知道你有一个表admin_users,并且知道包含username和password字段,同时,存储的密码是没有加密的。

除了你自己,一般的网站访问者是不知道这些关于数据库的信息。可是,如果你使用了一个开发源代码的在线电子商务程序,或者使用一个自由的讨论版程序,这些数据表的定义都是已知的,或者有一些用户能够访问到你的数据库。

此外,你的脚本输出会提示一个查询错误,这些信息里包含了很多关于数据库结构的重要信息。在一个正常工作的网站上,你应该考虑设置 display_errors选项为off,并且使用log_errors来代替display_errors,把警告和错误信息插入到文件中。

(数据库权限:它是一个非常重要的东西,你只有正确的权限,才能通过脚本正确的连接数据库。你应该不要在脚本中使用管理员去连接数据库。如果你这么 做,那么一个攻击者将可能获取全部的数据库权限,并且包括其他相同服务器的权限。攻击者将可能运行grant或create user命令来获取更多的访问权限。)

如果你要防止sql injection攻击,你必须保证用户表单里提交的内容不是一个能够执行的sql表达式。

前一个例子中,我们使用一个整型值来进行更新。如果在单引号后面跟上一个字符串,这个攻击者在分号之前必须提交一个闭合的引用在整个sql表达式中。可是,当magic_quotes_gpc选项是开启的时候,在web表单中提交的引号将自动被转义。

为了防止被恶意的攻击者进行sql injection攻击,你应该总是确认提交的数据是合法的。如果你需要的是一个整数值,那么你可以使用is_numeric函数来测试这个表达值,或者使用settype函数来转换为一个数字,清除任何一个傻傻的sql语句。

如果你开发的程序需要几个提交的值在一个sql表达式里,你能够使用sprintf函数来构建一个sql字符串,使用格式化字符来指示数据类型的每个值。看下面的例子:

$sql=sprintf(“update mytable set col1=%d where col2=’%s'”, $_post[“number”], mysql_escape_string($_post[“string”]));

在上一个例子中,整个mysql的数据已经被使用,所以这个字符串已经通过mysql_escape_string函数进行过滤。对于其他数据库,你可以使用addslashes函数进行转义,或者使用其他方法。

더 많은 PHP 관련 지식을 보려면 php 튜토리얼을 방문하세요!

위 내용은 PHP에서 안전 모드(safe_mode) 구문 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 oschina.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제