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

黄舟
リリース: 2016-12-14 11:49:50
オリジナル
1052 人が閲覧しました

ここでは深い技術的な内容はありません。簡単に説明しただけです。 (特に指示がない場合、以下の動作はすべて PHP+MySQL+Apache ベースです) さまざまなハッカーが蔓延する現在、自分の PHP コードのセキュリティをどのように実現し、プログラムやサーバーのセキュリティを確保するかは非常に重要です。重要な問題です。PHP のセキュリティに関する情報を調べたところ、少なくとも ASP よりもはるかに少ない (笑) ので、これらの起こり得る状況を防ぐために何かを書きたいと思いました。ここでは深い技術的な内容はありません。簡単に説明しただけです。 (特に説明がない場合、以下の操作はすべて PHP+MySQL+Apache の状況に基づいています)
最初にセキュリティの問題について話しましょう 上記の記事は、基本的にセキュリティに焦点を当てた PHP のセキュリティに関する記事です。 PHP に関する秘密の質問を包括的に説明します。

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

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

さて、上記のコードは正常に実行されているようですが、問題はありません。次に、不正なパラメータを送信してみましょう。考えてみてください、私たちは直接管理者であり、彼らを直接管理しているのでしょうか?
もちろん、おそらくそのような単純な間違いは犯さないでしょうし、いくつかの非常に秘密のエラーもこの問題を引き起こす可能性があります。たとえば、最近公開された 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 に初期化しているため、この脆弱性を利用して管理者権限を取得することはできません。


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

SQL インジェクションは、基本的に過去 2 年間で中国で普及したテクノロジーである asp から php までを含め、現時点で最も有害なプログラムであるはずです。フィルタリングされていない変数が注入ポイントを形成し、悪意のあるユーザーが SQL クエリ ステートメントを送信できるようになり、その結果、重要なデータが盗まれたり、データが失われたり破損したり、バックエンド管理に侵入されたりする可能性があります。
注射侵入の基本的な方法は理解できたので、どうすればそれを防ぐことができるでしょうか?コードから始めましょう。

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

/*
関数名: 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 '送信されたデータは合法です、続行してください。 ';
}
?>
私たちは上記のルールに準拠していますが、要件を満たしていないため、他の状況を考慮してチェックする関数を作成します:

/*
関数名: 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']); // ここでフィルター関数が引用されています , filter $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;
}

OK,サーバーが侵害される危険を再び回避しました。

最後に、投稿や記事やニュースの作成など、大量のデータを送信することを検討します。上記の関数に基づいて、次の関数を構築します。関数名: post_check()

関数関数: 送信された編集コンテンツを処理する

パラメータ: $post: 送信されるコンテンツ
戻り値: $post: フィルタリングされたコンテンツを返す
関数作成者: 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 タグの変換
}

笑、基本的には、いくつかの状況について説明しました。少なくとも 2 つの側面についてしか話していないように感じます。次回は、PHP のセキュリティ構成や Apache のセキュリティなどについてさらに話すことを検討します。 .、私たちのセキュリティを全体として最も安全なものにしましょう。

最後に、上記の内容を説明します: 1. 変数を初期化する 2. 必ず変数をフィルターすることを忘れないでください

読んでいただきありがとうございます。さらに関連するコンテンツを取得したい場合は、PHP に注意してください。中国語のウェブサイト (www.php.cn)!

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!