이 책을 쓰면서 http://www.php.cn/에는 함수와 유사한 일부 구문 구조를 포함하여 총 3917개의 함수가 나열되어 있습니다. 여기서는 이들을 함수와 구별하지 않고 함수로 취급합니다.
기능이 너무 많아서 정확하고 안전한 사용법을 하나씩 설명하는 것은 불가능합니다. 여기에서는 가장 주의가 필요하다고 생각되는 기능을 선택했습니다. 선택 기준에는 사용 빈도, 사용 중 위험 정도(안전성) 및 본인의 경험이 포함됩니다.
나열된 각 기능에 대해 권장 사용법을 제공합니다. 저는 이러한 방법을 제안할 때 안전을 최우선으로 생각하겠습니다. 실제 사용 중에 필요에 따라 적절하게 조정하십시오.
한 기능이 다른 기능과 동일한 위험성을 가지고 있을 경우, 중복 설명보다는 다른 기능을 참고하여 안내하겠습니다.
B.1.eval( )
eval( ) 함수를 사용합니다. to 문자열은 구문 분석되어 PHP 문으로 실행됩니다. 예:
<?php $name = 'Chris'; $string = 'echo "Hello, $name";'; eval($string); ?>
위의 예에서 $string 실행할 PHP 문으로 사용되므로 다음과 같습니다.
<?php $name = 'Chris'; echo "Hello, $name"; ?>
평가( )은 매우 유용하지만 오염된 데이터를 사용하는 경우 매우 위험할 수 있습니다. 예를 들어 다음 예에서 $name이 오염된 경우 공격자는 임의의 PHP 코드를 실행할 수 있습니다.
<?php $name = $_GET['name']; eval($name); ?>
PHP에서 해석되는 문자열이 오염된 데이터를 사용하는지 확실하지 않은 경우, 그리고 가능하다면 eval()을 사용하지 않는 것이 좋습니다. 이 기능은 보안 검토 및 동료 검토 중에 강조되어야 합니다.
B.2.exec( )
6장에서 언급했듯이 셸 명령을 실행하는 것은 매우 위험한 작업입니다. 셸 명령을 구성할 때 오염된 데이터를 사용하면 명령 주입 취약점이 발생할 수 있습니다.
셸 명령 기능을 사용하지 않도록 하세요. 하지만 꼭 사용해야 하는 경우 셸 명령을 생성할 때 필터링되고 이스케이프된 데이터만 사용해야 합니다.
아아앙
B.3.파일( )
파일( ) 함수는 내가 가장 좋아하는 파일 읽기 방법 중 하나입니다. 파일의 각 줄을 반환된 배열의 요소로 읽습니다. 특히 편리한 점은 파일 핸들을 제공할 필요가 없다는 것입니다. 파일 이름만 제공하면 모든 작업이 자동으로 처리됩니다.
<?php $clean = array(); $shell = array(); /* Filter Input ($command, $argument) */ $shell['command'] = escapeshellcmd($clean['command']); $shell['argument'] = escapeshellarg($clean['argument']); $last = exec("{$shell['command']} {$shell['argument']}", $output, $return); ?>
위 파일에 두 줄이 있으면 다음과 유사한 출력이 생성됩니다. < 파일 사용( ) 기능은 특별히 위험하지는 않지만, allowed_url_fopen 옵션을 켠 상태로 사용하면 원격 웹사이트의 콘텐츠와 같은 다양한 유형의 리소스를 읽을 수 있습니다:
<?php $contents = file('/tmp/file.txt'); print_r($contents); ?>
출력은 다음과 같습니다(요약):
아아앙
file() 함수에 의해 호출된 파일 이름이 오염된 데이터로 구성된 경우 해당 내용도 오염된 것으로 간주되어야 합니다. 오염된 데이터를 사용하여 파일 이름을 구성하면 악성 데이터가 있는 원격 웹 사이트를 열 수 있기 때문입니다. 데이터를 변수에 저장하면 위험이 급격히 증가합니다.
Array ( [0] => This is line one. [1] => This is line two. )
$tainted数组中的每个元素与$_POST['filename']有相同的危险性——它是输入并必须要进行过滤。
在这里,其行为有可能是意想不到的——$_POST['filename']的误用可以改变file()函数的行为,因此它可以指向一个远程资源而不是本地文件。
B.4. file_get_contents( )
参见 "file( )."
B.5. fopen( )
参见 "file( )."
B.6. include
如第5章所述,include在组织化与模块化的软件设计中被普遍使用,是非常有必要的。但是,不正确的使用include会造成一个重大的代码注入安全漏洞。
在include语句中只使用已过滤数据是非常有必要的。在安全审查和同行评审中,应重点检查该函数。
B.7. passthru( )
见"exec( )."
B.8. phpinfo( )
phpinfo( )会输出有关PHP信息的页面——运行的版本号,配置信息等等。由于phpinfo( )的输出提供了非常多的信息,我建议限制对任何使用该函数的资源的访问。
如果你使用的第八章中的技巧来保护数据库验证信息,则需要确认访问者不能看到由phpinfo( )形成的输出信息,这是由于它会暴露超级全局数组$_SERVER的内容。
B.9. popen( )
参见"exec( )."
B.10. preg_replace( )
preg_replace( )用于对符合正则表达式的字符串进行替换。在某些情况下,使用被污染数据构造正则表达式部分会非常危险,因为它的e修饰符会导致在替换时把用于替换的参数作为PHP代码来对待。例如(本例为译者所加):
<?php $str = "abcdef"; $se = "len"; $reg = "/abc/e"; echo preg_replace($reg,"strlen(\$se)",$str); ?>
会输出如下字串:
3def
当使用了e修饰符,不管是否有意为之,它会带来与eval()相同的风险。在安全审查和同行评审中,应重点检查该函数。
B.11. proc_open( )
参见 "exec( )."
B.12. readfile( )
参见 "file( )."
B.13. require
参见 "include."
B.14. shell_exec( )
参见 "exec( )."
B.15. system( )
参见 "exec( )."
以上就是PHP安全-函数的内容,更多相关内容请关注PHP中文网(www.php.cn)!