PHP 開発におけるセキュリティ問題の概要_PHP チュートリアル
PHP 開発におけるセキュリティ問題の関連概要
php は開発者に大きな柔軟性をもたらしますが、近い将来、過去の問題を要約する必要があります。ここで私自身の開発経験の要約をいくつか追加します。
はじめに
インターネット サービスを開発するときは、セキュリティの概念を常に念頭に置き、開発するコードにそれを反映する必要があります。 PHP スクリプト言語は、特に経験の浅い開発者にとって、セキュリティの問題を心配しません。金銭が関係する取引について話すときは、フォーラムやショッピング カートの開発など、セキュリティに関する考慮事項に特別な注意を払う必要があります。
セキュリティ保護に関する一般的なポイント
フォームを信用しないでください
一般的なJavaScriptフロントエンド検証では、ブラウザのJavaScriptエンジンをオフにするなどユーザーの行動を知ることができないため、悪意のあるデータがサーバーにPOSTされます。 XSS 攻撃や SQL インジェクションを防ぐために、各 PHP スクリプトに渡されるデータを検証するためにサーバー側で検証を実行する必要があります
ユーザーを信用しないでください
Web サイトが受信したすべてのデータには悪意のあるコードと隠れた脅威が含まれており、すべてのデータをクリーンアップする必要があると仮定します
グローバル変数を閉じる
php.ini ファイルで以下を設定します:
register_globals = オフ
この設定オプションがオンになっている場合、大きなセキュリティリスクが発生します。たとえば、受け取ったデータをデータベースに挿入する process.php スクリプト ファイルがあります。ユーザー入力データを受け取るフォームは次のとおりです。
このようにして、process.php にデータを送信した後、php は $username 変数を登録し、この変数データを process.php に送信します。同時に、そのような変数は POST または GET リクエストのパラメーターに設定されます。初期化が表示されない場合、次の問題が発生します:
リーリー
ここでは、authenticated_user 関数が $authorized 変数の値を決定することを想定しています。 register_globals 構成がオンになっている場合、どのユーザーも $authorized 変数の値をバイパスする任意の値に設定するリクエストを送信できます。この検証。これらすべての送信データは、$_POST、$_GET、$_FILES、$_SERVER、$_REQUEST などを含む、PHP の事前定義された組み込みグローバル配列を通じて取得する必要があります。$_REQUEST は、$_GET/$_POST/$_COOKIE の 3 つです。配列のジョイント変数。デフォルトの順序は $_COOKIE、$_POST、$_GET です。
- 推奨されるセキュリティ構成オプション
safe_mode がオフに設定されています
register_globals がオフに設定されています
次の機能を無効にします: system、exec、passthru、shell_exec、proc_open、popen
Open_basedir は /tmp に設定されます。これにより、セッション情報にストレージ権限が与えられ、別の Web サイトのルート ディレクトリが設定されます
expose_php がオフに設定されています
allow_url_fopen がオフに設定されています
allow_url_include をオフに設定
SQLインジェクション攻撃データベースを操作する SQL ステートメントの場合、ユーザーが特定のステートメントを入力すると、元の SQL ステートメントの機能が変更される可能性があるため、セキュリティに特別な注意を払う必要があります。次の例と同様です:
$sql = "select * from pinfo where product = '$product'";
この時点で、ユーザーが入力した $product パラメータが次の場合:
39'; 'FOO' を選択してください
最終的な SQL ステートメントは次のようになります:pinfo から製品を選択します (product = '39') SELECT 'FOO';
これは 3 つの SQL ステートメントに変わり、pinfo テーブルが削除され、重大な結果を引き起こします。
この問題は、PHP の組み込み関数を使用して簡単に解決できます。
リーリーSQL インジェクション攻撃を防ぐには、次の 2 つのことを行う必要があります:
入力パラメータに対して常に型検証を実行します
一重引用符、二重引用符、バックティックマークなどの特殊文字をエスケープするには、常に mysql_real_escape_string 関数を使用してください
ただし、開発経験に基づいて、この機能は php6 では廃止されましたので、必要に応じて自分でエスケープしてください。
基本的な XSS 攻撃を防ぐXSS 攻撃は他の攻撃とは異なり、クライアント側で実行されます。最も基本的な XSS ツールは、フォーム ページでユーザーが送信したデータと Cookie が JavaScript スクリプトによって盗まれるのを防ぎます。
XSS ツールは SQL インジェクションよりも保護が困難です。すべての主要企業の Web サイトが XSS によって攻撃されています。この攻撃は PHP 言語とは関係ありませんが、PHP はユーザー データを保護するために使用されます。ここで使用されるのは、ユーザーのデータがフィルタリングされ、通常は HTML タグ、特に a タグがフィルタリングされます。一般的なフィルタリング方法は次のとおりです:
这个函数将HTML的特殊字符转换为了HTML实体,浏览器在渲染这段文本的时候以纯文本形式显示。如bold会被显示为: BoldText 上述函数的核心就是htmlentities函数,这个函数将html特殊标签转换为html实体字符,这样可以过滤大部分的XSS攻击。 但是对于有经验的XSS攻击者,有更加巧妙的办法进行攻击:将他们的恶意代码使用十六进制或者utf-8编码,而不是普通的ASCII文本,例如可以使用下面的方式进行: 这样浏览器渲染的结果其实是: <SCRIPT>Dosomethingmalicious</SCRIPT> 这样就达到了攻击的目的。为了防止这种情况,需要在transform_HTML函数的基础上再将#和%转换为他们对应的实体符号,同时加上了$length参数来限制提交的数据的最大长度。 使用SafeHTML防止XSS攻击 上述关于XSS攻击的防护非常简单,但是不包含用户的所有标记,同时有上百种绕过过滤函数提交javascript代码的方法,也没有办法能完全阻止这个情况。 目前,没有一个单一的脚本能保证不被攻击突破,但是总有相对来说防护程度更好的。一共有两个安全防护的方式:白名单和黑名单。其中白名单更加简单和有效。 一种白名单解决方案就是SafeHTML,它足够智能能够识别有效的HTML,然后就可以去除任何危险的标签。这个需要基于HTMLSax包来进行解析。 安装使用SafeHTML的方法: 1、前往http://pixel-apes.com/safehtml/?page=safehtml 下载最新的SafeHTML 2、将文件放入服务器的classes 目录,这个目录包含所有的SafeHTML和HTMLSax库 3、在自己的脚本中包含SafeHTML类文件 4、建立一个SafeHTML对象 5、使用parse方法进行过滤 SafeHTML并不能完全防止XSS攻击,只是一个相对复杂的脚本来检验的方式。 使用单向HASH加密方式来保护数据 单向hash加密保证对每个用户的密码都是唯一的,而且不能被破译的,只有最终用户知道密码,系统也是不知道原始密码的。这样的一个好处是在系统被攻击后攻击者也无法知道原始密码数据。 加密和Hash是不同的两个过程。与加密不同,Hash是无法被解密的,是单向的;同时两个不同的字符串可能会得到同一个hash值,并不能保证hash值的唯一性。 MD5函数处理过的hash值基本不能被破解,但是总是有可能性的,而且网上也有MD5的hash字典。 使用mcrypt加密数据 MD5 hash函数可以在可读的表单中显示数据,但是对于存储用户的信用卡信息的时候,需要进行加密处理后存储,并且需要之后进行解密。 最好的方法是使用mcrypt模块,这个模块包含了超过30中加密方式来保证只有加密者才能解密数据。 mcrypt函数需要以下信息: 1、待加密数据 2、用来加密和解密数据的key 3、用户选择的加密数据的特定算法cipher:如 4、用来加密的模式 5、加密的种子,用来起始加密过程的数据,是一个额外的二进制数据用来初始化加密算法 6、加密key和种子的长度,使用mcrypt_get_key_size函数和mcrypt_get_block_size函数可以获取 如果数据和key都被盗取,那么攻击者可以遍历ciphers寻找开行的方式即可,因此我们需要将加密的key进行MD5一次后保证安全性。同时由 于mcrypt函数返回的加密数据是一个二进制数据,这样保存到数据库字段中会引起其他错误,使用了base64encode将这些数据转换为了十六进制 数方便保存。 参考文献:http://www.codeproject.com/Articles/363897/PHP-Security<ol class="dp-c"><li class="alt"><span><span class="keyword">function</span><span> transform_HTML(</span><span class="vars">$string</span><span>, </span><span class="vars">$length</span><span> = null) { </span></span></li><li><span><span class="comment">// Helps prevent XSS attacks</span><span> </span></span></li><li class="alt"><span> <span class="comment">// Remove dead space.</span><span> </span></span></li><li><span> <span class="vars">$string</span><span> = trim(</span><span class="vars">$string</span><span>); </span></span></li><li class="alt"><span> <span class="comment">// Prevent potential Unicode codec problems.</span><span> </span></span></li><li><span> <span class="vars">$string</span><span> = utf8_decode(</span><span class="vars">$string</span><span>); </span></span></li><li class="alt"><span> <span class="comment">// HTMLize HTML-specific characters.</span><span> </span></span></li><li><span> <span class="vars">$string</span><span> = htmlentities(</span><span class="vars">$string</span><span>, ENT_NOQUOTES); </span></span></li><li class="alt"><span> <span class="vars">$string</span><span> = </span><span class="func">str_replace</span><span>(</span><span class="string">"#"</span><span>, </span><span class="string">"#"</span><span>, </span><span class="vars">$string</span><span>); </span></span></li><li><span> <span class="vars">$string</span><span> = </span><span class="func">str_replace</span><span>(</span><span class="string">"%"</span><span>, </span><span class="string">"%"</span><span>, </span><span class="vars">$string</span><span>); </span></span></li><li class="alt"><span> <span class="vars">$length</span><span> = </span><span class="func">intval</span><span>(</span><span class="vars">$length</span><span>); </span></span></li><li><span> <span class="keyword">if</span><span> (</span><span class="vars">$length</span><span> > 0) { </span></span></li><li class="alt"><span> <span class="vars">$string</span><span> = </span><span class="func">substr</span><span>(</span><span class="vars">$string</span><span>, 0, </span><span class="vars">$length</span><span>); </span></span></li><li><span> } </span></li><li class="alt"><span> <span class="keyword">return</span><span> </span><span class="vars">$string</span><span>; </span></span></li><li><span>} </span></li></ol>
<ol class="dp-c"><li class="alt"><span><span><?php </span></span></li><li><span><span class="comment">/* If you're storing the HTMLSax3.php in the /classes directory, along</span> </span></li><li class="alt"><span><span class="comment"> with the safehtml.php script, define XML_HTMLSAX3 as a null string. */</span><span> </span></span></li><li><span>define(XML_HTMLSAX3, <span class="string">''</span><span>); </span></span></li><li class="alt"><span><span class="comment">// Include the class file.</span><span> </span></span></li><li><span><span class="keyword">require_once</span><span>(</span><span class="string">'classes/safehtml.php'</span><span>); </span></span></li><li class="alt"><span><span class="comment">// Define some sample bad code.</span><span> </span></span></li><li><span><span class="vars">$data</span><span> = </span><span class="string">"This data would raise an alert <script>alert('XSS Attack')</script>"</span><span>; </span></span></li><li class="alt"><span><span class="comment">// Create a safehtml object.</span><span> </span></span></li><li><span><span class="vars">$safehtml</span><span> = </span><span class="keyword">new</span><span> safehtml(); </span></span></li><li class="alt"><span><span class="comment">// Parse and sanitize the data.</span><span> </span></span></li><li><span><span class="vars">$safe_data</span><span> = </span><span class="vars">$safehtml</span><span>->parse(</span><span class="vars">$data</span><span>); </span></span></li><li class="alt"><span><span class="comment">// Display result.</span><span> </span></span></li><li><span><span class="func">echo</span><span> </span><span class="string">'The sanitized data is <br />'</span><span> . </span><span class="vars">$safe_data</span><span>; </span></span></li><li class="alt"><span>?> </span></li></ol>
<ol class="dp-c"><li class="alt"><span><span><?php </span></span></li><li><span><span class="vars">$data</span><span> = </span><span class="string">"Stuff you want encrypted"</span><span>; </span></span></li><li class="alt"><span><span class="vars">$key</span><span> = </span><span class="string">"Secret passphrase used to encrypt your data"</span><span>; </span></span></li><li><span><span class="vars">$cipher</span><span> = </span><span class="string">"MCRYPT_SERPENT_256"</span><span>; </span></span></li><li class="alt"><span><span class="vars">$mode</span><span> = </span><span class="string">"MCRYPT_MODE_CBC"</span><span>; </span></span></li><li><span><span class="keyword">function</span><span> encrypt(</span><span class="vars">$data</span><span>, </span><span class="vars">$key</span><span>, </span><span class="vars">$cipher</span><span>, </span><span class="vars">$mode</span><span>) { </span></span></li><li class="alt"><span><span class="comment">// Encrypt data</span><span> </span></span></li><li><span><span class="keyword">return</span><span> (string) </span></span></li><li class="alt"><span> <span class="func">base64_encode</span><span> </span></span></li><li><span> ( </span></li><li class="alt"><span> mcrypt_encrypt </span></li><li><span> ( </span></li><li class="alt"><span> <span class="vars">$cipher</span><span>, </span></span></li><li><span> <span class="func">substr</span><span>(md5(</span><span class="vars">$key</span><span>),0,mcrypt_get_key_size(</span><span class="vars">$cipher</span><span>, </span><span class="vars">$mode</span><span>)), </span></span></li><li class="alt"><span> <span class="vars">$data</span><span>, </span></span></li><li><span> <span class="vars">$mode</span><span>, </span></span></li><li class="alt"><span> <span class="func">substr</span><span>(md5(</span><span class="vars">$key</span><span>),0,mcrypt_get_block_size(</span><span class="vars">$cipher</span><span>, </span><span class="vars">$mode</span><span>)) </span></span></li><li><span> ) </span></li><li class="alt"><span> ); </span></li><li><span>} </span></li><li class="alt"><span><span class="keyword">function</span><span> decrypt(</span><span class="vars">$data</span><span>, </span><span class="vars">$key</span><span>, </span><span class="vars">$cipher</span><span>, </span><span class="vars">$mode</span><span>) { </span></span></li><li><span><span class="comment">// Decrypt data</span><span> </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> (string) </span></span></li><li><span> mcrypt_decrypt </span></li><li class="alt"><span> ( </span></li><li><span> <span class="vars">$cipher</span><span>, </span></span></li><li class="alt"><span> <span class="func">substr</span><span>(md5(</span><span class="vars">$key</span><span>),0,mcrypt_get_key_size(</span><span class="vars">$cipher</span><span>, </span><span class="vars">$mode</span><span>)), </span></span></li><li><span> <span class="func">base64_decode</span><span>(</span><span class="vars">$data</span><span>), </span></span></li><li class="alt"><span> <span class="vars">$mode</span><span>, </span></span></li><li><span> <span class="func">substr</span><span>(md5(</span><span class="vars">$key</span><span>),0,mcrypt_get_block_size(</span><span class="vars">$cipher</span><span>, </span><span class="vars">$mode</span><span>)) </span></span></li><li class="alt"><span> ); </span></li><li><span>} </span></li><li class="alt"><span>?> </span></li></ol>
MCRYPT_TWOFISH192
,MCRYPT_SERPENT_256, MCRYPT_RC2
, MCRYPT_DES
, and MCRYPT_LOKI97
)

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック











