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

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_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_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 攻撃の例 head>






ユーザー名は $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 タグをフィルターまたは削除します。

例: 、 ',"、<script>、<iframe>、<,>、" <P>(2) JavaScript イベントをトリガーするタグをフィルターします。たとえば、onload、onclick、onfocus、onblur、onmouseover などです。 <P>(3)php、strip_tags()、htmlspecialchars()、htmlentities()、その他の関数の一部の関連関数は動作可能です <P>5、CSRF<P><STRONG> CSRF クロスサイト リクエストの偽造 クロスサイト リクエストの偽造。 <P>5.1 CSRF原則の簡単な説明<P><STRONG> (1)A はサイト 1 (最近ネチズンがよく使用するタオバオ、ウェイボー、QQ など) にログインし、何らかの情報、セッション、Cookie などを生成し、終了しません。 <P>(2)AがSite2に再度ログインします(一部のアダルトサイトなど。Site2へのアクセス方法としては、メールのなりすましなどの何らかの手段によるサイトがほとんどです)。 site1 を開くブラウザと同じです。それ以外の場合は無効になります <P>(3) Site2 は Site1 の HTTP リクエスト (パスワードの変更、物品の購入、送金など) を偽造しました。Site1 のサーバーは、A が site1 で正常に動作していると誤って認識しました (同じブラウザーであり、A がログアウトしていなかったため)。 、その後、リクエストが実行され、csrf は正常に操作されます。 <P>csrf と xss は非常に似ています。 XSS はリクエストを偽造することもでき、CSRF はスクリプトを作成することもできます。 <P>偽のリクエストは、電子メールの送信、パスワードの変更、ユーザー情報の返信、取引の実行など、さまざまな側面で行われる可能性があります。したがって、CSRF は XSS 攻撃よりも有害です。 <P>5.2 予防方法。 <P><STRONG> phper用 <P>(1)処刑入り口を厳重に管理 <P>パスワードの変更などの機密性の高い操作を実行する前に、リクエストの送信元を特定してください。このサイトのサーバーから送信されたリクエストのみを実行できます。判定方法によりIPの発信元を特定することができます。非サイトサーバー IP は実行されません。 <P>(2) 当サイト内に外部リンクがある場合は、必要な操作を行ってください <P>通常、サイト 2 のハッカーはサイト 1 (フォーラムなど) に欺瞞的なリンクを送信します。これは、サイト 1 で騙された関係者は通常、CSRF ガス条件の 1 つを満たすサイト 1 にログインしているためです。 <P>たとえば、QQ メール内の長い外部リンクをクリックすると、「危険です」などのプロンプトが表示されるページに戻ります。これにより、直帰率が低下するだけでなく、理解できない人もいます。必要がない場合は、そのようなプロンプトが表示されますが、興味本位でクリックしたリンクは、通常、クリックしてアクセスすることはありません。また、QQ メールの本文の画像は、コンテンツが読み込まれるときに読み込まれません。 「画像を表示」ボタンをクリックして画像を表示します。その理由の 1 つは攻撃を回避するためです。 <P>もちろん、これはユーザー エクスペリエンスにとってお勧めできません。最適化できるのは、一部の URL (QQ 独自の URL など) が安全で (プロンプトなしで) 直接表示できると判断することですが、疑わしい URL はプロンプトまたは禁止されます。 <P>(3) CSRF を防ぐために、XSS 対策方法を使用することもできます。 <P>6. ホットリンク対策<P><STRONG> ホットリンクの問題により、サーバーの負荷が増加します。ホットリンクとは、ホットリンク Web サイトがホットリンク Web サイトのリソースを盗んで、いくつかの機能を実装することを意味します。ホットリンクには主に、写真、ビデオ、その他のリソースのファイルのダウンロードが含まれます。 <P>方法: このサイトのサーバーのみがサイトリソースを使用できるようにし、それ以外の場合は使用できません。 <P>コード: <P>(1) <P><BR><div class="codetitle">コード<span style="CURSOR: pointer" onclick="doCopy('code74694')"><U>をApache htaccessに追加します。コードは次のとおりです: </script>
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$ [NC]
RewriteCond %{HTTP_REFERER} !phpben.com [NC]
RewriteCond %{HTTP_REFERER} !google.com [NC]
RewriteCond %{HTTP_REFERER} !baidu.com [NC]
RewriteCond %{HTTP_REFERER} !zhuaxia.com [NC]
RewriteRule .(jpg|gif| png|bmp| swf|jpeg) /image/replace.gif [R,NC,L]
RewriteRule ^(.*)$ http://phpben.com/image/$1 [L]

このようにして、すべてphpben.com google ではありません。com baidu.com zhuaxia.com ドメイン名リクエストでは代わりに replace.gif が返されます

7. CC攻撃を防ぐ
CC 攻撃: Web サイトに接続リクエストを送信し続けて、サービス妨害を引き起こすことが目的です。

詳細な百度百科事典: http://baike.baidu.com/view/662394.htm

コード:


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

session_start();
$ll_nowtime = $timestamp;
if (session_is_registered('ll_lasttime')){
$ll_lasttime = $_SESSION['ll_lasttime'] + 1;
$_SESSION['ll_times'] = $ll_times;
$ll_lasttime = $ll_times = 1;
$_SESSION['ll_times'] = $ll_times; $ll_lasttime;
}
if (($ll_nowtime - $ll_lasttime)if ($ll_times>=5){
header("場所: %s",'http://127.0.0.1 '));
終了
}else{
$_SESSION['ll_times'] = $ll_times;



http://www.bkjia.com/PHPjc/756992.html

www.bkjia.com

tru​​e
http://www.bkjia.com/PHPjc/756992.html技術記事

Php セキュリティと SQL インジェクションの防止、Xss 攻撃の防止、ホット リンクの防止、および CSRF の防止に関する簡単な説明 序文: まず第一に、著者は Web セキュリティの専門家ではないため、これは Web に関する専門家レベルの記事ではありません。セキュリティですが、勉強になります...
声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
php怎么把负数转为正整数php怎么把负数转为正整数Apr 19, 2022 pm 08:59 PM

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

php怎么实现几秒后执行一个函数php怎么实现几秒后执行一个函数Apr 24, 2022 pm 01:12 PM

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php怎么除以100保留两位小数php怎么除以100保留两位小数Apr 22, 2022 pm 06:23 PM

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

php怎么根据年月日判断是一年的第几天php怎么根据年月日判断是一年的第几天Apr 22, 2022 pm 05:02 PM

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

php字符串有没有下标php字符串有没有下标Apr 24, 2022 am 11:49 AM

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

php怎么替换nbsp空格符php怎么替换nbsp空格符Apr 24, 2022 pm 02:55 PM

方法:1、用“str_replace("&nbsp;","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\&nbsp\;||\xc2\xa0)/","其他字符",$str)”语句。

php怎么判断有没有小数点php怎么判断有没有小数点Apr 20, 2022 pm 08:12 PM

php判断有没有小数点的方法:1、使用“strpos(数字字符串,'.')”语法,如果返回小数点在字符串中第一次出现的位置,则有小数点;2、使用“strrpos(数字字符串,'.')”语句,如果返回小数点在字符串中最后一次出现的位置,则有。

php怎么读取字符串后几个字符php怎么读取字符串后几个字符Apr 22, 2022 pm 08:31 PM

在php中,可以使用substr()函数来读取字符串后几个字符,只需要将该函数的第二个参数设置为负值,第三个参数省略即可;语法为“substr(字符串,-n)”,表示读取从字符串结尾处向前数第n个字符开始,直到字符串结尾的全部字符。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。