ホームページ  >  記事  >  バックエンド開発  >  PHP コードレビューの詳細な紹介_PHP チュートリアル

PHP コードレビューの詳細な紹介_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-21 15:06:181422ブラウズ

概要
コードレビューは、アプリケーションのソースコードを体系的に検査することです。その目的は、開発段階でアプリケーションに存在する抜け穴やプログラムロジックのエラーを見つけて修正し、企業に不必要なリスクをもたらすプログラムの脆弱性の不正利用を回避することです。その理由はコードレビューではありません。コードの安全性を確保し、情報とリソースを適切に保護するには、アプリケーション全体のビジネス プロセスを理解し、潜在的なリスクを制御することが非常に重要です。
監査人は、次のような質問を使用して開発者にインタビューし、アプリケーション情報を収集できます。

アプリケーションにはどのような種類の機密情報が含まれていますか? アプリケーションはこの情報をどのように保護しますか?
アプリケーションは内部または外部にサービスを提供しますか? 誰がそれを使用しますか? それらはすべて信頼できるユーザーですか?
どこにありますか?アプリケーションは導入されていますか?
ビジネスにとってアプリケーションはどのくらい重要ですか?

最善の方法は、チェックリストを作成し、開発者に記入してもらうことです。チェックリストは、アプリケーション情報と開発者が作成したコーディングのセキュリティをより直観的に反映できます。データ検証、ID 認証、セッション管理、認可、暗号化、エラー処理、ロギング、セキュリティなど、重大な脆弱性がある可能性のあるモジュールをカバーする必要があります。構成、ネットワーク アーキテクチャ。

入力検証と出力表示
ほとんどの脆弱性の主な理由は、入力データが安全に検証されていないか、出力データが安全に処理されていないことです。より厳格なデータ検証方法は、データの正確な照合です。ホワイトリストに登録されたデータを受け入れる
ブラックリストに登録されたデータを拒否する
ブラックリストに登録されたデータと一致するデータをエンコードする

PHP でユーザーが入力できる変数のリストは次のとおりです: $_ HTTP_GET_VARS

$_HTTP_POST_FILES$_HTTP_POST_VARS
$_HTTP_SERVER_VARS
これらの入力変数を確認する必要があります


コマンドインジェクション

セキュリティ脅威
コマンドインジェクション攻撃は、入力メカニズム (有効な検証制限がないフォームフィールドなど) に HTML コードを入力することにより、Web ページの動的に生成されたコンテンツを変更し、悪意のあるコマンドが乗っ取ることを可能にする可能性があります。ユーザーのコンピュータとそのネットワーク。 PHP は次の関数を使用してシステム コマンドを実行できます:
system、exec、passthru、``、shell_exec、popen、proc_open、pcntl_exec
すべてのプログラム ファイルでこれらの関数を検索し、関数のパラメーターが送信されるかどうかを判断します。変更する前に、これらのパラメータが安全に処理されたかどうかを確認してください。

コード例

例1:

コードをコピー
コードは次のとおりです:
//ex1.php
$dir = $_GET["dir"];
if (isset( $dir)){
echo "

";<div class="codetitle">system("ls -al".$dir);<span style="CURSOR: pointer"  onclick="doCopy('code1292')">echo "
";}?>

送信します



コードをコピーします

コードは次のとおりです:


http:// localhost/ex1.php?dir=| cat /etc/passwd

送信後のコマンドは

コードをコピーします コードは次のようになります:
system("ls -al | cat /etc/passwd");



防止方法


1. 外部コマンドを実行しないようにします
2. カスタム関数または関数ライブラリを使用してコマンドパラメータを処理します4.実行可能ファイルを指定します ファイルへのパス
esacpeshellarg 関数は、パラメーターまたはコマンドの終了の原因となる文字をエスケープし、一重引用符 "'" を "'" に置き換え、二重引用符 """ を """ に置き換えます。 、セミコロン「;」を「;」に区切って、safe_mode_exec_dir を使用して実行ファイルのパスを指定し、このパスに使用するコマンドを事前に置くことができます。

コードをコピーします
コードは次のとおりです:
safe_mode = On
safe_mode_exec_di r= /usr/local/php/bin/


クロスサイト スクリプティングの脅威 (クロスサイト スクリプティング)
セキュリティの脅威
クロス サイト スクリプト (XSS)、クロスサイト スクリプティングの脅威。攻撃者は、アプリケーションの動的データ表示機能を利用して、HTML ページに悪意のあるコードを埋め込みます。ユーザーがページを閲覧すると、HTML に埋め込まれたこれらの悪意のあるコードが実行され、ユーザーのブラウザが攻撃者によって制御され、攻撃者の特別な目的が達成されます。出力関数はよく使用されます: echo、print、printf、vprintf、<%=$test%>

クロスサイトスクリプティング攻撃には、次の 3 つの攻撃形式があります。
(1) 反射型クロスサイトスクリプティング攻撃
攻撃者は、ユーザーがページを開いたときに、ソーシャル エンジニアリング手段を使用して、ユーザーに URL 接続を送信します。 、閲覧 サーバーはページに埋め込まれた悪意のあるスクリプトを実行します。
(2) ストア型クロスサイトスクリプティング攻撃
攻撃者は、Web アプリケーションが提供するデータ入力や変更機能を利用して、データをサーバーやユーザーの Cookie に保存し、他のユーザーがデータを表示するページを閲覧すると、ブラウザーがそのデータをサーバーまたはユーザーの Cookie に保存します。ページに埋め込まれた悪意のあるスクリプトを実行します。すべての視聴者が脆弱です。
(3) DOM クロスサイト攻撃

HTML ページ内に JS が定義されているため、ユーザーの入力に基づいて HTML コードが表示され、攻撃者は入力中に悪意のあるスクリプトを挿入することができます。最終的に表示されると、悪意のあるスクリプトが実行されます。 DOM クロスサイト攻撃と上記の 2 つのクロスサイト攻撃の違いは、DOM クロスサイト攻撃は純粋なページ スクリプトの出力であり、標準化された方法で JAVASCRIPT を使用することによってのみ防御できることです。

悪意のある攻撃者は、クロスサイト スクリプティング攻撃を次の目的で使用する可能性があります:
(1) ユーザーの Cookie を盗み、偽のユーザー ID でログインします。
(2) 攻撃目的を達成するために、閲覧者に特定のページ操作を強制し、ユーザーとしてサーバーへのリクエストを開始します。
(3) ブラウザの脆弱性と組み合わせて、ウイルス トロイの木馬をブラウザのコンピュータにダウンロードして実行します。
(4) 派生 URL ジャンプの脆弱性。
(5) 公式サイトにフィッシングページを表示させる。
(6) ワーム攻撃

コード例
「ユーザーが制御可能なデータ」を HTML ページに直接表示すると、クロスサイト スクリプティングの脅威に直接つながります。

コードをコピーします コードは次のとおりです:
これらの表示方法により、ユーザーのブラウザが「ユーザー制御可能なデータ」を JS/VBS スクリプトとして実行したり、ページ要素が「ユーザー - 「制御可能なデータ」 ページの HTML コードが制御され、攻撃が引き起こされます。
解決策

a) HTMLで「ユーザーが制御可能なデータ」を表示する前に、htmlescapeを実行する必要があります。
コードをコピーしますコードは次のとおりです:
htmlspecialchars($outputString,ENT_QUOTES);

HTMLエスケープは次のリストに従ってエスケープする必要があります:

コードをコピーします コードは次のとおりです。
> <
> > '



b) JavaScript での出力 「ユーザーが制御可能なデータ」は、JavaScript エスケープでエスケープする必要があります。

エスケープする必要がある文字は次のとおりです:


コードをコピーします

コードは次のとおりです:
/ --> ' " --> " -- > \

c) リッチ テキスト エディターにスクリプト化されたスクリプト コードが存在しないように、リッチ テキストに出力される「ユーザー制御可能なデータ」に対してリッチ テキスト セキュリティ フィルターを実行します (ユーザーが HTML の出力を許可されている場合)。
SQLインジェクション

セキュリティの脅威
アプリケーションがユーザー入力を SQL ステートメントに結合し、実行のためにデータベースに送信すると、SQL インジェクションの脅威が発生します。ユーザーの入力も SQL ステートメントの一部であるため、攻撃者はこの制御可能なコンテンツを使用して、独自に定義したステートメントを挿入し、SQL ステートメントの実行ロジックを変更し、必要な命令をデータベースに実行させることができます。攻撃者は、一部の SQL ステートメントを制御することで、データベース内の必要なデータをクエリし、データベースの特性を利用して、データベース サーバーのシステム権限を直接取得できます。本来、SQL インジェクション攻撃では、攻撃者が SQL ステートメントを十分に理解している必要があるため、攻撃者のスキルには一定の要件があります。しかし、数年前、SQL インジェクション悪用ツールが多数登場し、攻撃者がマウスを数回クリックするだけで攻撃効果を得ることができるようになり、SQL インジェクションの脅威が大幅に増大しました。

SQL インジェクション攻撃の一般的な手順:
1. 攻撃者は、SQL インジェクションの脆弱性のあるサイトにアクセスし、インジェクション ポイントを探します。
2. 攻撃者は、インジェクション ステートメントを構築し、そのインジェクション ステートメントを SQL ステートメントと結合します。プログラム内で新しい SQL ステートメントを生成します
3. 新しい SQL ステートメントが処理のためにデータベースに送信されます
4. データベースが新しい SQL ステートメントを実行し、SQL インジェクション攻撃をトリガーします



コード例
入力チェックが不十分な場合、SQL ステートメントはステートメントの一部としてユーザーによって送信された不正なデータを実行します。
例:

コードをコピー コードは次のとおりです:

$id=$_GET['id'];
$name=$_GET['name'];
$sql ="select * from news where `id`=$id and `username`='$name' ";
?>

解決策
a) セキュリティ設定とエンコード方法、PHP 設定オプションは、 php.iniファイルを指定します。次の構成方法により、PHP のセキュリティを強化し、SQL インジェクション攻撃からアプリケーションを保護できます。
1)safe_mode=onPHP は、現在のスクリプトの所有者がファイル関数またはそのディレクトリを通じて操作されるファイルの所有者と一致するかどうかを確認します。現在のスクリプトの所有者がファイル操作の所有者と一致しない場合は、これは不正な操作です
2) magic_quotes_gpc=on / off、このオプションがアクティブ化されている場合、リクエストパラメータに含まれる一重引用符、二重引用符、バックスラッシュ、およびヌル文字はバックスラッシュで自動的にエスケープされます。
3) magic_quotes_sybase=on/off、オプションが無効な場合、PHP はすべての一重引用符を一重引用符でエスケープします。
数値変数を確認します
$id=(int)$id;
注: PHP6 では魔法の引用符オプションが削除されました

b) 前処理を使用して SQL ステートメントを実行し、SQL ステートメントで渡されたすべての変数をバインドします。このように、ユーザーが接続した変数の内容がどのようなものであっても、置換記号「?」に置き換えられた値とみなされ、データベースは接続されたデータを解析しません。悪意のあるユーザーを SQL ステートメントの一部として使用します。例:

コードをコピー コードは次のとおりです:
$stmt = mysqli_stmt_init($link);
if (mysqli_stmt_prepare($stmt, 'SELECT District FROM City WHERE Name=?'))
{
/* マーカーのパラメーターをバインド */
mysqli_stmt_bind_param($stmt, "s", $city);
/* クエリを実行 */
mysqli_stmt_execute($stmt);
/* 結果変数をバインド */
mysqli_stmt_bind_result($stmt , $district );
/* 値を取得 */
mysqli_stmt_fetch($stmt);
mysqli_stmt_close($stmt);
}
/* 接続を閉じる */
mysqli_close($link);


