現在の位置: ホーム> 最新記事一覧> [STRNCMP関数を使用して安全な文字列比較を実現する方法は? PHPセキュリティコーディングに不可欠なスキル]

[STRNCMP関数を使用して安全な文字列比較を実現する方法は? PHPセキュリティコーディングに不可欠なスキル]

gitbox 2025-06-20

1。strncmp関数とは何ですか?

STRNCMP関数は、2つの文字列を比較するためにPHPによって提供される関数です。 STRCMPとは異なり、 STRNCMPは指定された数字の数字内で比較されるため、通常の文字列比較よりも正確で安全です。 strncmp関数の構文は次のとおりです。

 <span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-title function_ invoke__">strncmp</span></span><span> ( </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$str1</span></span><span> , </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$str2</span></span><span> , </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$length</span></span><span> )
</span></span>
  • $ str1 :最初の文字列。

  • $ str2 :2番目の文字列。

  • $の長さ:比較する文字の最大数。

この関数は整数値を返し、2つの文字列のサイズ関係に基づいて次の状況を返します。

  • 0の戻り値は、2つの文字列が指定された長さが正確に等しいことを意味します。

  • 返品値は0未満であり、 $ str1が$ str2未満です。

  • 返品値は0を超えることを意味します$ str1は$ str2を超えています。

2。文字列比較にSTRNCMPを使用する必要があるのはなぜですか?

PHPでは、一般的に使用される文字列比較関数はStrcmpStrcasecmpです。これらの関数は、最初から最後まで文字列全体を比較します。ただし、セキュリティ関連のアプリケーションでは、これらの機能を直接使用すると、特に時間の攻撃に直面しても、潜在的なリスクが発生する可能性があります。

2.1タイム攻撃

時間攻撃は、比較操作でシステムが使用する時間の差を測定することにより、データコンテンツを推進する攻撃です。攻撃者は、常に異なる文字列を試して、比較操作によって消費される時間に基づいて、正しい文字列を徐々に推測できます。

たとえば、 STRCMPおよびSTRCASECMP関数は、文字ごとに2つの文字列文字を比較し、最初の不一致の文字が見つかったときに結果を返します。これは、2つの文字列の最初の数文字が同じ場合、関数が後続の文字を比較するのにもっと時間がかかることを意味します。攻撃者はこれを利用して、繰り返し試行を通じて正しいキャラクターの順序を見つけることができます。

2.2 Strancmpセキュリティ

STRNCMP関数により、開発者は文字列の比較の数を制限できます。これは、2つの文字列の最初の数桁が同じであっても、 StrncMPは指定された文字の長さのみを比較し、他の文字を比較し続けることはなく、時間差によって文字列を推測する可能性を減らすことを意味します。 strncmp関数の正確な制御と組み合わせることで、潜在的な時間攻撃を効果的に回避できます。

3. STRNCMPを安全な文字列比較に使用する方法は?

安全な文字列比較を行うとき、 strncmpは次の方法で使用できます。

3.1固定長文字列の比較

2つの固定長文字列を比較する必要がある場合、比較する文字数を直接指定できます。たとえば、長さ16の2つのハッシュを比較する必要がある場合:

 <span><span><span class="hljs-variable">$hash1</span></span><span> = </span><span><span class="hljs-string">'d41d8cd98f00b204e9800998ecf8427e'</span></span><span>;
</span><span><span class="hljs-variable">$hash2</span></span><span> = </span><span><span class="hljs-string">'d41d8cd98f00b204e9800998ecf8427e'</span></span><span>;

</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">strncmp</span></span><span>(</span><span><span class="hljs-variable">$hash1</span></span><span>, </span><span><span class="hljs-variable">$hash2</span></span><span>, </span><span><span class="hljs-number">32</span></span><span>) === </span><span><span class="hljs-number">0</span></span><span>) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'2つのハッシュは同じです'</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'異なるハッシュ値'</span></span><span>;
}
</span></span>

この例では、 STRNCMP関数を使用して32文字のみの比較を制限するため、時間攻撃を回避できます。

3.2ユーザーの入力を比較します

ユーザーが入力したパスワードまたはその他の機密データを確認する必要がある場合は、 STRCMPを直接使用しないようにする必要があります。ユーザーが入力および保存したパスワードハッシュ値は、 STRNCMPと比較できます。例えば:

 <span><span><span class="hljs-variable">$userInput</span></span><span> = </span><span><span class="hljs-string">'password123'</span></span><span>;
</span><span><span class="hljs-variable">$storedHash</span></span><span> = </span><span><span class="hljs-string">'$2y$10$4.2T70akfYlBpgk2JqJbVvDrzVX9pIHH9RbHg5bWlfu'</span></span><span>;

</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">strncmp</span></span><span>(</span><span><span class="hljs-variable">$userInput</span></span><span>, </span><span><span class="hljs-variable">$storedHash</span></span><span>, </span><span><span class="hljs-number">60</span></span><span>) === </span><span><span class="hljs-number">0</span></span><span>) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'パスワードマッチングに正常に'</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'エラーパスワード'</span></span><span>;
}
</span></span>

この例では、ユーザーがパスワードを入力し、保存されたハッシュ値と比較したと想定しています。 60と比較して文字の数を制限することにより、セキュリティを確保します。

4。strncmphash_equals関数の比較

STRNCMPはある程度のセキュリティを提供しますが、PHPは安全な文字列比較( HASH_EQUALSのために、より具体的に別の機能)も提供します。 Hash_equalsは、時間攻撃を回避するように特別に設計されており、文字列の長さやコンテンツの類似性の影響を受けないため、ハッシュ比較にはより良い選択肢です。使用法は次のとおりです。

 <span><span><span class="hljs-variable">$expected</span></span><span> = </span><span><span class="hljs-string">'d41d8cd98f00b204e9800998ecf8427e'</span></span><span>;
</span><span><span class="hljs-variable">$actual</span></span><span> = </span><span><span class="hljs-string">'d41d8cd98f00b204e9800998ecf8427e'</span></span><span>;

</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">hash_equals</span></span><span>(</span><span><span class="hljs-variable">$expected</span></span><span>, </span><span><span class="hljs-variable">$actual</span></span><span>)) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'ハッシュ値は同じです'</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'異なるハッシュ値'</span></span><span>;
}
</span></span>

Hash_equalsはより高いセキュリティを提供しますが、 STRNCMPは、部分的な文字を比較するだけの場合に実行可能なオプションです(たとえば、ハッシュ値の最初の32文字を比較します)。

5。結論

文字列を比較する場合、セキュリティは最初に考慮する要因の1つである必要があります。 PHPのSTRNCMP関数を使用すると、特に固定長の文字列を比較する場合、開発者がアプリケーションのセキュリティを改善するのに役立つ場合、時間攻撃のリスクを効果的に減らすことができます。ただし、 STRNCMPは全能ではなく、より複雑なセキュリティ要件(ハッシュ値の完全な比較など)の場合、 Hash_equals関数を使用することがより理想的な選択です。

文字列比較の方法を合理的に選択することにより、PHPアプリケーションがより安全で信頼性が高まり、潜在的な攻撃からユーザーの機密情報を保護することができます。