ホームページ >バックエンド開発 >PHPチュートリアル >[転送] php Web セキュリティに関する簡単な説明、phpweb_PHP チュートリアルに関する簡単な説明

[転送] php Web セキュリティに関する簡単な説明、phpweb_PHP チュートリアルに関する簡単な説明

WBOY
WBOYオリジナル
2016-07-13 10:20:49959ブラウズ

[再投稿] php Webセキュリティに関する簡単な議論、phpwebに関する簡単な議論

元のアドレス: http://blogread.cn/it/article/6086?f=wb

はがき:

まず第一に、Notes は Web セキュリティの専門家ではないため、これは Web セキュリティに関する専門家レベルの記事ではなく、メモの研究と記事の慎重な要約であり、その中には私たち PHPer が理解できる内容がいくつかあります。簡単に発見できない、または注意を払わない。なので、後で簡単に参照できるように書き留めておきました。大企業には専任の Web セキュリティ テスターが必要であり、セキュリティは PHPer の考慮範囲ではありません。しかし、PHPerとしてのセキュリティの知識は、「そういうものがあるのは知っているので、プログラミングする際には自然と気を配るようになります」です。何か間違いや誤りがある場合は、chen_bin_wen@163.com/445235728@qq.com

までご連絡ください。

概要:

1. php のいくつかのセキュリティ設定

(1) PHPのエラープロンプト機能をオフにする

(2) いくつかの「悪い機能」をオフにする

(3) ファイルのアクセス許可を厳密に設定します。

2. 厳格なデータ検証、すべてのユーザーが「善良な」人であるわけではありません

2.1 プログラムのセキュリティと堅牢性を確保するために、データ検証にはコンテンツが含まれている必要があります。

2.2 プログラマーは、注意が必要な点や事柄を見落としがちです

3. 抗注射

3.1 インジェクション脆弱性の有無とその原理を簡単に判断する

3.2 一般的な mysql インジェクション ステートメント

(1) ユーザー名とパスワードは必要ありません

(2) パスワードを入力せずにユーザーを悪用する

(3) ユーザーのパスワードを推測します

(4) データ挿入時の権限の昇格

(5) 更新権限昇格と挿入権限昇格も同様です

(6)悪意のある更新と削除

(7)結合、参加など

(8) ワイルドカード記号 %、_

(9) SQLに注入される推測されたテーブル情報も多数あります

33 注射を防ぐいくつかの方法

2.3.1 PHP がインジェクションを防ぐために使用できるいくつかの関数と注意事項。

2.3.2 アンチインジェクションキャラクターの優先順位。

2.3.3 アンチインジェクションコード

(1) パラメータが数値の場合は、intval() 関数を直接使用します

(2) 非テキストパラメータのフィルタリング

(3) テキストデータはコードインジェクションを防ぎます。

(4) もちろん、addslashes と mysql_escape_string を組み合わせた他のコードもあります。

4. xss 攻撃を防ぐ

4.1Xss攻撃プロセス

4.2 一般的な xss 攻撃場所

4.3 XSS 対策方法

5.CSRF

5.1 CSRF原則の簡単な説明

5.2 予防方法

6. ホットリンク対策

7. CC攻撃を防ぐ

------------------------------------------------- ------------------

1phpいくつかのセキュリティ構成

(1)PHPエラープロンプト機能をオフにする

php.iniのdisplay_errorsを

に変更します
  1. 表示エラー = オフ

またはphpファイルの前に追加します

  1. エラー報告(0)

1) error_reporting(0) を使用する 失敗例:

ファイルコード:

  1. エラー報告(0);

  2. エコー555

  3. エコー 444

  4. ?>

エラー:

解析エラー: 解析エラー。E:webphp2.php の 4 行目で `','' または `';'' が予期されています

2) error_reporting(0) を使用する:

aファイルコード:

  1. エラー報告(0);

  2. include("b.php");
  3. ?>
  4. b ファイルコード:

  • エコー555
  • エコー 444
  • ?>
  • これは、error_reporting(0) の使用が機能しないと言っている PHP の多くです。最初の例では、A.php に致命的なエラーがあり、実行が妨げられています。サーバーが実行できない場合、サーバーはこの関数があることを認識していないため、同じエラーが報告されます。

    2番目の例では、a.phpが正常に実行された場合、サーバーはエラー抑制機能があることを認識しているため、b.phpにエラーがあっても抑制されます。

    追記

    : mysql エラーを抑制できません。

    (2)

    いくつかの「悪い機能」をオフにする

    1) マジッククオート機能をオフにする

    php.iniにmagic_quotes_gpc = OFFを設定します

    addslashes で繰り返しエスケープしないようにしてください

    2) register_globals = Off をオフにします

    php.iniに register_globals = OFF を入れます

    register_globals = ON の場合

    アドレス欄: http:www.phpben.com?bloger=benwin

  • //$bloger = $_GET['bloger'] // register_globals = ON なので、この手順は必要なく、$bloger を直接使用できます
  • エコー$ブロガー;
  • ?>
  • この状況により、一部の初期化されていない変数が簡単に変更されてしまい、致命的になる可能性があります。したがって、 register_globals = OFF にします

    (3) ファイルのアクセス許可を厳密に設定します。

    対応するフォルダーに権限を割り当てます。たとえば、アップロードされた画像を含むファイルには実行権限を与えることはできませんが、読み取りのみが可能です。

    2、厳格なデータ検証、すべてのユーザーが「善良な」人であるわけではありません

    著者と友人がデータ検証について話し合っていたとき、彼がこんなことを言ったのを覚えています。「すべてのユーザーのことをそんなに悪く考える必要はない!」しかし、私が言いたいのは、開発シナリオに現れるべきではないということです。1 億人のユーザーのうち 1 人が悪質なユーザーであっても、それは十分に致命的です。さらに、優秀なユーザーでもデータ入力に失敗することがあり、誤って中国語を入力してしまい、うっかり「悪者」になってしまいました。

    2.1 プログラムのセキュリティと堅牢性を確保するには、データ検証に以下を含める必要があります

    (1) キーデータが存在するかどうか。削除されたデータIDが存在する場合

    (2) データ型が正しいかどうか。削除されたデータIDが整数の場合

    (3) データ長。フィールドが char(10) 型の場合、データ長を決定するために strlen が必要です

    (4) データに危険な文字が含まれていないか

    データ検証 セキュリティ検証は機能が完成してからゆっくり書くことを主張する人もいますし、開発中に検証を書く人もいます。筆者は後者を好みます。私は両方を試しましたが、後者で書かれた検証は比較的堅牢であることがわかりました。主な理由は、最初の開発時に考えられたセキュリティの問題が、その後書くときに 2 つあるということです。 1 つは、PHPer がインジケーターを完成させることに熱心で、タスクを急いで完了することです。2 つ目は、いくつかの点を見逃しています。

    2.2プログラマは、注意が必要な点や事柄を見落としがちです:

    (1) データベースに入力されるデータは安全に検証される必要があります。著者が広州の会社の社内システムの開発に参加していたとき、$_POST データがクラス関数 classFunctionName($_POST) に直接渡されているのを見ました。理由は社内での使用であることが判明しました。はい、それほど厳密にする必要はありません。論理演算とデータ操作の結合の問題はさておき、判断を伴わない演算は致命的です。セキュリティ検証は必須であり、それを避ける理由はありません。

    (2) データベーステーブルのフィールド char(25) などのデータ長の問題。ほとんどの PHPer は、それが空かどうか、データ型が正しいかどうかを考慮しますが、文字長を無視するのは、判断するのが面倒なためです。長さ。 (これは初心者に多く見られ、筆者もかつてそう思ったことがあります)

    (3) フロントエンドはjsで判定・検証済みで、バックエンドは判定・検証する必要はないと思います。これは致命的でもあります。JS の判断は、ユーザー エクスペリエンスを向上させ、http リクエストを減らし、サーバーの負荷を軽減するためにのみ、数分しかかからないことを知っておく必要があります。もちろん「

    悪役」を防ぐことはできません。もちろん、正規のユーザーが js 検証の制御下で完璧であれば、しかし、phper としては、js 検証のみを行って別のセキュリティ検証を放棄することはできません。

    (4) 選択、チェックボックス、ラジオ、ボタンなどのフォームの一部の属性の検証が不足しています。開発者は、Web ページでこれらの属性の値と値の範囲 (ホワイトリスト値) を設定しています。一般に、正当なユーザーは選択する権利のみを持ち、変更できないため、バックエンドが処理と検証のためにデータを受け入れるときに、PHP はデータを検証しません。これは慣性です。と考えると、セキュリティの問題が発生します。悪役は、偽のフォームだけで十分に致命的です。

    (5) フォーム内の対応する要素の名前は、データ テーブルのフィールド名と一致しています。たとえば、ユーザー テーブルのユーザー名フィールドは us​​er_name であり、フォーム内のユーザー名入力ボックスも同様です。 user_name. これは暴力的なデータベースと何ら変わりません。

    (6) インジェクション防止などの危険文字のフィルタリングについては、以下で別途説明します。

    3、注射反対

    3.1インジェクション脆弱性の有無とその原理を簡単に判断します。

    Web サイト: http:www.phpben.com/benwin.php?id=1 は正常に実行され、次のような SQL ステートメントが実行されます: select * from phpben where id = 1

    (

    1) ウェブサイト: http:www.phpben.com/ benwin.php?id=1' 次のような SQL ステートメント: select * from phpben where id = 1' その後、例外が実行されます。これは、benwin を意味する可能性があります。 php ファイルに正しい ID がありません。値に対して「'」フィルタリングと intval() による整数変換を実行します。もちろん、「%」や「/*」などの他の文字も網羅的に処理できるかどうか知りたいです。同様の方法を使用してテストされました (多くのテスト ソフトウェアで使用されています)

    (

    2) ウェブサイト: http:www.phpben.com/ benwin.php?id=1 および 1=1 次に、SQL ステートメントは select * from phpben where id = 1 および 1=1 となります。これは正常に実行されます。 http:www.phpben.com/benwin.php?id=1 結果が同じ場合、benwin.php がスペース " " と "and" をフィルタリングできない可能性があることを意味します (ここでは可能です)。次のポイントを見てください)

    (

    3) ウェブサイト: http:www.phpben.com/ benwin.php?id=1 および 1=2 の場合、実行中の場合、SQL ステートメントは select * from phpben where id = 1 and 1=2 になります。結果が異常です。SQL を意味します。ステートメント内の「and 1=2」は機能するため、3 つの条件がすべて満たされる場合、benwin.php にインジェクションの脆弱性があることは確実です。

    追記: ここで確認するには get メソッドを使用します。上記のように値を入力するだけで、1 つずつ確認することもできます。

    これは表示します

    3.2一般的な mysqlインジェクションステートメント。

    (1) ユーザー名とパスワードは必要ありません

    1. //通常のステートメント

    2. $sql="select * from phpben where user_name='admin' and pwd ='123'";

    3. //ユーザー名ボックスに 'or'='or' または 'or 1='1 と入力すると、SQL は次のようになります

    4. $sql ="select * from phpben where user_name=' 'or'='or'' and pwd ='' ";

    5. $sql ="select * from phpben where user_name=' 'or 1='1' and pwd ='' ";

    これにより、パスワードを入力する必要がなくなります。ところで、ログインボックスを見ると、試してみたくなります。

    (2) パスワードを入力せずにユーザーを利用します。

    1. //通常のステートメント

    2. $sql="select * from phpben where user_name='$username' and pwd ='$pwd'";

    3. //使用されるユーザー名は benwin で、ユーザー名ボックスに benwin'# と入力します。パスワードはありてもなしでもかまいません。その場合、$sql は

      になります。
    4. $sql ="select * from phpben where user_name=' benwin'#' and pwd ='$pwd'";

    これは、mysql のアノテーションの 1 つが「#」であるためです。上記のステートメントの # には以下の内容がアノテーションされているため、パスワードは空白のままでも任意に入力しても問題ありません。インターネット上の一部の人々は、「/*」はアノテーションに使用されていると述べています。著者が言及したいのは、アノテーションが「*/」で開始されているだけで終了していない場合、MySQL はエラーを報告するが、それは報告しないということです。 「/**/"は記載できませんが、"を追加するのは困難です*/」 注の終わりに、mysql でも注記できる「--」もありますが、「--」の後に少なくとも 1 つのスペースがあり、それが「-」であることに注意してください。もちろん、アンチインジェクション コードは 3 つすべてを考慮する必要があります。 チェックしてみる価値があります。私が言及したいのは、 多くのアンチインジェクション コードは、アンチインジェクション スコープに「--」を取り入れていないということです。 。

    (3) ユーザーのパスワードを推測します

    1. //通常のステートメント

    2. $sql="select * from phpben.com where user_name='$username' and pwd ='$pwd'";

    3. //パスワード入力ボックスに「benwin' and left(pwd,1)='p'#」と入力すると、$sql は

    4. $sql ="select * from phpben.com where user_name=' benwin' and left(pwd,1)='p'#' and pwd ='$pwd'";

    正常に動作する場合、パスワードの最初の文字は p で、残りの文字も同様に推測します。

    (4)データ挿入時の権限の昇格

    1. //通常のステートメント、レベル 1

    2. $sql = "phpben.com (`user_name`,`pwd`,`level`) に挿入 value('benwin','iampwd',1) ";

    3. //パスワード文字列を変更してステートメントを

      に変更します
    4. $sql = "phpben.com (`user_name`,`pwd`,`level`) に挿入 value('benwin','iampwd',5)#',1) ";

    5. $sql = "insert into phpben.com (`user_name`,`pwd`,`level`) names('benwin','iampwd',5)-- ',1) ";これにより、権限が 1 に設定されますユーザー権限がレベル 5 に引き上げられます

    (5)更新権限の昇格と挿入権限の昇格は同じです

    1. //通常のステートメント

    2. $sql = "phpben set `user_name` ='benwin'、レベル=1を更新します";

    3. //ユーザー名の値を入力して取得される最終的な $sql

    4. $sql = "phpben set `user_name` ='benwin',level=5#', level=1を更新します";

    5. $sql = "phpben set `user_name` ='benwin',level=5-- ', level=1を更新します";

    (6)悪意のある更新と削除

    1. //通常のステートメント

    2. $sql = "phpben set `user_name` = 'benwin' where id =1を更新します";

    3. //注入後の悪意のあるコードは「1 or id>0」です

    4. $sql = "phpben set `user_name` = 'benwin' where id =1 or id>0";

    5. //通常のステートメント

    6. $sql = "phpben set `user_name` =’benwin’ where id=1を更新します";

    7. //注射後

    8. $sql = "phpben set `user_name` ='benwin' where id>0#' where id=1";

    9. $sql = "phpben set `user_name` ='benwin' where id>0-- ' where id=1";

    (7)結合、参加など

    1. //通常のステートメント

    2. $sql ="select * from phpben1 where `user_name`=’benwin’ ";

    3. //注射後

    4. $sql ="select * from phpben1 where`user_name`=’benwin’ uninon select * from phpben2#’ ";

    5. $sql ="select * from phpben1 where`user_name`=’benwin’ left join……#’ ";

    (8) ワイルドカード記号 %、_

    1. //通常のステートメント

    2. $sql ="select * from phpben where `user_name`=’benwin’ ";

    3. //ワイルドカード記号 % を挿入して複数の文字に一致させます。_ は 1 つの文字に一致します (__ など)。2 つの文字に一致します

    4. $sql ="select * from phpben where `user_name` like '%b' ";

    5. $sql ="select * from phpben where `user_name` like ’_b_’ ";

    このように、名前が b で始まるユーザーがいる限り、「_b_」は 3 文字に一致し、その 3 文字の真ん中の文字が b になります。これは、addslashes() 関数を導入するときに、% と _ がエスケープされないことに注意するよう求められる理由でもあります (実際、これは、多くの PHP 使用者が、% と _ アンダースコアをフィルタリングする理由を知らず、ただ盲目的にオンラインのコードに従っているためです)コード)

    (9)SQLに注入された推測テーブル情報もたくさんあります

    1. //通常のステートメント

    2. $sql ="select * from phpben1 where`user_name`='benwin'";

    3. //テーブル名を推測してください。正常に実行される場合は、phpben2 テーブルがあることを意味します

    4. $sql ="select * from phpben1 where`user_name`='benwin' and (select count(*) from phpben2 )>0#' ";

    5. // テーブルのフィールドを推測します。正常に実行される場合は、phpben2 テーブルにフィールド colum1 があることを意味します。
    6. $sql ="select * from phpben1 where`user_name`='benwin' and (select count(colum1) from phpben2 )>0#'";
    7. //フィールド値を推測します

    8. $sql ="select * from phpben1 where`user_name`='benwin' and left(pwd,1)='p'#''";

    9. もちろん、他にもたくさんありますが、著者はそれらを専門家のレベルまで研究したわけではありません。以下に一般的なものをいくつか挙げます。これらは、オンラインでアンチインジェクションコードを盲目的にコピーアンドペーストするのではなく、PHP が知って習得すべきものです。 、知っているのに知らない理由がわかります。

      以下の反注射法は、振り返ってみると理解しやすいかもしれません。

    3.3

    注射を防ぐいくつかの方法

    3.3.1 phpインジェクションを防ぐために使用できるいくつかの機能と注意事項。

    (1) はスラッシュ を追加し、スラッシュ

    を削除します。 Addslashes は、これらの "'"、"""、""、"NULL" にスラッシュ "'"、"""、"\"、"NULL" を追加します。逆に、stripslashes は php.ini Magic_quotes_gpc かどうかに注意する必要があります。 =ON をオンにすると、addlashes がオンになった場合に複製が発生します。したがって、使用する場合は、まず get_magic_quotes_gpc() で確認する必要があります 一般的なコードは次のようになります:

    if(!get_magic_quotes_gpc())

    1. {

    2. $abc = ラッシュを追加します($abc)

    3. }

    4. 実はこれ、PHPを少し勉強したことのある人なら誰でも知っていることなのですが、著者としては体系的に紹介したい(専門家レベルの記事ではないと言いました)ので、私も書きました。追加スラッシュ

    (2)mysql_escape_string()

    およびmysql_real_escape_string()

    mysql_real_escape_string は (PHP 4 >= 4.3.0、PHP 5) でのみ使用できます。それ以外の場合は、mysql_escape_string のみを使用できます

    if (PHP_VERSION >= '4.3')

    1. {

    2. $string = mysql_real_escape_string($string);

    3. }その他
    4. {
    5. $string = mysql_escape_string($string);
    6. }
    7. mysql_escape_string() と mysql_real _escape_string() の違いは、後者が現在のデータベース接続文字セットを決定することです。つまり、データベースに接続しなくても同様のエラーが発生します。

      警告: mysql_real_escape_string() [function.mysql-real-escape-string]: E:webphptest.php の 11 行目で、ユーザー 'ODBC'@'localhost' (パスワードを使用: NO) のアクセスが拒否されました

    (3)文字置換機能とマッチング機能

    str_replace() と perg_replace() は、これらの関数を使用して一部の機密文字や致命的な文字をフィルタリングまたは置換するために使用できるため、ここで説明します。

    3.3.2

    アンチインジェクションキャラクターの優先順位。

    インジェクションを防ぐには、まず、どのようなインジェクション文字やキーワードがあるのか​​を知る必要があります。一般的な mysql インジェクション文字には、「'」や「"」などの文字区切り文字、「and」や「or」などの論理キーワード、などの mysql メモ文字が含まれます。 "#"、"--"、"/**/"; mysql ワイルドカード "%"、"_"; mysql キーワード "select|insert|update|delete|*|union|join|into|load_file|outfile"

    (1) 指定された形式の一部のパラメータでは、アンチインジェクションの最も高い優先順位は「スペース」です。 たとえば、銀行カード番号、ID 番号、メールアドレス、電話番号、生年月日、郵便番号などの一部のパラメータには独自の所定の形式があり、その形式ではフィルタリング時にスペースを含めることはできないと規定されています。他の文字は記号、論理キーワード、および mysql メモを定義するため、通常は最初に除外されます (スペースの「バリアント」を含む)。次の図では、重要なものが「'」、「 "

    」であることに注意してください。

    追記: スペース文字のバリエーションは次のとおりです: "%20"、"n"、"r"、"rn"、"nr"、"chr("32")" これが、mysql_escape_string() と mysql_real_escape_string() の理由です。 2 つの関数は「n」、「r」をエスケープします。実際、多くの PHPer は、理由を知らずに n と r をエスケープする方法しか知りません。MySQL が n と r を解析するとき、それらはスペースとして扱われます。そのため、ここではコードを掲載しません。

    (2)「そして」、「または」、「」、「#」、「--」

    ロジック キーは、多くの挿入されたコードを

    結合することができます。mysql アノテーションは、挿入された SQL ステートメントが正常に実行できるように、挿入された多くの文字 x00、x1a を結合することもできます。

    追記

    : SQL 解析「#」と「--」は、ほとんどの MySQL アンチインジェクション コードでは考慮されず、多くの PHPer でも無視されます。また、一部の PHPer は値を割り当てるときにパラメーターを区切るために「-」を使用するため、この方法でパラメーターを記述しないことをお勧めします。もちろん、パラメーターをフィルターするときに「--」を使用することもできます (スペースがある場合は注意してください)。注) 「-」をフィルタリングする代わりに全体をフィルタリングする場合、これにより過剰なフィルタリング パラメータが回避されます。

    (3)

    "null"、"%"、"_" これらは独立させることができないため、特定の状況では使用しないでください。たとえば、ワイルドカード文字「%、_」を MySQL のような句に含める必要があります。したがって、一部のメールボックスには「_」文字が含まれる可能性があるため、「%」と「_」のフィルタリングは通常、検索に関連する場合にのみフィルタリングされます。

    (4) キーワード「select|insert|update|delete|*|union|join|into|load_file|outfile」

    おそらく、これらの重要なキーワードの優先順位がなぜそれほど低いのか疑問に思うかもしれません。著者が言いたいのは、これらのキーワードは「'」「」「」「and」「or」などを付けずに購入しても害はないということです。つまり、これらのキーワードは「

    独立

    」ではありません。もちろん、「

    Dependency」は特に大きいので、優先度が低いからといってフィルタリングすべきではないというわけではありません。

    3.3.3

    アンチインジェクションコード。

    (1)パラメータが数値の場合は、intval()関数を直接使用します

    : インターネット上で人気のあるアンチインジェクション コードの多くは、addslashes()、mysql_escape_string()、mysql_real_escape_string()、またはこれら 3 つの組み合わせによってフィルタリングされているだけですが、phper はフィルタリングされていると考えており、もしあなたが注意しないでください、それはパラメータが数値の場合です:

    $id =addslashes($_POST['id']); //正しいものは $id = intval($_POST['id']);

    1. $sql =" select * from phpben.com where id =$id";

    2. $sql = select * from phpben.com where id =1 または 1=1";

    3. 投稿されたデータがaddslashesでフィルタリングされると、多くのインジェクションは機能しなくなりますが、$idにはintvalがないため、これは
    細かい点ですが

    、脆弱性の存在につながります。注意しないと脆弱性につながる可能性があります。

    (2)非テキストパラメータのフィルタリング

    テキストパラメータは、「’」、「’」などが含まれる可能性のあるタイトル、メッセージ、コンテンツなどを指します。フィルタリング中にそれらをすべてエスケープしたり置き換えたりすることはできません。 ただし、テキストデータ以外でも大丈夫です。

    関数 _str_replace($str )

    1. {

    2. $str = str_replace(" ","",$str);

    3. $str = str_replace("n","",$str);

    4. $str = str_replace("r","",$str);
    5. $str = str_replace("'","",$str);
    6. $str = str_replace('"',"",$str);

    7. $str = str_replace("または","",$str);

    8. $str = str_replace("と","",$str);

    9. $str = str_replace("#","",$str);
    10. $str = str_replace("\","",$str);
    11. $str = str_replace("-- ","",$str);

    12. $str = str_replace("null","",$str);

    13. $str = str_replace("%","",$str);
    14. //$str = str_replace("_","",$str);
    15. $str = str_replace(">","",$str);
    16. $str = str_replace("<","",$str);

    17. $str = str_replace("=","",$str);

    18. $str = str_replace("char","",$str);
    19. $str = str_replace("宣言","",$str);
    20. $str = str_replace("select","",$str);

    21. $str = str_replace("作成","",$str);
    22. $str = str_replace("削除","",$str);

    23. $str = str_replace("挿入","",$str);

    24. $str = str_replace("実行","",$str);
    25. $str = str_replace("更新","",$str);
    26. $str = str_replace("カウント","",$str);

    27. $str;を返す

    28. }

    29. 追記
    :

    リスト ページから操作される一般的な href もいくつかあります: "phpben.php?action=delete&id=1"。このとき、_str_replace($_GET['action']) はパラメーターを除外することに注意してください。可読性に影響を与えない限り、機密キーはパラメータとして使用されます。たとえば、削除は del として記述され、更新は edite として記述されます。

    また、作成者は、上記のコードはアンダースコアをフィルタリングしていることに注意しました。これは、一部のパラメーターでアンダースコアを使用できるため、フィルタリング方法を自分で決定できるためです。

    一部のコードはキーワードをキー フィルター オブジェクトとして使用します。実際、キーワードの str_replace は簡単に「通過」します。そのため、キーは mysql キーワードではなく他の文字です。

    (3)

    テキストデータはコードインジェクションを防ぎます。

    テキスト パラメーターは、タイトル、メッセージ、コンテンツなどのデータを参照します。str_replace() を使用してフィルターで除外することは不可能であり、データの整合性が損なわれるため、非常に望ましくありません。 コード:

    関数 no_inject($str)

    1. {
    2. if(is_array($str))
    3. foreach($stras$key =>$val)

    4. }その他
    5. //またはなどの機密性の高いキーワードの最初の文字を置き換え、代わりに「or」を使用してください

    6. $str = str_replace(" "," ",$str);

    7. $str = str_replace("\","\",$str);

    8. $str = str_replace("'"," ' ",$str);
    9. $str = str_replace('"'," " ",$str);
    10. $str = str_replace("or"," o r",$str);
    11. $str = str_replace("and"," and",$str);

    12. $str = str_replace("#","# ",$str);

    13. $str = str_replace("-- ","-- ",$str);
    14. $str = str_replace("null","null",$str);
    15. $str = str_replace("%","%",$str);

    16. //$str = str_replace("_","_",$str);

    17. $str = str_replace(">","͸",$str);

    18. $str = str_replace("<",">",$str);
    19. $str = str_replace("=","=",$str);
    20. があります

    21. $str = str_replace("declare","declare" ,$str);

    22. $str = str_replace("select","select",$str);
    23. $str = str_replace("create","re​​ate",$str);
    24. $str = str_replace("delete","delete",$str);

    25. $str = str_replace("insert","insert",$str);

    26. $str = str_replace("execute","xecute",$str);

    27. $str = str_replace("update","update",$str);
    28. $str = str_replace("count","count",$str);
    29. }

    30. $str;を返す

    31. }

    (4)

    もちろん、addslashes

    、mysql_escape_stringと組み合わせた他のコードもあります。 アンチインジェクション コードは実際にはこれらの組み合わせに応じて変化し、独自のプログラム コードに従って適応されます。クック、セッション、およびリクエストは完全にはフィルタリングされない方がよいでしょう。 。重要なのは、その原理、なぜこれらの文字がフィルタリングされるのか、文字がどのような害を及ぼすのかを知ることです。もちろん、他にどのようなキーワードがあるかなど、著者が考慮していない、または考慮できない側面もあります。mailto: chen_bin_wen@163.com/445235728@qq.com

    へようこそ。

    4

    xss攻撃を防ぐ XSS: クロスサイトスクリプト。div+css と混同しないように、なぜ css と呼ばれないのですか。

    4.1

    Xss攻撃プロセス:

    (1) サイトAでxssの脆弱性が見つかりました。

    (2) xss 脆弱性コードを挿入します。これは、JS コード、トロイの木馬、スクリプト ファイルなどです。ここでは、ステーション A の benwin.php ファイルに脆弱性があるとします。

    (3)ステーションAの関係者を何らかの方法で騙してbenwin.phpを実行させ、Cookieや権限など関係者の一部の会員情報を利用します。

    関係者: 管理者 (Tieba モデレーターなど)、管理者は通常、特定の権限を持っています。その目的は、管理者の権限を借用したり、権限昇格を実行したり、管理者の追加や追加、バックドアの追加、トロイの木馬のアップロード、またはさらなる侵入やその他の関連操作を行うことです。

    ステーション A のメンバー: メンバーはステーション A の benwin.php を実行します。目的は一般的に、サイト A の会員情報を盗むことです。

    方法:

    1) Web サイトのアドレスなど、関係者を benwin.php に誘導するための情報をサイト A に投稿するこれはローカル詐欺です

    2) 他のウェブサイトで欺瞞的な情報や電子メールを送信する。

    通常、偽装 URL を使用してステーション A の関係者をだまして benwin.php をクリックさせます

    (4)

    3番目のステップは通常xss攻撃です。さらに攻撃したい場合は、ステップ(2)と(3)を繰り返して目標を達成します。

    xss 攻撃の簡単な例

    コード:

    benwin.php ファイル

    <

    html>
    1. <

      頭>
    2. <

      title>単純な xss 攻撃の例title>head>

      <

      metahttp-equiv="Content-Type"content="text/html; charset=utf-8">
    3. <

      ダディ>
    4. <

      formaction="phpben.com?user_name=">

    5. <

      inputtype="submit"value="submit">

    6. フォーム>
    7. ボディ>
    8. html>

    9. ユーザー名 $user_name の値が "benwin" の場合 onSubmit="alert('これは xss 攻撃の例です');" class=""(ここ)

    <

    formaction="phpben.com?user_name=benwin"onSubmit="alert('これは xss 攻撃の例です');"class= "">

    1. <

      inputtype="submit"value="submit">

    2. フォーム>
    3. フォームを送信するとプロンプトボックスが表示されます。

    (1) $user_name がデータベースに保存するときに xss 文字をフィルターしなかったことは明らかです (アンチインジェクションと同様、ここに例があります)==>脆弱性が見つかりました

    (2) xss コードを構築します: benwin" onSubmit="alert('これは xss 攻撃の例です');" class="" データベースに渡します

    (3) 関係者を騙して「送信」ボタンをクリックさせます

    4.2

    一般的なxss

    攻撃場所 (1)Jsの場所

    <スクリプト言語="javascript">

  • var testname =" ";

  •  

  •  

    $testname的值只要符合js闭合关系:“";alert("test xss ");”(以下同理)

    (2)form表单里面

    1. <inputtype="text"name="##"value=""/>

     

    (3)a标签

    1. <ahref="benwin.php?id= ">a标签可以隐藏xss攻击a>

     

    (4)用得很多的img标签

    1. <imgsrc=""/>

     

    甚至一些文本中插入整个img标签并且用width、 height、css等隐藏的很隐蔽

    (5)地址栏目

    总之,有输出数据的地方,更准确的说是有输出用户提交的数据的地方,都有可能是XSS攻击的地方。

    4.3防XSS方法

    防xss方法其实和防注入很相似,都是一些过滤、代替、实体化等方法

    (1)过滤或移除特殊的Html标签。

    例如:< 、>、<,、> ’、”、