Web 開発に関して言えば、ここ数年 Web ユーザー インターフェイス デザインの事実上の標準となっている HTML について言及する必要があります。現在 WAP/XML などのページ スクリプトを使用しているため、HTML の優位性を維持することが困難になっていますが、フロントエンド PHP Web アプリケーションを作成する場合、開発者は依然として HTML 言語、特に HTML のフォーム部分を理解する必要があります。この章では、次のことを学習します: ? Dreamweaver を使用して HTML フォームをデザインしますか? PHP を使用してフォーム データを送受信しますか? PHP を使用してユーザー入力を検証しますか? PHP での軽量攻撃の防止 PHP の 2 つのセッション管理方法: COOKIE と SESSION ? Web アプリケーションの計画 5.1 フォームと HTML HTML は、ユーザーに優れた柔軟性を提供するシンプルなマークアップ言語であり、学習が容易です。また、あまりにも多くの Web デザイナーが HTML のデザインとコーディングを乱用し、IE、Firefox、Mozila などのいくつかの異なるブラウザーでページが大きく異なって実行されるのもこのためです。 今日の Web デザインでは、Web ページの HTML にコンテンツと情報のみを含め、現在一般的な DIV+CSS デザイン標準である標準の HTML と CSS (カスケード スタイル シート) に情報を格納することを目的とした新しい標準が可能になりました。 HTML 言語の代わりに XML を使用することを提案する人もいます。 XML は強力な機能を持っていますが、参入障壁が高く、HTML ベースの Web サイトが多すぎるため、HTML からの移行に使用される XHTML と呼ばれる HTML と XML の互換仕様が現在の標準です。 XMLに変換します。本書のコードは XHTML 互換性に基づいているため、XHTML を Web プロジェクトにも適用することをお勧めします。フォームの作成と処理は、PHP 開発者にとって重要な能力指標です。次にフォームのデザイン方法を紹介していきます。 フォームは、Web アプリケーションで最も一般的に使用されるコンポーネントであり、送信ボタンとその他の関連要素で構成されます。フォームは、ユーザーの登録、銀行口座の入力、ログインなどの機能を実装するためにさまざまな分野で使用されます。 フォームは開始タグとして を使用し、 で終わります。それ以外の場合は効果がありません。 HTML ページでは複数のフォームが許可されており、作成時にフォームの名前とフォーム ID がそれらの区別として使用されます。 以下は最も単純なフォームです。コードは次のとおりです:
このフォームはブラウザに「送信」ボタンのみを表示します。クエリの内容" "言葉にあまり意味はありません。データを送信して完全なフォームを形成したい場合は、次の形式に示すように、アクションとメソッドという 2 つの重要な属性タグを
タグに追加する必要があります:
ここで、アクション タグは、処理結果を受け取るファイルの場所を参照します。アクションの値が空の場合、現在のファイル自体に送信されます。アクション値が他のファイルまたは URL である場合は、それをファイルまたは URL アドレスに送信して処理します。
method タグは、データを送信するときに使用されるメソッドを記述します。メソッド属性が設定されていない場合、または属性が空の場合、ブラウザーはデフォルトで POST メソッドを使用します。
POSTフォームの処理方法は次のとおりです。
例 5-1: getPasswd.php – POST フォームによって送信された値を受け入れる
$action = $_SERVER['PHP_SELF']
if ($_SERVER['REQUEST_METHOD'] == 'POST' ) {
echo 'POST メソッドを使用してフォーム値を渡す';
echo "$_POST[email]";
}
?>
ブラウザでフォームまたはデータをサーバーに送信する場合は、GET メソッドまたは POST メソッドを使用できます。 GET メソッドは、URL にアクセスするときにブラウザーのアドレス バーを使用して値を渡します。この種の URL 文字列は多くの Web サイトで見られます。図 5-1 に示されているのは、GET メソッドを使用してパラメータを渡すことです。
エラーが発生しやすく、GET で渡される文字列の長さは 250 文字を超えることはできません。文字が長すぎる場合、ブラウザーが自動的に文字を切り捨て、データが失われます。さらに、GET メソッドは ASCII 文字以外の文字をサポートしていません。たとえば、中国語の文字やその他の非 ASCII 文字が含まれている場合は、追加のエンコード操作が必要になりますが、ブラウザによって自動的にエンコード処理が完了する場合もあります ( url_encode 関数と url_decode 関数を使用します。メソッドの詳細については、セクション 2.9.2 を参照してください)。
POST メソッドが可変データを送信する場合、HTTP プロトコルによれば、データはヘッダーのヘッダー情報に添付され、ユーザーが自由に変更することはできません。これは Web アプリケーションにとってより安全です。また、POST を使用すると、大量のデータを Web サーバーに送信できます。
POST は HTTP ヘッダー情報とともに送信されるため、POST フォームの送信がトリガーされたときに、ユーザーがページの閲覧中に「戻る」ボタンをクリックした場合、ブラウザーは POST データを自動的に再送信しません。この時点でユーザーが「更新」ボタンをクリックすると、「データの有効期限が切れました。フォームを再送信しますか?」というプロンプトが表示されます。これは GET ほど便利ではありません。 GET を使用して値を渡す場合、ユーザーが「戻る」または「更新」ボタンを使用しても、ブラウザーの URL アドレスは引き続き存在します。
そのため、開発時には実際のアプリケーションに応じてフォームデータを送信するためにGETとPOSTを柔軟に選択する必要があります。
HTML にフォーム終了タグがない場合、フォーム全体が送信アクションをトリガーしないことに注意してください。実際の開発中に、ボタンをクリックしても何も起こらないことに気づく人もいます。実際には、HTML 文字が 1 つ欠けているだけでもブラウザが機能しないことがあります。
5.4 フォーム要素
フォームには十数個のタグ要素が使用されており、PHP 開発で一般的に使用される重要なタグを表 5-1 に示します。
表 5-1
フォーム要素の説明
input type="checkbox" チェックボックス。ユーザーは複数のオプションを選択できます。
input type="file" ファイル参照ボックス。ファイルのアップロード時にモーダル ウィンドウを開くために使用できます。ファイルを選択します
input type="hidden" 隠しラベル、変数値を暗黙的にフォームに送信するために使用されます
input type="password" パスワード テキスト ボックス、ユーザーがテキスト ボックスに文字を入力すると、置き換えられ、* 番号として表示されます。
input type="radio" 単一オプション。オプションのセットを設定するために使用されます。ユーザーは 1 つの
input type="reset" を選択するだけで、フォームのコンテンツをクリアおよびリセットできます。フォーム内のすべてのテキスト ボックスの内容と選択メニュー項目を初期値に戻します
input type="submit" フォーム送信ボタン
input type="text" 単一行テキスト ボックス
select ドロップダウン リスト ボックス、単一選択または複数選択できます。デフォルトは単一選択です。複数選択機能を追加する場合は、
オプション リスト ドロップダウン メニューを追加してください。 select を使用すると、選択範囲の値が表示されます textarea 複数行のテキスト ボックス。テキスト ボックスを使用する場合は、タグ間のテキスト コンテンツを閉じて、次の形式を形成する必要があります: このうち、非表示タグは非表示タグまたは暗黙タグと呼ばれ、ユーザーが情報フォームに記入してページ間で値を転送するときに、このタグを使用してユーザーが閲覧するページインターフェイスには表示されません。いくつかの暗黙的な値。 パスワードテキストボックスはパスワードを隠すために使用されます。ユーザーが入力したテキストは*で表示されますが、パスワードは暗号化されず、*に置き換えられるだけです。 フォームの属性は、フォーム内のフォーム要素の動作や表示を制約するために使用されます。その意味と制約を表 5-2 に示します。 表 5-2 属性名の説明は、 name テキスト ボックスの名前を示します。PHP は、 選択ドロップ内に name という名前のキーを作成します。ダウンメニューでは、表示されるオプション行の数を意味します。 値テキストボックスのデフォルト値。この値は、type=password パスワードテキストボックスおよび type=file ファイルテキストボックスには適用できないことに注意してください。ドロップダウン リスト メニューの選択でオプションを指定するために使用されます。ユーザーは Ctrl キーと Shift キーを使用して複数の選択を行うことができます。 rows 複数行のテキスト ボックスが表示されるときに収容できる文字列の数です。Width cols。複数行のテキスト ボックスが表示されるときに収容できる文字行数。 高さ 上記の必須の属性要素に加えて、class、style、id などのいくつかの標準属性もあります。 HTML 関連情報を参照してください。 一部の動的スクリプトでは、さまざまなリクエストに応じてデータベースからフォーム要素を生成するために PHP を使用する必要があります。以下に、フォーム ボタンまたはオプションを生成するいくつかの方法を示します。 1.一連のラジオ ボタンを動的に生成します。 $options = array("010" => "北京", "020" => "上海", "024" => "瀋陽", "0411" => "大連"); $default = "024"; $html =generate_radio_group("city_id", $options, $default); echo $html; functiongenerate_radio_group($name, $options, $default="" ) { $name = htmlentities($name); foreach($options as $value => $label) { $value = htmlentities($value); $html .= " if ($value == $default){ $html .= "CHECKED "; } $html .= "NAME="$name" VALUE="$value">"; $html .= $label . " "; } return($html); } ?> このスクリプトは city_id という名前のラジオ ボタン グループのリストを生成します。デフォルトのオプションは 024-"Shenyang 「。」 2.複数のオプションのドロップダウン リスト メニューを動的に生成します。 functiongenerate_checkboxes($name,$options, $default=array()) { if (!is_array($default)){ $default = array(); } foreach($options as $value => $label) { $html .= " if (in_array($value, $default)){ $html .= "チェック済み "; } $html .= "name="{$name}[]" value="$value">"; $html .= $label . " "; } return($html); } $interests = array("音楽" => "音楽", "映画" => "映画", "インターネット" => "インターネット", "旅行" => "旅行"); $html =generate_checkboxes("interests",$options, $interests); ?> 興味のあることを選択してください: 3.複数選択のドロップダウン メニューを生成します。 $options = array( '1' => '選択してください', 'news' => 'ニュース', 'events' => 'イベント', '出版物' = > '原稿' ); $default = "ニュース"; //デフォルトの選択項目 $html =generate_muilti_option("select", $options, $default); echo $html; function generated_muilti_option ($ name, $options, $default){ //複数選択を許可するリストを作成します echo ''; foreach( $options as $value => $option ) { echo ' if( $default == $値) { }}} & gt; '. HTMLSPECIARS ($ オプション) ' & gt; 動的に生成されるメニューほとんどの場合、データベースからデータまたはデータ配列を取得し、それらを動的 HTML メニューに変換します。または、手動で作成することもできます。 5.5 フォーム処理メソッド 5.5.1 フォーム送信元を確認します 場合によっては、フォーム送信元を処理する必要があります。フォームの送信。誰かが同じフォームを偽造してプログラムに送信し、セキュリティ上の問題を引き起こすことを防ぐために、特定のホストまたはスクリプト自体への送信のみを許可するなど。 前に紹介したように、PHP の $_SERVER サーバーのスーパー グローバル配列は、$_SERVER['HTTP_REFERER'] という変数を提供します。これは、フォームの送信やハイパーリンクの URL アドレスなど、前のページのソースを保存するために使用されます。誰かが自分のコンピュータからフォームを送信するか、ブラウザのアドレスから直接現在のスクリプト名を入力する場合、この変数にはフォームのソースが保持されるか、空の値が含まれるため、その値を通じて処理できます。 以下の例では、ファイル自体が値を渡すフォームを送信することのみを許可します。 例 5-2: formreferer.php – フォームのソース アドレスを決定します $action = $_SERVER['PHP_SELF']; if ($_SERVER['REQUEST_METHOD'] == 'POST'){ $ ref = $_SERVER['HTTP_REFERER']; $srv = "http://{$_SERVER['SERVER_NAME']}$action"; echo "現在のソースは: $ref サーバーアドレスは: $srv ---------------------------------------------- --- ---------------------------------- "; if (strcmp($srv, $ref ) == 0){ エコー "一致"; else { エコー "オフサイトの送信は許可されません"; フォームを送信します。 action = "& lt;? PHP;? echo $action;?>" method="post"> この例で使用される $_SERVER サーバー変数は次のとおりです: ? HTTP_REFERER は完全なソース URL アドレスを保存します。 ? SERVER_NAME 現在のサーバー名。 ? PHP_SELF ファイル名を含む現在のスクリプトのフルパス。 「http:// == 」を通じて比較できます。それらが同じである場合、それは合法的なフォームの送信であり、そうでない場合は処理されません。例 5-2 スクリプトを実行し、[送信] ボタンをクリックすると、結果が図 5-2 に表示されます。 図 5-2 5.5.2 完全なフォーム処理 フォームを処理する簡単な方法についてはすでに学習しました。以下に示すコードを使用して複雑なフォームを作成します。 该表单には常用表单要素が含まれています:单行文本框、多行文本框、单选项(ラジオ)、多选项(チェックボックス)、および多品菜。詳細な説明は以下に記載されています。 ? maxlength はパスワード テキスト ボックスに関連付けられた属性で、ユーザーが入力するパスワードの最大長を 10 文字に制限します。 ? 年齢リスト ボックスはリスト メニューであり、その名前付き属性には選択用の独自の値があります。 Selected は特定の属性選択要素です。オプションがこの属性に関連付けられている場合、その項目は表示時に最初の項目としてリストされます。 ? イントロ テキスト ボックスのコンテンツには、行と列に応じてテキスト、行、列の幅が表示されます。 ? fave_sport はラジオ ボタン (ラジオ) のグループです。たとえば、このラジオ ボタンのグループは 1 つだけ選択でき、値は 1 つだけです。送信スクリプト。 ? 単一オプションと同様に、すべての複数オプションのメンバーも同じ名前の属性を持つ必要があり、複数オプションの値が次の形式で PHP に送信されるように属性名に括弧 [] を追加する必要があります。 Languages はこの形式です。 ? チェックされたタグは、デフォルトで選択されている単一オプションおよび複数オプションの特定の値を参照します。 上記フォームの表示画面を図5-3に示します。 図 5-3 上記の HTML のフォームフォームは POST メソッドを使用してデータを転送するため、ユーザーが送信したデータは $_POST または $_REQUEST のスーパー グローバル配列に保存されます。 $_POST 配列から送信されたデータを処理できます。 上記フォームのデータを someform.php スクリプトに送信します。 スクリプトの処理ロジックは次のとおりです: //ボタンの変数名が $_POST に定義されているかどうかを判断し、定義されている場合、フォームが送信されたことを意味します if (isset($_POST["btn_submit"])){ if (empty($_POST['username'])){ echo "ユーザー名が入力されていません"; exit(0); } if (empty ($_POST['password'])){ ; echo "パスワード (プレーンテキスト): ".$_POST['password'] "; echo "あなたの年齢: ".$_POST['age']."< br />"; if (!empty($_POST['langages'])){ echo "選択した言語は次のとおりです: _POST['言語'] as $lang){ echo $lang. DEVELOP_IDE_))) { Echo "使用する開発ツールは次のとおりです。";ユーザーが選択した開発ツール メニューの複数選択 Foreach ($ _post ['Develop_ide'] as $ IDE . " "; } } else { echo "開発ツールが選択されていません"; } echo "あなたの自己紹介: ".nl2br($_POST['intro'])." "; echo "Web ページの非表示値 (非表示タグ値を介して渡される): ".$_POST['from ']." "; } ?> 手順: POST メソッドを使用して送信する フォームは、HTTP プロトコルのヘッダー部分を通じてフォーム データを送信します。理論的には、データのサイズに上限はありません。データ。ただし、POST 送信に PHP を使用する場合、ファイル サイズは PHP 構成ファイル (php.ini) によって制限されます。php.ini ファイルの post_max_size パラメータを変更して、デフォルトの 2M バイトを必要なサイズに変更できます。 、HTTP プロトコルの特性により、この値はあまり大きく設定しないでください。最大値は 8M です。 5.6 フォームを処理するその他の方法 それでは、フォームを処理するための 2 つのプログラミング方法とその長所と短所を見てみましょう。 5.6.1 import_request_variables() 関数を使用する import_request_variables() 関数を使用して、グローバル変数のコレクションを選択的に登録します。この関数を使用して、$_GET、$_POST、および $_COOKIE の値をインポートできます。また、インポートされた各変数にプレフィックスを追加することもできます。 bool import_request_variables (文字列タイプ [, 文字列プレフィックス]) パラメータの文字列タイプには、g、p、c 文字、または 3 文字の任意の組み合わせが許可されます。このうち「g」はGET変数、「p」はPOST変数、「c」はCookieを表します。 注意: 「pg」を使用すると、POST 変数は同じ名前の $_GET 変数を上書きします。逆に、「gp」を使用すると、$_GET 変数の配列が上書きされます。 $ _POST よりも優先されます。 prefix パラメータは変数名の接頭辞として使用され、グローバル スコープにインポートされるすべての変数の前に配置されます。たとえば、「userid」という名前の $_GET スーパー グローバル変数配列があり、プレフィックスとして「pref_」を指定すると、$pref_userid という名前のグローバル変数が取得されます。他のグローバル変数 ($_SERVER 変数など) をインポートしたい場合は、extract() 関数 (「関数」の章で紹介) の使用を検討してください。プレフィックスを使用する場合は、既存のデータ名や変数名と競合しないように注意してください。 import_request_variable() 関数を使用して変数インポートを実装するスクリプト例は次のとおりです: //POST によって送信された変数値を、プレフィックス post_ import_request_variable("p", "post_") を付けてインポートします。 //インポートGET と POST によって送信された変数値、プレフィックスは gp_、GET は POST より優先されます import_request_variable("gp", "gp_"); //Cookie と GET の変数値をインポートします、 Cookie 変数の値は GET import_request_variable("cg", "cg_"); よりも優先されます。 import_request_variables() 関数で「pg パラメーター」を使用する場合は、次のスクリプト例を参照してください: if (isset($_REQUEST['btn_submit'])){ echo "POST 変数値から通常取得: ".$_REQUEST['Username']." "; import_request_variables("pg", " import_"); //インポートされた変数名を表示します echo "import_request_variables 関数を使用してインポートされました。 変数値: ".$import_Username; } ?> 名前を入力してください: < label> これフォームはユーザーに名前の入力を要求します。完了して送信すると、図 5-4 に示すように、スクリプトがブラウザに表示されます。 図 5-4 注: prefix パラメーターは必須です。prefix が指定されていないか、空の文字列が変数 prefix として指定されている場合、PHP は E_NOTICE エラーをスローします。 import_request_variables() 関数は、次の状況に適した中間メソッドを提供します。 1.ユーザーがスーパー変数配列 を使用できない場合; 2. php.ini 設定ファイルの register_globals パラメータが Off (PHP 5 以降のバージョンのデフォルト値は Off) の場合、import_request_variables を使用して GET/POST/Cookie スーパー変数配列をグローバル スコープにインポートします。 3.開発中に、導入された変数のスコープが宣言されている限り、$_GET や $_REQUEST などの長いスーパー グローバル配列名を大量に記述する必要はありません。 5.6.2 extract() 関数を使用する 受信ページ スクリプトの先頭に extract($_POST);extract($_GET); を追加するなど、extract() 関数を使用してフォームの複数のステートメントをエクスポートできます。次のコードに示すように、処理されたスーパー変数配列値: @extract(i_addslashes($_GET), EXTR_OVERWRITE); EXTR_OVERWRITE ); @extract(i_addslashes($_SESSION), EXTR_OVERWRITE); extract を使用して通常の変数にエクスポートするスクリプトの例を見てみましょう: // $_GET と $ から取得した変数を変換します。 _POST スーパー変数配列 通常の変数なので変数名を直接表示できます extract($_GET); extract($_POST); echo "Hello, $username $age"; ?> < form action="" method="post"> 名前: 年齢: 16 未満 < ;option value="16 -30" 選択済み>16-30 31-50 インターフェース実装されたものを図 5-5 に示します。 5.7 複数のページ間でのデータの転送 非常に大きなフォームに遭遇した場合、最初のフォームを複数の小さなフォームに分割して保存する必要があります。フォームに入力したら、フォームの値を収集して次のフォーム ページに渡す必要があります。 以下の方法で対応させていただきます。 フォームの非表示要素を使用しますか? ? 現在のフォームのデータを SESSION に保存します (詳細についてはセッションの章を参照してください)。 ? 現在のフォーム データを MySQL データベースに保存します。 上記の 3 つのオプションから、プログラムの処理とデバッグが容易なソリューションを選択できます。POSTはフォーム内の値の受け渡しに使用できるため、転送されるデータのサイズは問題になりません。また、プログラムのデバッグ時には、HTMLソースファイルを表示することで現在の変数が期待値であるかどうかを知ることができます。 。 非常に大きなフォームの場合、ユーザー入力を容易にするためにフォームを 2 つ以上のフォームに分割する方法を見つける必要があります。コードは次のとおりです。 複数のページがデータを渡す場合、上記と同様のステートメントを使用して、前の京都市ネットワーク www.bj135.com@Vogate.com" STYLE="border-bottom:
1px ドット rgb(255, 51, 102); フォント サイズ: 1em; カーソル: ポインター; テキスト装飾: 下線;" HREF="http://action.vogate. com/c/c.php?r=http%3A//www.ec80.cn/html/05/n-1705-6.html&aid=5526&sid=6235007045042472&click=1&url=http%3A//www.bj135.com&v= 0&s=http%3A//www.ec80.cn/html/05/n-1705-7.html&rn=561758&k=%u4E00%u9875"
TARGET="_blank">URL を通じて渡されるページまたは値。 5.7 複数のページ間でのデータの転送 非常に大きなフォームに遭遇した場合、最初のフォームを複数の小さなフォームに分割して保存する必要があります。が入力されている場合は、フォームの値を収集して次のフォーム ページに渡す必要があります。 以下の方法で対応させていただきます。 フォームの非表示要素を使用しますか? ? 現在のフォーム データを SESSION に保存します (詳細については、セッションの章を参照してください)。 ? 現在のフォーム データを MySQL データベースに保存します。 上記の 3 つのオプションから、プログラムの処理とデバッグが容易なソリューションを選択できます。 POSTはフォーム内の値の受け渡しに使用できるため、転送されるデータのサイズは問題になりません。また、プログラムのデバッグ時に、HTMLソースファイルを表示することで、現在の変数が期待値であるかどうかを知ることができます。 。 非常に大きなフォームの場合、ユーザー入力を容易にするためにフォームを 2 つ以上のフォームに分割する方法を見つける必要があります。コードは次のとおりです。 複数のページがデータを渡す場合、上記のようなステートメントを使用して、前のページまたは URL を通じて渡された値を処理できます。 5.9 フォームセキュリティ Web サイトの訪問者は、学生、教授、何も理解していないコンピューターの初心者、あるいは意図的に発生したエラーである可能性が高くなります。彼らはトラブルを求めて、私たちが望むように入力したり、サイトのセキュリティ ホールを探したりすることを常に好みます。 Web サイトの一般的な脆弱性のほとんどは、開発者の不注意によって引き起こされます。もちろん、中にはオペレーティング システムやサーバーの設定が原因であるものもあります。一般的な安全上の問題とその割合を表 5-4 に示します。 表5-4 プログラム欠陥率例 ユーザー入力未検証 42.60% アクセス制御欠陥 3.60% SESSION ID検証脆弱性 5.40% データベースSQLインジェクション 28.60%
以上、内容面も含めてPHPフォームについて詳しくご紹介しましたが、PHPチュートリアルに興味のある方の参考になれば幸いです。