ここでは深い技術的な内容はありません。簡単に説明しただけです。 (特に指示がない場合、以下の操作はすべて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 ステートメントが含まれている必要があります。 SQL ステートメントには、select、update、delete、insert という 4 つの主要な文があります。では、送信するデータをフィルタリングすれば、これらの問題を回避できるでしょうか。
そこで、正規表現を使用して次の関数を構築します:
/*
関数名: inject_check()
関数関数: 送信された値に SQL インジェクション文字が含まれているかどうかを検出し、インジェクションを防止し、サーバーのセキュリティを保護します
パラメータ: $sql_str: 送信変数戻り値: テスト結果を返します (ture または false)
関数作成者: heiyeluren
*/
Function inject_check ($ SQL_STR) {
Return EREGI ('Select | UPDATE | DEELETE | '|/*|* |../| ./|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()
関数関数: 送信された 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()
Function 関数: 送信された編集コンテンツを処理する
パラメータ: $post: 送信されるコンテンツ
戻り値: $post: フィルターされたコンテンツを返す
関数作成者: heiyeluren
*/
function post_check($post)
{
if (!get_magic_quotes_gpc()) // magic_quotes_gpc が開いているかどうかを判断します
{
$post =addslashes($post) // magic_quotes_gpc が開いていない場合は送信されたデータをフィルターします
}
$post = str_replace("_", "_", $post); // '_' をフィルタリングします
$post = str_replace("%", "%", $post) // ' % ' をフィルタリングします
$post = nl2br($post); ); // 変換を入力します
$post= htmlspecialchars($post); // HTML タグの変換
return $post;
笑、基本的には、一度説明したとおりです。少なくとも 2 つの側面についてしか話していないので、セキュリティ全体についてはほとんど内容がありません。次回は、PHP のセキュリティ構成や Apache の安全性などについてさらに話すことを検討します。全体として最も安全です。
最後に、私が上で表現したことをお話ししましょう: 1. 変数を初期化します 2. 変数をフィルターすることを忘れないでください
上記では、フォーカス マジックのコンテンツを含む、フォーカス マジック php xfocus のアンチインジェクション情報を紹介しています。PHP チュートリアルに興味のある友人に役立つことを願っています。