PHP 開発における一般的なセキュリティ問題 (SQL インジェクション、CSRF、Xss、CC など) の詳細な説明と解決策_PHP チュートリアル

WBOY
リリース: 2016-07-13 10:32:01
オリジナル
806 人が閲覧しました

PHP セキュリティと SQL インジェクションの防止、Xss 攻撃の防止、ホットリンクの防止、CSRF の防止についての簡単な説明

序文:

まず、著者は Web セキュリティの専門家ではないため、これは Web セキュリティに関する専門家レベルの記事ではありません。この記事には、私たち PHP が理解できる内容がいくつか含まれています。簡単に発見できない、または注意を払わない。なので、後で簡単に参照できるように書き留めておきました。大企業には専任の Web セキュリティ テスターが必要であり、セキュリティは PHPer の考慮範囲ではありません。しかし、PHPer としてのセキュリティの知識は、「そういうものがあると知れば、プログラミングするときに自然と注意するようになる」というものです。

ディレクトリ:

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.1 Xss 攻撃のプロセス
4.2 一般的な xss 攻撃の場所
5. CSRF の原理を簡単に説明する
5.2 ホットリンクを防ぐ方法
7.攻撃


1. php

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

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


php.iniのdisplay_errorsを


に変更します

コードをコピーします コードは次のとおりです:
display_errors = OFF
または追加

コードをコピーしますコードは次のとおりです:
error_reportしている(0 )
1) error_reporting(0) を使用する 失敗例:

ファイル コード:


コードをコピーします。 コードは次のとおりです: echo 555
echo 444;


コピーコード

コードは次のとおりです:

解析エラー: 解析エラー、E:webphp2.php の 4 行目で `','' または `';'' が予期されています
2) error_reporting(0) を使用します。 : a ファイル コード :
コードをコピーします
コードは次のとおりです:


error_reporting(0); ?>bファイルコード:

コードをコピー

コードは次のとおりです:

echo 555
echo 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.jb51.net?bloger=benwin

コードをコピー

コードは次のとおりです:


//$bloger = $_GET['bloger'] // register_globals = ON なので、この手順は必要なく、直接 $bloger
echo $bloger
?>
; を使用できます。

这种情况下会导致一些未初始化的变量很容易被修改,这也许是致命的。所以把register_globals = OFF关掉

(3)严格配置文件权限。

为相应文件夹分配权限,比如包含上传图片的文件不能有执行权限,只能读取

2、严格的数据验证,你的用户不全是“好”人。

记得笔者和一个朋友在讨论数据验证的时候,他说了一句话:你不要把你用户个个都想得那么坏!但笔者想说的这个问题不该出现在我们开发情景中,我们要做的是严格验证控制数据流,哪怕10000万用户中有一个是坏用户也足以致命,再说好的用户也有时在数据input框无意输入中文的时,他已经不经意变“坏”了。

2.1为了确保程序的安全性,健壮性,数据验证应该包括

(1)     关键数据是否存在。如删除数据id是否存在
(2)     数据类型是否正确。如删除数据id是否是整数
(3)     数据长度。如字段是char(10)类型则要strlen判断数据长度
(4)     数据是否有危险字符

数据验证有些人主张是把功能完成后再慢慢去写安全验证,也有些是边开发边写验证。笔者偏向后者,这两种笔者都试过,然后发现后者写的验证相对健壮些,主要原因是刚开发时想到的安全问题比较齐全,等开发完功能再写时有两个问题,一个phper急于完成指标草草完事,二是确实漏掉某些point。
2.2程序员容易漏掉point或者说需要注意的事项:

(1)     进库数据一定要安全验证,笔者在广州某家公司参与一个公司内部系统开发的时候,见过直接把$_POST数据传给类函数classFunctionName($_POST),理由竟然是公司内部使用的,不用那么严格。暂且不说逻辑操作与数据操控耦合高低问题,连判断都没判断的操作是致命的。安全验证必须,没任何理由推脱。
(2)     数据长度问题,如数据库建表字段char(25),大多phper考虑到是否为空、数据类型是否正确,却忽略字符长度,忽略还好更多是懒于再去判断长度。(这个更多出现在新手当中,笔者曾经也有这样的思想)
(3)     以为前端用js判断验证过了,后台不需要判断验证。这也是致命,要知道伪造一个表单就几分钟的事,js判断只是为了减少用户提交次数从而提高用户体验、减少http请求减少服务器压力,在安全情况下不能防“小人”,当然如果合法用户在js验证控制下是完美的,但作为phper我们不能只有js验证而抛弃再一次安全验证。
(4)     缺少对表单某些属性比如select、checkbox、radio、button等的验证,这些属性在web页面上开发者已经设置定其值和值域(白名单值),这些属性值在js验证方面一般不会验证,因为合法用户只有选择权没修改权,然后phper就在后端接受数据处理验证数据的时候不会验证这些数据,这是一个惯性思维,安全问题也就有了,小人一个伪表单。
(5)     表单相应元素name和数据表的字段名一致,如用户表用户名的字段是user_name,然后表单中的用户名输入框也是user_name,这和暴库没什么区别。
(6)     过滤危险字符方面如防注入下面会独立讲解。

