ここでは深い技術的な内容はありません。簡単に説明しただけです。 (特に指示がない場合、以降の動作はすべて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. 変数をフィルターすることを忘れないでください。