php xfocus予防注入資料


ここにはあまり深い技術が含まれていません。簡単に話しました。以下の操作は具体的に言わないと 全部PHP+MySQL+Apacheによる場合です。 現在、各種のハッカーが横行している時、どのように自分のphpコードの安全を実現しますか? 多くて、少なくともaspより少なくなって、ほほほ、そこでものを書きたくて、これらの出現するかもしれない情況を防止しにきます。ここにはあまり深い技術が含まれていません。簡単に話しました。以下の操作は具体的に言わないと 全部PHP+MySQL+Apacheによる場合です。      まず安全問題について話します。まず二つの文章を見ます。http://www.xfocus.net/articles/200107/227.html      http://www.xfocus.net/articles/200107/228.html     上の文章は安全焦点の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.1.6フォーラムには、管理者権限を直接取得するための脆弱性があります。これは、skin変数が初期化されていないため、次の一連の問題を引き起こしています。    私たちはどうやって上記の問題を避けますか?まず、php.iniから始めて、php.iniの中のregisterをglobal = offは、すべての登録変数が大域的ではないので、回避できます。しかし、私たちはサーバー管理者ではなく、コードからしか改善できません。上のコードはどう改善しますか?私たちは書き直しました 下:$admin = 0;      // 初期化変数if ($_POST['admin_user && $_POST['admin_パス){    // 提出した管理者のユーザ名とパスワードが正しい処理コードかどうかを判断します。    // ...     $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防止 Injection (sql注射)    SQL 注射は今のところプログラムで一番大きな被害があります。aspからphpまでを含めて、基本的には国内でこの二年間流行している技術です。基本的な原理は変数を提出するフィルタリングしないで注入点を形成してから、悪意のあるユーザーにsqlクエリ文を提出して、データが盗まれたり、破損されたり、バックグラウンド管理に侵入されたりします。基本原理は言いません。次の二つの文章を見れば分かります。http://www.4ngel.net/article/36.htm http://www.4ngel.net/article/30.htm     基本的な注射の侵入方法を知った以上、私達はどうやって予防しますか?これはコードから始めるべきです。    私達はWeb上でデータを提出するには2つの方法があることを知っています。一つはget、一つはpostで、多くの一般的なsql注射はget方式から始まります。そして注射の文には必ずsql文が含まれています。sql文がないので、どうやって進めばいいですか?    プロジェクト 、udate、delete、insertは私達が提出したデータの中でフィルタリングすればこれらの問題を回避できますか?    そこで正則を使って、次の関数を構築しました。check()関数の役割:提出された値にSQL注射の文字が含まれているかどうかを検出し、注射を防止し、サーバーの安全を守る。        数:$sql_str: 送信した変数の戻り 戻る 値:検出結果を返します。ture or false関数著者:heiyeluren*/function inject.check($sql*)str){     return eregi('select𞓜inset𞓜udate𞓜delete𞓜/124124124;𞓜*.///𞓜|.n.////𞓜inion|into|load_fileグループ、 $sqlstr    // フィルタをかける    私たちは関数で select、insert、udate、delete、 ユニオン イント、 ロード.file out file /*, ./ , ../ , ' などの危険なパラメータ文字列を全部フィルタしていけば、提出したパラメータをコントロールできます。プログラムはこのように構築できます。if (inject.check($u)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' プロジェクト * from tb_name    あなたが提出したデータは不法です。確認して再提出してください。    じゃ、私たちの要求に達しました。    しかし、問題はまだ解決されていません。もし私達が提出したのは http://www.target.com/a.php?id=1asdfasdfasdf これは上の規則に合っています。でも、これは要求に合わないです。そこで、他の状況があり得るように、もう一つの関数を構築して検査します。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($u)GET['id']){     exit('あなたが提出したデータは不正です。確認して再提出してください!');else{    $id。 = verify_id($u)GET['id'])    // ここでは私たちのフィルタ関数を引用して、ドルidをフィルタリングします。    echo '提出したデータは合法的です。続けてください。';?'    はい、問題はここまで解決されたようですが、ポストが提出したデータ、大量のデータを考慮したことがありますか?    たとえば、いくつかの文字がデータベースに害を与える可能性があります。 ' _ ', ' % ',これらのキャラクターは特殊な意味を持っていますが、私たちがコントロールすればいいですか?もう一つは、私たちのphp.iniの中のmagic_です。quot tesgpc = オフ 提出されたデータベース規則に合わないデータは自動的に前に追加されません。 'これらの問題をコントロールし、次の関数を構築します。check()関数の役割:提出した文字列をフィルタリングします。    数:$var: 処理する文字列を返します。 戻る 値:フィルタを返した文字列関数の著者:heiyeluren*/function strチェック( $str ) {    if (!ゲットするmagic_quot tesgpc()    // magic_を判断するquot tesgpcは開いていますか   {       $str = addslashes($str)    // フィルタをかける     $str = strreplace(「u」) "_", $str    // 握り '_'濾過して落とす     $str = strreplace(%) "%", $str    // 柄 % '濾過して落とす   return $str  } OKです。またサーバーが陥落する危険を回避しました。    最後に、大量のデータを提出する場合を考えます。例えば、貼り付け、または文章、ニュースを書く場合、私達はいくつかの関数が必要です。フィルタリングと変換をしてくれます。上の関数に基づいて、下記の関数を構築します。check()関数作用:提出した編集内容を処理します。    数:$post: 提出する内容は返却します。 戻る 値:$post: フィルタの内容関数を返します。 post_check($post){   if (!ゲットするmagic_quot tesgpc()    // magic_を判断するquot tesgpcは開くかどうか   {       $ベスト = addslashes($post)    // magic_を行うquot tesgpcが開いていない場合は、提出データのフィルタリングを行います。   }    $ベスト = strreplace(「u」) "_", $ベスト    // 握り '_'濾過して落とす   $ベスト = strreplace(%) "%", $ベスト    // 柄 % '濾過して落とす   $ベスト = nl 2 br($post)    // 車の切り替え   $post= httmlspecialchars($post);    // htmlタグ変換   return $post;    へへへ、基本的にここに来て、私達はいくつかの情況をすべて一回言いました。実は自分の言ったことはまだ少ないと思います。少なくとも二つの方面だけを話しました。安全の中では少ない内容です。今度はもっと多いことを考えて、php安全配置、apache安全などを含めて、私達の安全を一番安全にします。    最後に上の表現を教えてあげます。 あなたの変数を初期化します。  2. あなたの変数をフィルタすることを必ず覚えてください。