PHP and Python each have their own advantages, and the choice should be based on project requirements. 1.PHPは、シンプルな構文と高い実行効率を備えたWeb開発に適しています。 2。Pythonは、簡潔な構文とリッチライブラリを備えたデータサイエンスと機械学習に適しています。

PHPは、サーバー側で広く使用されているスクリプト言語で、特にWeb開発に適しています。 1.PHPは、HTMLを埋め込み、HTTP要求と応答を処理し、さまざまなデータベースをサポートできます。 2.PHPは、ダイナミックWebコンテンツ、プロセスフォームデータ、アクセスデータベースなどを生成するために使用され、強力なコミュニティサポートとオープンソースリソースを備えています。 3。PHPは解釈された言語であり、実行プロセスには語彙分析、文法分析、編集、実行が含まれます。 4.PHPは、ユーザー登録システムなどの高度なアプリケーションについてMySQLと組み合わせることができます。 5。PHPをデバッグするときは、error_reporting()やvar_dump()などの関数を使用できます。 6. PHPコードを最適化して、キャッシュメカニズムを使用し、データベースクエリを最適化し、組み込み関数を使用します。 7

PHPとPythonにはそれぞれ独自の利点があり、プロジェクトの要件に従って選択します。 1.PHPは、特にWebサイトの迅速な開発とメンテナンスに適しています。 2。Pythonは、データサイエンス、機械学習、人工知能に適しており、簡潔な構文を備えており、初心者に適しています。

