ホームページ >バックエンド開発 >PHPチュートリアル >php xfocus アンチインジェクション情報_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
true
http://www.bkjia.com/PHPjc/319026.html