ホームページ バックエンド開発 PHPチュートリアル php xfocus アンチインジェクション情報_PHP チュートリアル

php xfocus アンチインジェクション情報_PHP チュートリアル

Jul 21, 2016 pm 03:52 PM
php テクノロジー 比較する 注射 単純 材料

ここでは深い技術的な内容はありません。簡単に説明しただけです。 (特に指示がない場合、以下の操作はすべてPHP+MySQL+Apacheの状況に基づいています) さまざまなハッカーが蔓延する今、自分のPHPコードの安全性をどのように実現し、プログラムやサーバーの安全性を確保するかは非常に重要な問題です。私は何気なく PHP のセキュリティに関する情報を調べましたが、あまり多くはなく、少なくとも ASP よりもはるかに少ない (笑) ので、これらの起こり得る状況を防ぐために何かを書きたいと思いました。ここでは深い技術的な内容はありません。簡単に説明しただけです。 (特に指示がない場合、以下の操作はすべて PHP+MySQL+Apache に基づいています)
まずセキュリティの問題について話しましょう:
http://www.xfocus.net/articles /200107 /227.html
http://www.xfocus.net/articles/200107/228.html

上記の記事は、Security Focus の PHP セキュリティに関する記事であり、基本的には PHP に関するいくつかのセキュリティ問題を包括的に紹介しています。方法。 。

PHP でコーディングする場合、いくつかの基本的なセキュリティの問題を考慮する場合、まず次のことを行います:
1. 変数を初期化します

なぜそう言えるのでしょうか?次のコードを見てみましょう:
if ($admin)
{
echo 'ログインに成功しました! ';
include('admin.php');
}
else
{
echo 'あなたは管理者ではないため、管理できません。 ';
}

さて、上記のコードは正常に実行されているようで、問題はありません。次に、不正なパラメータを送信してみましょう。たとえば、私たちのページが http://www.traget.com/login.php である場合、次のように送信します: http://www.target.com/login.php?admin=1、はは、考えてみてください。あなたが直接管理者であるか、直接管理します。
もちろん、おそらくそのような単純な間違いは犯さないでしょうし、いくつかの非常に秘密のエラーもこの問題を引き起こす可能性があります。たとえば、最近公開された phpwind 1.3.6 フォーラムには、直接攻撃できる脆弱性があります。管理者権限を取得します。初期化されていない $skin 変数があるため、後で一連の問題が発生します。

それでは、上記の問題を回避するにはどうすればよいでしょうか?まず、php.ini から始めて、php.ini で register_global = off を設定します。これは、登録されているすべての変数がグローバルであるわけではないことを意味するため、これを回避できます。ただし、私たちはサーバー管理者ではないので、コードを改善することしかできません。では、上記のコードをどのように改善すればよいでしょうか。これを次のように書き換えます:
$admin = 0; // 変数を初期化します
if ($_POST['admin_user'] && $_POST['admin_pass'])
{
// 送信された管理者のユーザー名とパスワードが正しいかどうかを判断します対応する処理コード
//...
$admin = 1;
}
else
{
$admin = 0;
}

if ($admin)
{
echo 'ログイン成功! ';
include('admin.php');
}
else
{
echo 'あなたは管理者ではないため、管理できません。 ';
}

次に、最初に変数を $admin = 0 に初期化しているため、この時点で http://www.target.com/login.php?admin=1 を送信しても機能しません。この脆弱性を利用して管理者権限を取得することはできません。


2. SQL インジェクション (SQL インジェクション) を防ぐ

SQL インジェクションは、基本的に過去 2 年間で中国で普及したテクノロジーである asp から php までを含め、現時点で最も有害なプログラムであるはずです。フィルタリングされていない変数を注入ポイントから送信すると、悪意のあるユーザーが SQL クエリ ステートメントを送信できるようになり、その結果、重要なデータが盗まれたり、データが失われたり破損したり、バックエンド管理に侵入されたりする可能性があります。
基本原則については説明しません。理解するために次の 2 つの記事を見てみましょう:
http://www.4ngel.net/article/36.htm
http://www.4ngel.net/ Article/ 30.htm