PHPは、電子商取引、コンテンツ管理システム、API開発で広く使用されています。 1)eコマース:ショッピングカート機能と支払い処理に使用。 2)コンテンツ管理システム:動的コンテンツの生成とユーザー管理に使用されます。 3)API開発:RESTFUL API開発とAPIセキュリティに使用されます。パフォーマンスの最適化とベストプラクティスを通じて、PHPアプリケーションの効率と保守性が向上します。

PHPは依然として動的であり、現代のプログラミングの分野で重要な位置を占めています。 1)PHPのシンプルさと強力なコミュニティサポートにより、Web開発で広く使用されています。 2)その柔軟性と安定性により、Webフォーム、データベース操作、ファイル処理の処理において顕著になります。 3)PHPは、初心者や経験豊富な開発者に適した、常に進化し、最適化しています。

PHPは主に手順プログラミングですが、オブジェクト指向プログラミング(OOP)もサポートしています。 Pythonは、OOP、機能、手続き上のプログラミングなど、さまざまなパラダイムをサポートしています。 PHPはWeb開発に適しており、Pythonはデータ分析や機械学習などのさまざまなアプリケーションに適しています。

PHPは、特に迅速な開発や動的なコンテンツの処理に適していますが、データサイエンスとエンタープライズレベルのアプリケーションには良くありません。 Pythonと比較して、PHPはWeb開発においてより多くの利点がありますが、データサイエンスの分野ではPythonほど良くありません。 Javaと比較して、PHPはエンタープライズレベルのアプリケーションでより悪化しますが、Web開発により柔軟性があります。 JavaScriptと比較して、PHPはバックエンド開発により簡潔ですが、フロントエンド開発のJavaScriptほど良くありません。

PHPとPythonには独自の利点と短所があり、選択はプロジェクトのニーズと個人的な好みに依存します。 1.PHPは、大規模なWebアプリケーションの迅速な開発とメンテナンスに適しています。 2。Pythonは、データサイエンスと機械学習の分野を支配しています。
