PHP_php 팁을 개발할 때 잊어버리기 쉬운 몇 가지 기술적인 세부 사항

WBOY
풀어 주다: 2016-05-16 19:58:59
원래의
1092명이 탐색했습니다.

개발할 때 일부 기술적인 세부 사항을 잊어버릴 수도 있습니다. 이러한 세부정보는 웹사이트 삽입, 웹사이트 충돌 등 심각한 결과를 초래할 수 있습니다. 이제 PHP에서 발생할 수 있는 몇 가지 "함정"을 요약해 보겠습니다.

트랩 1: 비어 있음()

<&#63;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()

<&#63;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 매뉴얼에는 이 함수의 "이상한" 동작을 설명하기 위해 네티즌이 제공한 많은 예제가 있습니다. :

<&#63;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
로그인 후 복사

안전을 위해 다음과 같은 방법으로 판단하시길 권장합니다.

<&#63;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,这是正确的结果

로그인 후 복사

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