3、防注入

3.1简单判断是否有注入漏洞以及原理。

网址:http://www.jb51.net/benwin.php?id=1 运行正常,sql语句如:select  *  from phpben where id = 1

(1) 网址:http://www.jb51.net/benwin.php?id=1'   sql语句如:select  *  from phpben where id = 1'  然后运行异常 这能说明benwin.php文件没有对id的值进行“'” 过滤和intval()整形转换,当然想知道有没有对其他字符如“%”,“/*”等都可以用类似的方法穷举测试(很多测试软件使用)
(2)网址:http://www.jb51.net/benwin.php?id=1 and 1=1  则sql语句可能是 select  *  from phpben where id = 1 and 1=1,运行正常且结果和http://www.jb51.net/benwin.php?id=1结果一样,则说明benwin.php可能没有对空格“ ”、和“and”过滤(这里是可能,所以要看下一点)
(3)网址:http://www.jb51.net/benwin.php?id=1 and 1=2则sql语句可能是 select  *  from phpben where id = 1 and 1=2 如果运行结果异常说明sql语句中“and 1=2”起作用,所以能3个条件都满足都则很确定的benwin.php存在注入漏洞。

ps:这里用get方法验证,post也可以,只要把值按上面的输入,可以一一验证。

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

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

コードをコピーします コードは次のとおりです:

//通常のステートメント
$sql ="select * from phpben where user_name='admin' and pwd ='123'" ;
//ユーザー名ボックスに 'or'='or' または 'or 1='1 と入力すると、SQL は次のようになります
$sql ="select * from phpben where user_name=' ' or'='or'' and pwd = '' ";
$sql ="select * from phpben where user_name=' 'or 1='1' and pwd ='' ";

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

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

コードをコピー コードは次のとおりです:

//通常のステートメント
$sql ="select * from phpben where user_name='$username' and pwd ='$pwd'";
//使用するユーザー 名前が benwin の場合、ユーザー名ボックスに benwin'# を入力します (パスワードありまたはパスワードなし)。$sql は
$sql ="select * from phpben where user_name=' benwin'#' and pwd ='$pwd' になります。 ";

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

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

コードをコピーします コードは次のとおりです:

//通常のステートメント
$sql ="select * from phpben.com where user_name='$username' and pwd = '$pwd'";
//パスワード入力ボックスに「benwin' and left(pwd,1)='p'#」と入力すると、$sql は
$sql ="select * from phpben.com where user_name= ' benwin' and left(pwd,1)='p'#' and pwd ='$pwd'";

正常に実行される場合、パスワードの最初の文字は p で、残りの文字を推測します。同じ方法。

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

コードをコピー コードは次のとおりです:

//通常のステートメント、レベル1
$sql = "insert into phpben.com (`user_name`, `pwd `,`level`) value('benwin','iampwd',1) ";
//ステートメントを
$sql = "に変更し、phpben.com (`user_name`,`pwd` を変更して挿入します)パスワード文字列 ,`レベル`) 値('benwin','iampwd',5)#',1) ";
$sql = "phpben.com (`user_name`,`pwd`,`level`) 値に挿入(' benwin','iampwd',5)-- ',1) ";これにより、権限 1 を持つユーザーがレベル 5 に昇格されます


(5) 更新権限の昇格と挿入権限の昇格は同じです
コードをコピーします コードは次のとおりです:

//通常のステートメント
$sql = "update phpben set `user_name` ='benwin', level=1"; によって最終的に取得される $sqlユーザー名の値を入力します
$sql = "update phpben set `user_name` ='benwin',level=5#', level=1";
$sql = "update phpben set `user_name` ='benwin',level= 5#', level=1", level=1";


