개발할 때 일부 기술적인 세부 사항을 잊어버릴 수도 있습니다. 이러한 세부정보는 웹사이트 삽입, 웹사이트 충돌 등 심각한 결과를 초래할 수 있습니다. 이제 PHP에서 발생할 수 있는 몇 가지 "함정"을 요약해 보겠습니다.
트랩 1: 비어 있음()
<?php //以下代码会直接导致PHP解析错误 $arr1 = [1, 2, 3]; $arr2 = [3, 4]; if(empty(array_diff($arr1, $arr2))) { //解析错误 echo 'empty'; } else { echo 'not empty'; }
최신 공식 웹사이트 매뉴얼에는 이에 대한 특별 지침이 있습니다.
참고:
在 PHP 5.5 之前,empty() 仅支持变量;任何其他东西将会导致一个解析错误。
즉, 다음 코드는 적용되지 않습니다: 비어 있음(trim($name)). 대안으로, Trim($name) == false.
을 사용해야 합니다.
제가 마지막으로 이 오류를 접한 것은 Phalcon으로 개발할 때였습니다. 서버에서 계속 503 오류를 보고했습니다. 처음에는 한 줄씩 제거한 후에는 공백의 잘못된 사용으로 인해 발생했습니다. 물론, PHP 5.5부터 공백이 이 쓰기 방식을 지원했습니다.
트랩 2: in_array()
<?php //判断数组里是否存在用户所提交的用户 ID //$post_dirty_id = '1092'; $post_dirty_id = '1092 ORDER BY #1'; $safe_arr = [ 987 => '小明', 1092 => '汤姆', 1256 => '奥立升' ]; if(in_array($post_dirty_id, array_keys($safe_arr))) { echo 'find me'; } else { echo 'do not find me'; } //输出结果:find me,此结果明显错误
이 문제는 웹사이트에 SQL이 주입되어 있어서 발견했는데 다행히 테스트 중에 발견되어 심각한 결과는 없었습니다.
in_array() 함수 사용과 관련하여 주목할 만한 다른 사항이 있습니다. PHP 매뉴얼에는 이 함수의 "이상한" 동작을 설명하기 위해 네티즌이 제공한 많은 예제가 있습니다. :
<?php $a = ['a', 32, true, 'x' => 'y']; var_dump(in_array(25, $a)); // true, one would expect false var_dump(in_array('ggg', $a)); // true, one would expect false var_dump(in_array(0, $a)); // true var_dump(in_array(null, $a)); // false
안전을 위해 다음과 같은 방법으로 판단하시길 권장합니다.
<?php //判断数组里是否存在用户提交的 ID //$post_dirty_id = '1092'; $post_dirty_id = '1092 ORDER BY #1'; $safe_arr = [ 987 => '小明', 1092 => '汤姆', 1256 => '奥立升' ]; if(isset($safe_arr[$post_dirty_id])) { echo 'find me'; } else { echo 'do not find me'; } //输出结果:do not find me,这是正确的结果