ホームページ php教程 php手册 php xfocusのアンチインジェクション情報

php xfocusのアンチインジェクション情報

Jun 13, 2016 pm 12:28 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 'あなたは管理者ではないため、管理できません。 ';
}

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


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 ステートメントがないので、どうすればよいでしょうか? SQL ステートメントには、
select、update、delete、insert という 4 つの主要な文があります。では、送信するデータをフィルタリングすれば、これらの問題を回避できるでしょうか。
そこで、正規表現を使用して次の関数を構築します。

/*
関数名: inject_check()
関数 function: 送信された値に、注入を防ぐための SQL インジェクション文字が含まれているかどうかを検出します。サーバーのセキュリティを保護します
パラメータ: $sql_str: 送信された変数
戻り値: 検出結果、true または false を返します
関数作成者: heiyeluren
*/
function inject_check($sql_str)
{
return eregi('select|insert|update|delete|'|/*|*|../|./|union|into|load_file|outfile', $sql_str); // フィルター


この関数は、select、insert、update、delete、union、into、load_file、outfile /*、./、../、' などの危険なパラメータ文字列をすべてフィルタリングして、制御できるようになります。送信されたパラメータは次のように構築できます:

if (inject_check($_GET['id']))
{
exit('送信したデータは不正です。確認してください。 ');
}
else
$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('Submit パラメータが不正です! ') ; } // インジェクション判定
elseif (!is_numeric($id)) { exit('送信されたパラメータが不正です!') } // 数値判定
$id = intval($ id); Integer

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: 処理対象の文字列
Return 戻り値: フィルタリングされた文字列を返します
関数作成者: heiyeluren
*/
function str_check( $str )
{
if (!get_magic_quotes_gpc()) // magic_quotes_gpc がオンになっているかどうかを判断します
{
$str = addedlashes($str); // フィルター
}
$str = str_replace("_", "_", $str); // '_' フィルターを除外します
$str = str_replace("%", "%", $str); // '%' を除外します

return $str;
}

さて、またしても危険は回避できました。サーバーが侵害されています。

最後に、投稿や記事やニュースの作成など、大量のデータを送信することを検討します。上記の関数に基づいて、次の関数を構築します。 🎜>
/*
関数名: post_check()
関数機能: 送信された編集コンテンツの処理
パラメータ: $post: 送信されるコンテンツ
戻り値: $post: フィルタリングされた戻り値content
関数作成者: heiyeluren
*/
function post_check($post)
{
if (!get_magic_quotes_gpc()) // magic_quotes_gpc を開くかどうかを決定します
{
$post = addlashes($post); // magic_quotes_gpc が開かれていない場合に送信されたデータをフィルタリングします
}
$post = str_replace("_", "_" , $post); // '_ をフィルタリングします。 '
$post = str_replace("%", "%", $post); // '%' を除外します
$post = nl2br($ post) // 変換を入力します
$post= htmlspecialchars($post); // HTML タグの変換

return $post;

はは、基本的にはそれだけです。実際、いくつかの状況について話しました。少なくとも 2 つの側面についてしか話していないので、セキュリティ構成や Apache セキュリティなどについては次回詳しく話す予定です。私たちのセキュリティは全体として最も安全なものになります。

最後に、上で述べたことをお話しします。 1. 変数を初期化します。 2. 変数をフィルターすることを忘れないでください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の 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 にアップグレードする方法について説明します。

今まで知らなかったことを後悔している 7 つの PHP 関数 今まで知らなかったことを後悔している 7 つの PHP 関数 Nov 13, 2024 am 09:42 AM

あなたが経験豊富な PHP 開発者であれば、すでにそこにいて、すでにそれを行っていると感じているかもしれません。あなたは、運用を達成するために、かなりの数のアプリケーションを開発し、数百万行のコードをデバッグし、大量のスクリプトを微調整してきました。

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 は、

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

PHPでHTML/XMLを解析および処理するにはどうすればよいですか? PHPでHTML/XMLを解析および処理するにはどうすればよいですか? Feb 07, 2025 am 11:57 AM

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

母音を文字列にカウントするPHPプログラム 母音を文字列にカウントするPHPプログラム Feb 07, 2025 pm 12:12 PM

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

PHPでの後期静的結合を説明します(静的::)。 PHPでの後期静的結合を説明します(静的::)。 Apr 03, 2025 am 12:04 AM

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? Apr 03, 2025 am 12:03 AM

PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。

See all articles