基本的なインジェクション侵入方法は理解できたので、どうすればそれを防ぐことができるでしょうか?コードから始めましょう。

Web 上でデータを送信するには 2 つの方法があることはわかっています。1 つは get で、もう 1 つは post です。そのため、一般的な SQL インジェクションの多くは get メソッドから始まり、インジェクション ステートメントにはいくつかの SQL ステートメントが含まれている必要があります。 SQL ステートメントでは、どのように進めればよいでしょうか。select、update、delete、insert という 4 つの主要な SQL ステートメントがあるので、送信するデータをフィルタリングすれば、これらの問題を回避できるでしょうか。
そこで、正規表現を使用して次の関数を構築します:

/*
関数名: inject_check()
関数関数: 送信された値に SQL インジェクション文字が含まれているかどうかを検出し、インジェクションを防止し、サーバーのセキュリティを保護します
パラメーターの数: $ sql_str: 送信された変数 回 戻り値: テスト結果、ture または false に戻る
関数作成者: heyeluren
*/
Function inject_check ($ SQL_STR) {
Return EREGI ('Select | Insert | Update | DELE Te | '|/* | *|../|./|union|into|load_file|outfile', $sql_str); // フィルター
}

関数では、select、insert、update、delete、union、into、load_file、outfile / *、 ./ 、 ../ 、 ' およびその他の危険なパラメーター文字列がすべてフィルターで除外されると、送信されたパラメーターを制御できます。

if (inject_check($_GET['id']) )
{
exit('送信されたデータは不正です。確認して再送信してください!');
}
{
$id = $_GET['id']
echo '送信されたデータは合法です。続く! ';
}
?>
URL を http://www.target.com/a.php?id=1 として送信すると、次のメッセージが表示されます。
「送信されたデータは合法です。続行してください。」 "
http://www.target.com/a.php?id=1' select * from tb_name を送信すると、次のプロンプトが表示されます: 「送信したデータは違法です。確認して再送信してください。」

次に私たちの要望に応えることができました。

ただし、問題はまだ解決されていません。 http://www.target.com/a.php?id=1asdfasdfasdf を送信すると、上記のルールには準拠しますが、要件を満たしません。そこで、他の状況をチェックする関数を構築します:

/*
関数名: verify_id()
Function 関数: 送信された ID クラス値が正当かどうかを検証する
パラメータ: $id: 送信された ID 値
戻り値: を返す処理ID
関数作成者: heiyeluren
*/
function verify_id($id=null)
{
if (!$id) { exit('パラメータが送信されていません!') } // 空かどうかの判定
elseif (inject_check($id)) { exit('提出されたパラメータが不正です!') } // インジェクションの判定
elseif (!is_numeric($id)) { exit('提出されたパラメータが不正です! ');数値判定
$id = intval($id); // 整数化

return $id;

ははは、それなら検証できるので上記を実行します プログラムコードは次のようになります:

if (inject_check ($_GET['id']))
{
exit('送信したデータは不正です。確認して再送信してください!')
}
else
{
$id = verify_id($_GET['id'] ); // フィルター関数はここで引用されています $id
echo '送信されたデータは合法です、続行してください! ';
}
?>

さて、問題はここで解決されたようですが、郵送で送信されたデータ、つまり大量のデータについては考慮しましたか?
たとえば、「 _ 」、「 % 」などの一部の文字はデータベースに害を及ぼす可能性があります。これらの文字は特別な意味を持っているため、これらを制御するとどうなるでしょうか?もう 1 つのポイントは、php.ini で magic_quotes_gpc = off の場合、データベース ルールに準拠していない送信されたデータの前に ' ' が自動的に追加されないことです。そこで、これらの問題を制御する必要があるため、次の関数を構築します。
/*
関数名: str_check()
関数関数: 送信された文字列をフィルタリングする
パラメータ: $var: 処理する文字列
戻り値: フィルタリングされた文字列を返す
関数作成者:heiyeluren
*/
function str_check( $ str )
{
if (!get_magic_quotes_gpc()) // magic_quotes_gpc が開いているかどうかを判断します
{
$str = addlashes($str); // フィルター
}
$str = str_replace("_", "_", $str); // '_' を除外します $str = str_replace("%", "%", $str); // '%' を除外します

return $str;サーバーが侵害される危険を再び回避しました。

最後に、投稿や記事やニュースの作成など、大量のデータを送信することを検討します。上記の関数に基づいて、次の関数を構築します。関数名: post_check()
関数関数: 送信された編集コンテンツを処理する
パラメータ: $post: 送信されるコンテンツ
戻り値: $post: フィルターされたコンテンツを返す
関数作成者: heiyeluren
*/UFunction Post_check ($ Post) {
IF (! Get_magic_quotes_gpc ()) // Magic_quotes_gpc が開いているかどうかを判断します {
$ Post = addedlashes ($ Post); // Mag IC_QUOTES_GPC が開いていません
}
$post = str_replace("_", "_") , $post); // '_' を除外します $post = str_replace("%", "%", $post) // '_' を除外します ' % ' 除外します
$post = nl2br($ post); // キャリッジリターン変換
$post= htmlspecialchars($post); // HTML タグ変換

return $post;

笑、基本的には、いくつかの状況について話しました。少なくとも 2 つの側面についてはほとんど話していないので、セキュリティ構成や Apache セキュリティなどについては次回詳しく話す予定です。私たちのセキュリティを全体として最も安全なものにしましょう。

最後に、私が上で表現したことをお話ししましょう: 1. 変数を初期化します 2. 変数をフィルターすることを忘れないでください




http://www.bkjia.com/PHPjc/319026.html

www.bkjia.com

tru​​e

http://www.bkjia.com/PHPjc/319026.html

ここでは深い技術的な内容はありません。簡単に説明しただけです。 (特に説明がない場合、以下の動作は全てPHP+MySQL+Apacheベースです) 様々なハッカーが蔓延する今、...
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

CakePHP の日付と時刻 CakePHP の日付と時刻 Sep 10, 2024 pm 05:27 PM

Cakephp4 で日付と時刻を操作するには、利用可能な FrozenTime クラスを利用します。

CakePHP ファイルのアップロード CakePHP ファイルのアップロード Sep 10, 2024 pm 05:27 PM

ファイルのアップロードを行うには、フォーム ヘルパーを使用します。ここではファイルアップロードの例を示します。

CakePHP について話し合う CakePHP について話し合う Sep 10, 2024 pm 05:28 PM

CakePHP は、PHP 用のオープンソース フレームワークです。これは、アプリケーションの開発、展開、保守をより簡単にすることを目的としています。 CakePHP は、強力かつ理解しやすい MVC のようなアーキテクチャに基づいています。モデル、ビュー、コントローラー

CakePHP バリデータの作成 CakePHP バリデータの作成 Sep 10, 2024 pm 05:26 PM

Validator は、コントローラーに次の 2 行を追加することで作成できます。

CakePHP のロギング CakePHP のロギング Sep 10, 2024 pm 05:26 PM

CakePHP へのログインは非常に簡単な作業です。使用する関数は 1 つだけです。 cronjob などのバックグラウンド プロセスのエラー、例外、ユーザー アクティビティ、ユーザーが実行したアクションをログに記録できます。 CakePHP でのデータのログ記録は簡単です。 log()関数が提供されています

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

CakePHP クイックガイド CakePHP クイックガイド Sep 10, 2024 pm 05:27 PM

CakePHP はオープンソースの MVC フレームワークです。これにより、アプリケーションの開発、展開、保守がはるかに簡単になります。 CakePHP には、最も一般的なタスクの過負荷を軽減するためのライブラリが多数あります。

See all articles