ファイルアップロードの脅威 (ファイルアップロード)
セキュリティの脅威

PHP ファイルアップロードの脆弱性は、主にファイルタイプを検証する際にファイル変数を処理しないことによって引き起こされる攻撃にあり、プログラムの判定ロジックがバイパスされ、攻撃者はスクリプトファイルをアップロードします。サーバーによって解析され、SHELL が取得されたり、アップロード時にファイルが勝手にコピーされたり、スクリプト型トロイの木馬が Web サーバーにアップロードされ、Web サーバーを直接制御したりすることもあります。
コードサンプル

ユーザーのファイルアップロードリクエストを処理するコード このコードは、ファイル拡張子をフィルターしません。

コードをコピーします
コードは次のとおりです:

// oldUpload.php
if(isset($upload) && $myfile != "none“ && check($myfile_name)) {
copy($myfile, "/var/www/upload/".$myfile_name);
echo "文件".$file_name."上传成功!点击
继续上传";
exit;
}
//checkUpload.php
$DeniedExtensions =配列('html','htm','php','php2','php3','php4','php5','ph
tml','pwml','inc','asp','aspx' ,'ascx','jsp','cfm','cfc','pl','bat','exe','
com','dll','vbs','js','reg', 'cgi','htaccess','asis') ;
if($checkUpload($_FILE['myfile'][name], $DeniedExtensions)){copy($_FILE['myfile'][tmp_name],'upload /'.$_FILE['myfile'][name]);
}
?>>

gt;


上传文件:
< ;input type="file" name=“myfile” size="30"> 
 
 
 
 

解決策
ユーザー上で送信されたファイルを処理します。以下の検査:
(1) 検査後の名前が白名に適合するかどうか。
(2) 、保存在サーバー上。
(3) 上転送目録文件実行不可
(4) 注意%00 中止
(5) jpg 文件については、文件内容を读取する必要があり、その後新しい jpg 件文を生成して保存を実行します
クロスサイト リクエスト フォージェリ ( CSRF)

Cross-Cross-Site Request Forgery(csrf)、伪造跨站请求。。在在浏览、利用利用(例如img的src)、强迫强迫受害者的web应用プログラムは、ユーザ情報を変更する要求を送信する。CSRF攻撃の発生後、攻撃者はユーザにサーバへの要求を送信することを要求し、その結果、ユーザ情報が強制的に変更され、より多くのCSRF攻撃が局内から開始される可能性がある。局内からCSRF攻撃を開始するには、「自画像」機能などの、網局自体のトラフィックを利用する必要があり、ユーザが自分の画像URLを指定することは、他のユーザが登録している場合に、ユーザ情報の変更の接続である。
局の外部から要求を送信するには、ユーザーが自分のサーバー上で、個人情報を修正するための htm ページを自動で公開し、そのページを受信者ユーザー、受信者に送信する必要があります。ユーザが起動すると、要求が発行されます。

ユーザがネットワーク管理後台の特定の機能の URL を知ることができる場合、管理者を直接攻撃して、管理者に設定された操作の実行を強制することができます。ないCSRF 安全防御の代コード如下:
复制代
代コード如下:


$user=checkSQL($user);
$pass=checkSQL($pass);
$sql=”update UserTB set password=$user Where user=$pass”;mysqli_stmt_execute($sql);
?>

代码中受信用户取引のパラメータ“user,pass”、その後、受信後にこのユーザーのデータが変更されます 転送テーブルコード:
構造コード

フォーマットは次のように:







ユーザーが送信をクリックすると、変更操作がトリガーされます。
攻撃例
「コード例」のコードが xxx.com の Web アプリケーションである場合、悪意のあるユーザーは 2 つの HTML ページを構築して、xxx​​.com にログインしているユーザーを攻撃することができます。
(1) ページa.htm、iframe b.htmで、幅と高さを両方とも0に設定します。
コードをコピーします コードは次のとおりです: