検索
ホームページバックエンド開発PHPチュートリアルPHP開発におけるセキュリティ問題の概要

php は開発者に大きな柔軟性をもたらしますが、近い将来、過去の問題を要約する必要があります。ここで私自身の開発経験の要約をいくつか追加します。

はじめに

インターネット サービスを開発するときは、セキュリティの概念を常に念頭に置き、開発されたコードに反映する必要があります。 PHP スクリプト言語は、特に経験の浅い開発者にとって、セキュリティの問題を心配しません。金銭が関係する取引について話すときは、フォーラムやショッピング カートの開発など、セキュリティに関する考慮事項に特別な注意を払う必要があります。

セキュリティ保護の一般的なポイント

  • フォームを信用しない
  • 一般的な Javascript フロントエンド検証では、ブラウザの JavaScript エンジンをオフにするなど、ユーザーの行動を知ることができないため、悪意のあるデータがサーバ。 XSS 攻撃や SQL インジェクションを防ぐために、各 PHP スクリプトに渡されるデータをサーバー側で検証する必要があります

  • ユーザーを信頼しないでください
  • Web サイトが受信するすべてのデータには悪意のあるデータが含まれていると想定する必要がありますコードが含まれており、隠されています。 脅威、すべてのデータをクリーンアップする必要があります

  • グローバル変数を閉じます
  • php.ini ファイルで次の設定を行います:

    register_globals = Off
    この設定オプションがオンになっている場合、大きなセキュリティ リスクが発生します。たとえば、受け取ったデータをデータベースに挿入する process.php スクリプト ファイルがあります。ユーザー入力データを受け取るフォームは次のとおりです。

    <input name="username" type="text" size="15" maxlength="64">
    このように、process.php にデータを送信した後、php を実行します。 $username 変数を登録し、この変数データを process.php に送信すると、そのような変数が POST または GET リクエスト パラメーターに設定されます。初期化が表示されない場合、次の問題が発生します:

    <?php // Define $authorized = true only if user is authenticatedif (authenticated_user()) {    $authorized = true;}?>
    ここでは、authenticated_user 関数が $authorized 変数の値を決定すると仮定します。 register_globals 構成がオンになっている場合、どのユーザーも設定リクエストを送信できます。 $authorized 変数の値には、この検証を回避する任意の値を指定できます。

    これらの送信データはすべて、$_POST、$_GET、$_FILES、$_SERVER、$_REQUEST などを含む、PHP の事前定義された組み込みグローバル配列を通じて取得する必要があります。ここで、$_REQUEST は $_GET/$_POST/$_COOKIE です。 3 つの配列のジョイント変数のデフォルトの順序は、$_COOKIE、$_POST、$_GET です。

  • 推奨されるセキュリティ設定オプション
  • error_reporting を Off に設定します: エラー情報をユーザーに公開しません

    safe_mode を Off に設定します

    register_globals を Off に設定します

    次の機能を無効にします。 、exec、passthru、shell_exec、proc_open、popen

    open_basedir は /tmp に設定され、これによりセッション情報にストレージ権限が与えられ、別の Web サイトのルート ディレクトリが設定されます

    Expose_php は Off に設定されます

    allow_url_fopen は Off に設定されます

    allow_url_include が Off に設定されている


    SQL インジェクション攻撃

    データベースを操作する SQL ステートメントについては、ユーザーが元の SQL ステートメントの機能を変更する特定のステートメントを入力する可能性があるため、セキュリティに特別な注意を払う必要があります。次の例と同様です:

    $sql = "select * from pinfo where product = '$product'";
    ユーザーが入力した $product パラメータが
    39'; DROP pinfo; SELECT 'FOO 
    の場合、最終的な SQL ステートメントは次のようになります:

    select product from pinfo where product = '39'; DROP pinfo; SELECT 'FOO' 
    これは 3 つの SQL ステートメントになり、pinfo テーブルは次のようになります。削除すると、重大な結果が生じます。

    この問題は、PHP の組み込み関数を使用して簡単に解決できます:

    $sql = 'Select * from pinfo where product = '"'        mysql_real_escape_string($product) . '"';
    は SQL インジェクション攻撃を防ぐために次の 2 つのことを行う必要があります:

    入力パラメーターの型検証を常に実行する

    一重引用符、二重引用符、および逆引用符特殊文字などの文字は常に mysql_real_escape_string 関数を使用してエスケープされます

    ただし、開発経験に基づいて、この機能は PHP6 では廃止されました。必要な場合は、常に自分でエスケープしてください。
    基本的な XSS 攻撃を防ぐ

    XSS 攻撃は他の攻撃とは異なり、クライアント上で実行されます。最も基本的な XSS ツールは、フォーム ページでユーザーが送信したデータと Cookie が JavaScript スクリプトによって盗まれるのを防ぎます。提出してください。

    XSS ツールは SQL インジェクションよりも保護が困難です。すべての主要企業の Web サイトが XSS によって攻撃されています。この攻撃は PHP 言語とは関係ありませんが、PHP はユーザー データを保護するために使用できます。ここで使用されるものは、ユーザーのデータをフィルター処理し、通常は HTML タグ、特に a タグをフィルターで除外します。一般的なフィルタリング方法は次のとおりです:

    function transform_HTML($string, $length = null) {// Helps prevent XSS attacks    // Remove dead space.    $string = trim($string);    // Prevent potential Unicode codec problems.    $string = utf8_decode($string);    // HTMLize HTML-specific characters.    $string = htmlentities($string, ENT_NOQUOTES);    $string = str_replace("#", "#", $string);    $string = str_replace("%", "%", $string);    $length = intval($length);    if ($length > 0) {        $string = substr($string, 0, $length);    }    return $string;} 
    这个函数将HTML的特殊字符转换为了HTML实体,浏览器在渲染这段文本的时候以纯文本形式显示。如bold会被显示为:

    BoldText 

    上述函数的核心就是htmlentities函数,这个函数将html特殊标签转换为html实体字符,这样可以过滤大部分的XSS攻击。

    但是对于有经验的XSS攻击者,有更加巧妙的办法进行攻击:将他们的恶意代码使用十六进制或者utf-8编码,而不是普通的ASCII文本,例如可以使用下面的方式进行:

    <a href="http://host/a.php?variable=%22%3e%20%3c%53%43%52%49%50%54%3e%44%6f%73%6f%6d%65%74%68%69%6e%67%6d%61%6c%69%63%69%6f%75%73%3c%2f%53%43%52%49%50%54%3e"> </a>
    这样浏览器渲染的结果其实是:

    <a href="http://host/a.php?variable="> <script>Dosomethingmalicious</script></a>
    这样就达到了攻击的目的。为了防止这种情况,需要在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方法进行过滤

    <?php /* If you're storing the HTMLSax3.php in the /classes directory, along   with the safehtml.php script, define XML_HTMLSAX3 as a null string. */define(XML_HTMLSAX3, '');// Include the class file.require_once('classes/safehtml.php');// Define some sample bad code.$data = "This data would raise an alert <script>alert('XSS Attack')";// Create a safehtml object.$safehtml = new safehtml();// Parse and sanitize the data.$safe_data = $safehtml->parse($data);// Display result.echo 'The sanitized data is <br>' . $safe_data;?>
    SafeHTML并不能完全防止XSS攻击,只是一个相对复杂的脚本来检验的方式。

    使用单向HASH加密方式来保护数据 单向hash加密保证对每个用户的密码都是唯一的,而且不能被破译的,只有最终用户知道密码,系统也是不知道原始密码的。这样的一个好处是在系统被攻击后攻击者也无法知道原始密码数据。
    加密和Hash是不同的两个过程。与加密不同,Hash是无法被解密的,是单向的;同时两个不同的字符串可能会得到同一个hash值,并不能保证hash值的唯一性。

    MD5函数处理过的hash值基本不能被破解,但是总是有可能性的,而且网上也有MD5的hash字典。


    使用mcrypt加密数据

    MD5 hash函数可以在可读的表单中显示数据,但是对于存储用户的信用卡信息的时候,需要进行加密处理后存储,并且需要之后进行解密。

    最好的方法是使用mcrypt模块,这个模块包含了超过30中加密方式来保证只有加密者才能解密数据。

    <?php $data = "Stuff you want encrypted";$key = "Secret passphrase used to encrypt your data";$cipher = "MCRYPT_SERPENT_256";$mode = "MCRYPT_MODE_CBC";function encrypt($data, $key, $cipher, $mode) {// Encrypt datareturn (string)            base64_encode                (                mcrypt_encrypt                    (                    $cipher,                    substr(md5($key),0,mcrypt_get_key_size($cipher, $mode)),                    $data,                    $mode,                    substr(md5($key),0,mcrypt_get_block_size($cipher, $mode))                    )                );}function decrypt($data, $key, $cipher, $mode) {// Decrypt data    return (string)            mcrypt_decrypt                (                $cipher,                substr(md5($key),0,mcrypt_get_key_size($cipher, $mode)),                base64_decode($data),                $mode,                substr(md5($key),0,mcrypt_get_block_size($cipher, $mode))                );}?>
    mcrypt函数需要以下信息:

    1、待加密数据

    2、用来加密和解密数据的key

    3、用户选择的加密数据的特定算法(cipher:如 MCRYPT_TWOFISH192,MCRYPT_SERPENT_256, MCRYPT_RC2, MCRYPT_DES, and MCRYPT_LOKI97)

    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




    声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
    PHPおよびPython:さまざまなパラダイムが説明されていますPHPおよびPython:さまざまなパラダイムが説明されていますApr 18, 2025 am 12:26 AM

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

    PHPとPython:彼らの歴史を深く掘り下げますPHPとPython:彼らの歴史を深く掘り下げますApr 18, 2025 am 12:25 AM

    PHPは1994年に発信され、Rasmuslerdorfによって開発されました。もともとはウェブサイトの訪問者を追跡するために使用され、サーバー側のスクリプト言語に徐々に進化し、Web開発で広く使用されていました。 Pythonは、1980年代後半にGuidovan Rossumによって開発され、1991年に最初にリリースされました。コードの読みやすさとシンプルさを強調し、科学的コンピューティング、データ分析、その他の分野に適しています。

    PHPとPythonの選択:ガイドPHPとPythonの選択:ガイドApr 18, 2025 am 12:24 AM

    PHPはWeb開発と迅速なプロトタイピングに適しており、Pythonはデータサイエンスと機械学習に適しています。 1.PHPは、単純な構文と迅速な開発に適した動的なWeb開発に使用されます。 2。Pythonには簡潔な構文があり、複数のフィールドに適しており、強力なライブラリエコシステムがあります。

    PHPとフレームワーク:言語の近代化PHPとフレームワーク:言語の近代化Apr 18, 2025 am 12:14 AM

    PHPは、多数のWebサイトとアプリケーションをサポートし、フレームワークを通じて開発ニーズに適応するため、近代化プロセスで依然として重要です。 1.PHP7はパフォーマンスを向上させ、新機能を紹介します。 2。Laravel、Symfony、Codeigniterなどの最新のフレームワークは、開発を簡素化し、コードの品質を向上させます。 3.パフォーマンスの最適化とベストプラクティスは、アプリケーションの効率をさらに改善します。

    PHPの影響:Web開発などPHPの影響:Web開発などApr 18, 2025 am 12:10 AM

    phphassiblasifly-impactedwebdevevermentandsbeyondit.1)itpowersmajorplatformslikewordpratsandexcelsindatabase interactions.2)php'sadaptableability allowsitale forlargeapplicationsusingframeworkslikelavel.3)

    スカラータイプ、リターンタイプ、ユニオンタイプ、ヌル可能なタイプなど、PHPタイプのヒントはどのように機能しますか?スカラータイプ、リターンタイプ、ユニオンタイプ、ヌル可能なタイプなど、PHPタイプのヒントはどのように機能しますか?Apr 17, 2025 am 12:25 AM

    PHPタイプは、コードの品質と読みやすさを向上させるためのプロンプトがあります。 1)スカラータイプのヒント:php7.0であるため、基本データ型は、int、floatなどの関数パラメーターで指定できます。 3)ユニオンタイプのプロンプト:PHP8.0であるため、関数パラメーターまたは戻り値で複数のタイプを指定することができます。 4)Nullable Typeプロンプト:null値を含めることができ、null値を返す可能性のある機能を処理できます。

    PHPは、オブジェクトのクローニング(クローンキーワード)と__Clone Magicメソッドをどのように処理しますか?PHPは、オブジェクトのクローニング(クローンキーワード)と__Clone Magicメソッドをどのように処理しますか?Apr 17, 2025 am 12:24 AM

    PHPでは、クローンキーワードを使用してオブジェクトのコピーを作成し、\ _ \ _クローンマジックメソッドを使用してクローン動作をカスタマイズします。 1.クローンキーワードを使用して浅いコピーを作成し、オブジェクトのプロパティをクローン化しますが、オブジェクトのプロパティはクローニングしません。 2。\ _ \ _クローン法は、浅いコピーの問題を避けるために、ネストされたオブジェクトを深くコピーできます。 3.クローニングにおける円形の参照とパフォーマンスの問題を避けるために注意し、クローニング操作を最適化して効率を向上させます。

    PHP対Python:ユースケースとアプリケーションPHP対Python:ユースケースとアプリケーションApr 17, 2025 am 12:23 AM

    PHPはWeb開発およびコンテンツ管理システムに適しており、Pythonはデータサイエンス、機械学習、自動化スクリプトに適しています。 1.PHPは、高速でスケーラブルなWebサイトとアプリケーションの構築においてうまく機能し、WordPressなどのCMSで一般的に使用されます。 2。Pythonは、NumpyやTensorflowなどの豊富なライブラリを使用して、データサイエンスと機械学習の分野で驚くほどパフォーマンスを発揮しています。

    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ヘンタイを無料で生成します。

    ホットツール

    MinGW - Minimalist GNU for Windows

    MinGW - Minimalist GNU for Windows

    このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

    メモ帳++7.3.1

    メモ帳++7.3.1

    使いやすく無料のコードエディター

    WebStorm Mac版

    WebStorm Mac版

    便利なJavaScript開発ツール

    Dreamweaver Mac版

    Dreamweaver Mac版

    ビジュアル Web 開発ツール

    SublimeText3 Mac版

    SublimeText3 Mac版

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