(6) 悪意のある更新と削除
コードをコピー コードは次のとおりです:
//通常のステートメント
$sql = "update phpben set `user_name` = 'benwin' where id =1";
//注入後の悪意のあるコードは "1 or id>0"
$sql = "update phpben set `user_name` = 'benwin' where id =1 or id>0";
// 通常のステートメント
$sql = "update phpben set `user_name` ='benwin' where id=1";
// インジェクション後
$sql = "update phpben set ` user_name` ='benwin' where id>0#' where id=1";
$sql = "update phpben set `user_name` ='benwin' where id>0-- ' where id=1";


(7)union、joinなど
コードをコピー コードは次のとおりです:

//通常のステートメント
$sql ="select * from phpben1 where `user_name`='benwin' ";
//インジェクション後
$sql ="select * from phpben1 where`user_name`='benwin' uninon select * from phpben2#' ";
$sql ="select * from phpben1 where`user_name`='benwin' left join....#' ";


(8) ワイルドカード記号 %、_
コードをコピーします コードは次のとおりです:

//通常のステートメント
$sql ="select * from phpben where `user_name`='benwin'
// 複数の文字に一致するワイルドカード記号 % を挿入します。 _ は 1 つの文字に一致します。たとえば、__ は 2 つの文字に一致します。
$sql ="select * from phpben where `user_name` like '%b' ";
$sql ="select * from phpben where `user_name` like '_b_ ' ";

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

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

コードをコピー コードは次のとおりです:

//通常のステートメント
$sql="select * from phpben1 where`user_name`='benwin '";
//テーブル名を推測します。正常に実行される場合は、phpben2 テーブルがあることを意味します
$sql ="select * from phpben1 where`user_name`='benwin' and (select count(*) from phpben2 )>0#' " ;
//テーブルのフィールドを推測します。正常に実行された場合、phpben2 テーブルにフィールド colum1 があることを意味します
$sql ="select * from phpben1 where`user_name `='benwin' and (select count(colum1) from phpben2 )>0#' ";
//フィールド値を推測
$sql ="select * from phpben1 where`user_name`='benwin' and left(pwd, 1)='p'#''";

もちろん、他にもたくさんありますが、著者はプロのレベルまでは勉強していません。ここでは一般的なものをいくつか挙げます。これらは、オンラインでアンチインジェクションコードを盲目的にコピーして貼り付けるのではなく、PHPer が知って習得すべきものです。知っているのに知らない その理由を理解してください。

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

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())
{
$abc = addlashes($abc);
}

実際には、 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')
{
$string = mysql_real_escape_string($string)
}else;
{
$string = mysql_escape_string($string);
}

mysql_escape_string() と mysql_ real _escape_string() の違いは、後者が現在のデータベース接続文字セットを決定することです。つまり、同様のエラーが発生します。データベースに接続せずに:
コードをコピー コードは次のとおりです:

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


(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 メモを定義するため、最初にフィルターで除外されます (スペースの「バリアント」を含む)。次の図では、重要なものは「'」、「 "

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

ps: スペース文字のバリアントは次のとおりです: "%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 アンチインジェクション コードでは考慮されず、多くの PHP 者でも無視されます。また、PHPer によっては、値を割り当てるときにパラメーターを区切るために「-」を使用するため、この方法でパラメーターを記述しないことをお勧めします。もちろん、パラメーターをフィルターするときに「-」を使用することもできます (スペースがある場合は注意してください)。スペースがない場合、メモとして解析されません。 注) 「-」をフィルタリングする代わりに全体をフィルタリングする場合、これにより過剰なフィルタリング パラメータが回避されます。

(3) "null"、"%"、"_"

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

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

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

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


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

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


コードをコピーします

コードは次のとおりです:$id =addslashes($_POST['id']) ; //正しいものは $id = intval($_POST['id']); $sql =" select * from phpben.com where id =$id"; where id =1 or 1=1";
比較することで簡単に見つけることができます。 投稿されたデータは通過します 確かに多くのインジェクションはaddlashesフィルタリング後には効果がありませんが、$idにはintvalがないため、これは細かいことなので、注意しないと脆弱性が発生する可能性があります。

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

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

コードをコピーします

コードは次のとおりです:

function _str_replace($str )
{
$str = str_replace(" ","",$str); 
$str = str_replace("n","",$str); 
$str = str_replace("r","",$str); 
$str = str_replace("'","",$str); 
$str = str_replace('"',"",$str);
$str = str_replace("or","",$str);
$str = str_replace("and","",$str) ;
$str = str_replace("#","",$str);
$str = str_replace("\","",$str);
$str = str_replace("-- ","",$ str);
$str = str_replace("null","",$str);
$str = str_replace("%",",$str);
//$str = str_replace("_"," ",$str);
$str = str_replace(">","",$str);
$str = str_replace("<","",$str);
$str = str_replace("= ","",$str);
$str = str_replace("char","",$str);
$str = str_replace("declare","",$str);
$str = str_replace(" select","",$str);
$str = str_replace("create","",$str);
$str = str_replace("delete","",$str);
$str = str_replace( "insert","",$str);
$str = str_replace("execute","",$str);
$str = str_replace ("count","",$str);
$str; を返します
ps:いくつかの从列表页操作に関する一般的なhrefは”phpben.php?action=delete&id=1”,今回の気象注意啦,_str_replace($_GET['action'])会ハンドルパラメータ过滤掉,笔者一般に敏感なボタンはパラメータとして使用されません。例としては、会議の書き込み削除、書き込みの更新、編集、のみ必要な影響はありません。
また、上層コード経由下層回線の参加者は必ず同意しています、いくつかのパラメータは下層回線を使用できるため、自己調整します
一部のコードでは、関連する文字がフィルタリング対象に注目され、その関連する文字の str_replace が簡単に「移動」され、str_replace("ininsertsert") のフィルタ後の文字も挿入されるため、関連する文字は mysql に関連する文字ではなく別の文字になります。

(3)文ファイルセキュリティ注入代コード。

この文のパラメータは、メッセージ、遺言、コンテンツなどを示しており、これらのデータは str_replace() を使用してフィルタリングすることもでき、これによりデータの完全性が保証され、これはまったく取得できません。

代記入:

复制代記入

代記入如下:


function no_inject($str)

{
if(is_array($str))
{
foreach($str as $key =>$val)
{
$str[$key]=no_inject($val ); 
}
}else
{
$str = str_replace(" "," ",$str); 
$str = str_replace("\","",$str); 
$str = str_replace("'","'",$str); 
$str = str_replace('"',""",$str); 
$str = str_replace("or","or",$str); 
$str = str_replace("and","and",$str); 
$str = str_replace("#","#",$str); 
$str = str_replace("-- ","-- ",$str); 
$str = str_replace("null","null",$str); 
$str = str_replace("%","%",$str); 
//$str = str_replace("_","",$str); 
$str = str_replace(">",">",$str); 
$str = str_replace("<","<",$str); 
$str = str_replace("=","=",$str); 
$str = str_replace("char","char",$str);   
$str = str_replace("declare","declare",$str); 
$str = str_replace("select","select",$str); 
$str = str_replace("create","create",$str); 
$str = str_replace("delete","delete",$str); 
$str = str_replace("insert","insert",$str); 
$str = str_replace("実行","実行",$str); 
$str = str_replace("update","update",$str); 
$str = str_replace("count","count",$str); 
}
return $str; 
}


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

アンチインジェクション コードは実際にはこれらの組み合わせに応じて変化し、独自のプログラム コードに従って適応されます。クック、セッション、およびリクエストは完全にはフィルタリングされない方がよいでしょう。 。重要なのは、その原理、なぜこれらの文字がフィルタリングされるのか、文字がどのような害を及ぼすのかを知ることです。

4. xss 攻撃を防ぐ

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

4.1Xss攻撃プロセス:

(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 ファイル

コードをコピーします コードは次のとおりです:



簡単な xss 攻撃の例






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


コードをコピーします コードは次のとおりです。


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

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

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

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

4.2 一般的な xss 攻撃場所

(1)Jsの場所



コードをコピー コードは次のとおりです:


$testname の値は、j​​s クロージャー関係「";alert("test xss ");」に準拠する必要があるだけです (以下も同様です)

(2) フォーム内のコードをコピーします


コードは次のとおりです: >">a タグは " />
img タグ全体もテキストに挿入され、幅、高さ、CSS などを使用して非表示になります

(5)アドレスバー

つまり、データが出力される場所、より正確にはユーザーが送信したデータが出力される場所は、XSS 攻撃の場所になる可能性があります。

4.3 アンチXSSメソッド

XSS 対策メソッドは、実際にはインジェクション対策メソッドと非常に似ており、フィルタリング、置換、実体化などのすべての方法です。

(1) 特殊な HTML タグをフィルターまたは削除します。

例: <、>、<,、> ',"、
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート