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を
に変更します
ファイル コード:
addslashesでエスケープを繰り返さないようにします
2) register_globals = Off をオフにします php.iniに register_globals = OFF を入れます
register_globals = ON の場合
アドレス欄: http://www.jb51.net?bloger=benwin
这种情况下会导致一些未初始化的变量很容易被修改,这也许是致命的。所以把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) ユーザー名とパスワードは必要ありません
(2) パスワードを入力せずにユーザーを利用する。
(3) ユーザーのパスワードを推測します
(4) データ挿入時の権限の昇格
(9) SQLに注入された推測されたテーブル情報もたくさんあります
もちろん、他にもたくさんありますが、著者はプロのレベルまでは勉強していません。ここでは一般的なものをいくつか挙げます。これらは、オンラインでアンチインジェクションコードを盲目的にコピーして貼り付けるのではなく、PHPer が知って習得すべきものです。知っているのに知らない その理由を理解してください。
以下の反注射法は、振り返ってみると理解しやすいかもしれません。
3.3 注射を防ぐいくつかの方法
3.3.1 インジェクションを防ぐために php が使用できるいくつかの機能と注意事項。
(1)スラッシュとスラッシュを追加します。
Addslashes は、これらの "'"、"""、""、"NULL" にスラッシュ "'"、"""、"\"、"NULL" を追加します。逆に、stripslashes は php.ini Magic_quotes_gpc かどうかに注意する必要があります。 =ON をオンにすると、addlashes がオンになった場合に複製が発生します。したがって、使用する場合は、まず get_magic_quotes_gpc() で確認する必要があります
一般的なコードは似ています:
(2)mysql_escape_string() と mysql_real _escape_string()
mysql_real_escape_string は (PHP 4 >= 4.3.0、PHP 5) でのみ使用できます。それ以外の場合は、mysql_escape_string のみを使用できます
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 はフィルタリングされていると考えており、まだ存在します。注意しないと、つまりパラメータに抜け穴があります:
コードをコピーします
テキストパラメータは、「'」、「'」などを含む可能性のあるタイトル、メッセージ、コンテンツなどを指します。フィルタリング中にそれらをすべてエスケープしたり置き換えたりすることは不可能です。 ただし、テキストデータ以外でも大丈夫です。
コードをコピーします
この文のパラメータは、メッセージ、遺言、コンテンツなどを示しており、これらのデータは str_replace() を使用してフィルタリングすることもでき、これによりデータの完全性が保証され、これはまったく取得できません。
代記入:复制代記入
代記入如下:アンチインジェクション コードは実際にはこれらの組み合わせに応じて変化し、独自のプログラム コードに従って適応されます。クック、セッション、およびリクエストは完全にはフィルタリングされない方がよいでしょう。 。重要なのは、その原理、なぜこれらの文字がフィルタリングされるのか、文字がどのような害を及ぼすのかを知ることです。
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 ファイル
(2) xss コードを構築します: benwin” onSubmit="alert('これは xss 攻撃の例です');" class="" データベースに渡します
(3) 関係者を騙して「送信」ボタンをクリックさせます
4.2 一般的な xss 攻撃場所(1)Jsの場所
(5)アドレスバー
つまり、データが出力される場所、より正確にはユーザーが送信したデータが出力される場所は、XSS 攻撃の場所になる可能性があります。
4.3 アンチXSSメソッド
XSS 対策メソッドは、実際にはインジェクション対策メソッドと非常に似ており、フィルタリング、置換、実体化などのすべての方法です。
(1) 特殊な HTML タグをフィルターまたは削除します。例: <、>、<,、> ',"、