목차
mt_rand() 안전하지 않은 이유
보안 크리티컬 코드에는 random_int() 를 사용하십시오
일반적인 실수와 함정
후진 호환성 : PHP <7.0
mt_rand() 는 언제 괜찮습니까?
백엔드 개발 PHP 튜토리얼 `mt_rand`에서`random_int`

`mt_rand`에서`random_int`

Jul 28, 2025 am 04:42 AM
PHP Numbers

mt_rand ()는 암호화 목적으로 안전하지 않습니다. 예측 가능한 출력을 생성하는 Mersenne Twister 알고리즘을 사용하여 예측 가능한 출력을 생성 할 수 있으며 보안을 위해 설계되지 않았습니다. 2. 안전한 임의의 숫자 생성의 경우, 운영 체제의 암호적으로 안전한 의사 숫자 생성기 (CSPRNG)에서 나오고 예측 및 타이밍 공격에 저항력이있는 random_int ()를 대신 사용하십시오. 3. 모든 임의의 함수가 동일하다고 가정하는 것과 같은 일반적인 실수를 피하거나 Random_int ()의 구조 범위 또는 Random_int () 및 MT_Rand ()와 같은 안전하고 안전하지 않은 기능을 결합하여 보안을 훼손합니다. 4. 7.0보다 빠른 PHP 버전의 경우 Composer를 통해 Paragonie/Random_compat 라이브러리를 설치하여 Random_int () 및 Random_bytes ()를 안전하게 사용하십시오. 5. MT_RAND ()는 퀴즈 질문, UI ID 생성 또는 예측할 수없는 것이 중요하지 않은 게임 메커니즘과 같은 비 보안에 민감한 작업에만 허용됩니다. 6. 인증 토큰, 세션 키, 비밀번호 재설정 또는 사용자를 향한 비밀을 처리하여 강력한 보안을 보장 할 때 항상 random_int ()와 같은 암호적으로 안전한 기능을 사용하십시오.

`mt_rand`에서`random_int`

PHP에서 무작위 숫자를 생성하는 것은 수년에 걸쳐, 특히 보안과 관련하여 크게 발전했습니다. 토큰, 비밀번호 또는 세션 키를 생성하는 것과 같은 민감한 작업에 여전히 mt_rand() 사용하고 있다면 업그레이드해야합니다. 암호적으로 보안 숫자 생성을 위해 mt_rand() 에서 random_int() 로 이동하는 이유와 방법은 다음과 같습니다.

`mt_rand`에서`random_int`

mt_rand() 안전하지 않은 이유

mt_rand() Mersenne Twister 알고리즘을 사용합니다.이 알고리즘은 시뮬레이션, 게임 또는 셔플 링 데이터에 적합하지만 암호화에는 안전하지 않습니다 .

  • 예측 가능한 출력 : 충분한 출력이 주어지면, 공격자는 내부 상태를 리버스 엔지니어링하고 향후 값을 예측할 수 있습니다.
  • 기본적으로 제대로 시드되지 않음 : 특히 구형 PHP 버전에서는 시드가 약하거나 타임 스탬프와 같은 예측 가능한 값을 기반으로 할 수 있습니다.
  • 보안을 위해 설계되지 않았습니다 : 그것은 예측할 수없는 성능을위한 의사 랜덤 번호 생성기 (PRNG)입니다.

예 : mt_rand(1, 1000000) 사용하여 비밀번호 재설정 토큰을 생성하는 경우 공격자는 시간이 지남에 따라 가능한 값을 무차별하거나 예측할 수 있습니다.

`mt_rand`에서`random_int`

보안 크리티컬 코드에는 random_int() 를 사용하십시오

PHP 7은 random 확장 (PHP 7.0에 내장)의 일부인 random_int() 도입하여 암호화 적으로 랜덤 정수를 생성합니다.

 $ securerandomNumber = random_int (1, 10000000);

이 기능 :

`mt_rand`에서`random_int`
  • OS 레벨 CSPRNG (Linux 또는 Windows의 CryptGenRandom/dev/urandom 예 :)에서 임의성을 끌어냅니다.
  • 예측 및 타이밍 공격에 저항합니다.
  • 시스템의 엔트로피 풀이 비어있는 경우에만 차단합니다 (현대 시스템에서는 매우 드물다).

random_int() 사용하여 예측할 수없는 숫자가 필요할 때 사용하십시오.

  • CSRF 토큰
  • 비밀번호 재설정 키
  • 세션 식별자 (PHP는 내부적으로 처리하지만)
  • 모든 사용자를 향한 비밀

일반적인 실수와 함정

random_int() 가 있더라도 개발자는 미끄러질 수 있습니다.

  • 모든 임의의 함수가 동일하다고 가정합니다
    rand() mt_rand() 로 바꾸고 "고정"이라고 부르는 함정에 빠지지 마십시오. random_int() , random_bytes() 또는 paragonie/random_compat 와 같은 라이브러리 만 안전합니다.

  • 부적절한 범위 처리
    random_int($min, $max) 유효한 경계를 가져야합니다. 부정적인 범위 또는 $min > $max 피하십시오.

  • 무작위성을 "개선"하려고합니다
    다음과 같은 일을하지 마십시오.

     // ❌하지 마십시오
    $ num = random_int (1, 100) * mt_rand (1, 10);

    안전하고 안전하지 않은 소스를 믹싱하면 결과가 약화됩니다.


후진 호환성 : PHP <7.0

php 5.x에 갇힌 경우 paragonie/random_compat 라이브러리를 사용하십시오.

 작곡가는 paragonie/random_compat가 필요합니다

이제 안전하게 사용할 수 있습니다.

 $ securenumber = random_int (1, 100);
$ bytes = random_bytes (16);

구형 PHP 버전에서도 보안 소스를 사용하여 random_int()random_bytes() 를 폴리 필드합니다.


mt_rand() 는 언제 괜찮습니까?

mt_rand() 에는 여전히 유효한 용도가 있습니다. 보안이 중요한 곳이 아닙니다.

  • 퀴즈 질문 목록을 뒤섞습니다
  • UI 요소에 대한 민감한 ID를 생성합니다
  • 공정성 ≠ 보안의 게임 메커니즘

그러나 의심스러운 경우 random_int() 사용하십시오 .


기본적으로 사용자 인증, 액세스 제어 또는 비밀에 닿으면 암호화 적으로 안전합니다. mt_rand() 에서 random_int() 로의 전환은 간단하고 안전하며 미래를 방지합니다.

위 내용은 `mt_rand`에서`random_int`의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제

국제화 및 가독성을위한 고급 번호 형식 국제화 및 가독성을위한 고급 번호 형식 Jul 27, 2025 am 04:32 AM

UseIntl.NumberFormatwithuser-specificlocalesforcorrectdigitgroupinganddecimalseparators.2.Formatcurrencyusingstyle:'currency'withISO4217codesandlocale-specificsymbolplacement.3.ApplycompactnotationforlargenumberstoenhancereadabilitywithunitslikeMorला

정밀 문제 : PHP의 BCMATH 확장을 통한 재무 계산 정밀 문제 : PHP의 BCMATH 확장을 통한 재무 계산 Jul 26, 2025 am 09:43 AM

BCMATH 확장을 사용하는 것은 PHP 재무 계산의 정확도를 해결하는 데 핵심입니다. 플로팅 포인트 수의 반올림 오류를 피하고 문자열을 통해 임의의 정밀도로 소수점 작업을 수행하기 때문입니다. 2. 항상 문자열 형태로 전달하고 결과가 필요한 소수점 이하 자리에 정확한지 확인하기 위해 스케일 매개 변수 (예 : BCADD ( '0.1', '0.2', 2))를 설정해야합니다. 3. 매개 변수를 전달하기 전에 정확도가 손실 되었기 때문에 부동 소수점 번호를 BCMath 함수로 직접 전달하지 마십시오. 4. BCCALE (2)를 통해 전세계 소수점을 설정하여 재무 계산이 두 개의 데시 말을 균일하게 유지하도록 할 수 있습니다. 5. BCMATH 기본 자르기 반올림이 아닌 기본 자리 자르기, 반올림 논리를 직접 구현해야합니다 (예 : Bcround 함수를 통한). 6. 입력 값을 확인해야합니다.

php_int_max 너머 : GMP 및 Bigint로 큰 정수를 처리합니다 php_int_max 너머 : GMP 및 Bigint로 큰 정수를 처리합니다 Jul 27, 2025 am 04:24 AM

php_int_max를 초과하는 정수 (예 : 9223372036854775807), 1. GMP 확장 또는 벽돌/수학과 같은 정확한 수학 라이브러리를 사용해야하는 경우; 2. GMP는 C 라이브러리를 기반으로하며 고성능이지만 서버 지원이 필요합니다. 3. Brick/Math는 순수한 PHP 구현으로 포트가 쉽지만 느리게 진행됩니다. 4. 많은 숫자를 초기화 할 때는 정확도 손실을 방지하기 위해 문자열을 사용해야합니다. 5. 모든 작업은 정확성을 보장하기 위해 부동 소수점 수를 피해야합니다. 최종 선택은 환경 제어의 정도, 성능 요구 사항 및 코드 스타일 환경 설정에 따라 다르지만 큰 정수는 문자열에서 안전하게 초기화되어야합니다.

`mt_rand`에서`random_int` `mt_rand`에서`random_int` Jul 28, 2025 am 04:42 AM

mt_rand () isnotsecureforCryptographicpurspuriteseSthemersennetwisteralgorithm,이를 제시 할 수있는 Output, MaybepoorlySeeded, andisnotDesignedForsecurity.2.forsecurerandomnumbergeneration, userandom_int ()

강력한 숫자 유효성 검사 :`is_numeric ()`vs.`filter_var ()`showdown 강력한 숫자 유효성 검사 :`is_numeric ()`vs.`filter_var ()`showdown Jul 28, 2025 am 04:39 AM

is_numeric () checksifavaluecanbeinterpretedasanumber, scientifichex, scientificnotation 및 whitespace, butonlyreturnsaboolean, 2.filter_var () filter_validate_intorfilter_validate_flat validatesanizesandsantsantsantsantureturningheturninghtureturninghtureturninghteactea

PHP 정수에서 비트 동작으로 성능 잠금을 해제합니다 PHP 정수에서 비트 동작으로 성능 잠금을 해제합니다 Jul 29, 2025 am 02:44 AM

BitwiseOperationsInphPareSfast, CPU-Leveloperations는 handhandlingIntegers, 특히 포스 플래그, 권한 및 compactDatastorage.2.usebitwiseOperators like &, |,^, ~, tomAnipulate individualbits, enableficients booleanflagmanagementwi

PHP의 숫자 유형 저글링 및 강요의 위험과 힘 PHP의 숫자 유형 저글링 및 강요의 위험과 힘 Jul 26, 2025 am 09:38 AM

PHP의 느슨한 유형 시스템은 숫자 유형 변환에서 강력하고 위험합니다. 1. 느슨한 비교 (==)를 사용하면 PHP가 비수막 문자열을 0으로 변환하여 'hello'== 0을 true로 변환하여 보안 취약점을 유발할 수 있습니다. 엄격한 비교 (===)는 항상 필요할 때 항상 사용해야합니다. 2. 산술 작동에서 PHP는 '10apples'와 같은 문자열을 조용히 변환하고 'apples10'이 0이되어 계산 오류가 발생할 수 있습니다. IS_NUMERIC () 또는 FILTER_VAR ()를 사용하여 입력을 확인해야합니다. 3. 배열 키에서 '123'과 같은 숫자 문자열이 정수로 변환되어 '007'이 7이되고 형식이 손실되며 접두사를 추가하여 피할 수 있습니다. 4. 함수 매개 변수

PHP 응용 분야에서 부동 소수점 부정확성을 해제합니다 PHP 응용 분야에서 부동 소수점 부정확성을 해제합니다 Jul 26, 2025 am 09:41 AM

부정확 한 플로팅 포인트 수의 문제는 PHP, 특히 재무 계산 또는 정확한 비교에서 일반적입니다. 근본 원인은 10 진수 소각이 이진 부동 소수점 표현 (IEEE754 표준)에 정확하게 저장 될 수 없으며, 0.1 0.2 ≠ 0.3과 같은 결과를 초래하고; 1. 부동 소수점 번호 평등을 비교할 때는 ==를 직접 사용하는 대신 공차 값 (Epsilon)을 사용해야합니다. 2. 재무 계산은 부동 소수점 번호를 사용하지 말고 대신 정수 (예 : 디비전 단위) 또는 BCMATH 확장을 사용해야합니다. 3. BCMATH는 문자열을 통해 임의의 정밀 계산을 수행하며, 이는 고정밀 시나리오에 적합하지만 성능이 낮습니다. 4. PHP 유형 변환은 오류를 도입하기 위해 문자열 또는 정수를 부동 소수점 번호로 암시 적으로 변환 할 수 있습니다. 요컨대, 부정확 한 플로팅 포인트 수는 일반적인 계산 문제이지만

See all articles