PHP表单及印证
PHP表单及验证
一、概述
PHP在处理一个页面时,它都会检查URL和表单变量、上传的文件、可用的cookie以及Web服务器和环境变量。之后,这些信息就可以通过下面这些数组直接访问:$_GET、$_POST、$_FILES、$_COOKIE、$_SERVER和$_ENV。也就是说,PHP会分别保存在查询字符串中设置的变量、一个post请求的主题内容、上传的文件、cookie、Web服务器及Web服务器运行其上的环境等这些信息。当然,也有一个$_REQUEST变量,它是包含着前面六个数组中全部值的一个大数组。
variables_order
当在$_REQUEST数组中放置元素时,如果两个数组都有一个同名的键,PHP会根据php.ini中的variables_order配置指令决定如何切断他们之间的联系。在默认情况下,variables_order的值是EGPCS(如果使用的是php.ini-recommended配置文件,则是GPCS)。也就是说,PHP首先会把环境变量添加到$_REQUEST中,然后再依次添加查询字符串(get)、post、cookie、和web服务器变量。在这种情况下,因为默认是C在P的后面,所以一个名为username的cookie会覆盖一个同样名为username的post变量。注意,php.ini-recommended文件中的GPCS值表明$_ENV数组中的环境变量不会被添加到$_REQUEST数组中。
track_vars
在PHP4.1之前,这些自动全局变量是不存在的。当时,它们只是一些常规的数组,名字分别为$HTTP_COOKIE_VARS、$HTTP_ENV_VARS、$HTTP_GET_VARS、$HTTP_POST_VARS、$HTTP_POST_FILES和$HTTP_SERVER_VARS。出于继承的原因,这些数组仍然是有效的,只不过新增加的数组更容易使用。这些老数组只有在track_vars配置指令为on时才会被赋值。(此选项自php4.0.3后总是开启的,不再通过track_vars=设置)
register_globals
如果register_globals配置指令的值是on,那么以上所有的变量同样也将作为全局名称空间中的变量。所以$_GET['password']的值也可以使用$password访问。这样虽然方便,但却也引入了较大的安全问题。自PHP 4.2起,register_globals的默认值为off。
以上是PHP表单提交数据时涉及的相关知识的一些简单介绍。为了保证PHP代码的安全,PHP表单处理程序不能忽略两个很重要的步骤:数据验证和输出转义。保证输入的信息对程序是可以接受的;保证恶意用户不会利用你的网站攻击其他的网站。
二、数据验证
需牢记的几点:
1、所有接收的数据不一定如你前端(html及javascript)约束的那样,可能会是来自电脑黑客通过手工构造的数据请求或恶意用户发现你程序漏洞的请求。
2、不同类型的表单元素留空会导致$_GET和$_POST中的元素值不尽相同。空文本框、空文本区域及空的文件上传字段的值是零长度字符串。而未选中的复选框和单选按钮,不会在$_GET和$_POST中生存任何值。浏览器通常会强迫在单选下拉列表选中一个项目,而对于多选下拉列表,如果没有选择其中的任何项,那么结果和复选框是一样的,即不会在$_GET和$_POST中生存任何值。
3、$_GET和$_POST中的值始终是字符串。例如,某人在text_price文本框中填入02201并提交了表单,那么$_POST['text_price']的值会是五位的字符串“02201”,而不是整数2201。
验证实例
1、验证必填项
使用strlen()来测试$_GET或$_POST中的元素值。出于某种偏好,很多人常用empty()代替strlen()来测试一个文本框中是否填写了值。但根据PHP的布尔值计算规则,字符0可以转换为FALSE,因此这常常会导致问题出现。例如,有人在total_val文本框中填入了0,而empty($_POST['total_val'])测试的结果会是TRUE。显然,从表单验证的角度来看这是错误的。
?
<?phpif (! strlen($_POST['keyname']) { echo 'keyname is null';}?>
?
2、数字验证
A、判断是否大于或等于零的整数,直接用ctype_digit()函数判断。
<?phpif (! ctype_digit($_POST['keyname']) { echo 'Your keyname must be a number bigger than or equal to zero.';}?>
在PHP数字验证中一种常见的做法是用is_numeric()函数来验证数字。遗憾的是,is_numeric()所认为的数字更符合计算机的特点而不是人的思维。比如说,十六进制的数字字符串0xCAFE和带指数符号的数字字符串10e40对于is_numeric()来说都是数字。
在PHP5.1之前,如果向ctype_digit()传递一个空字符串,它会返回TRUE;显然这不是我们要的结果,因此首先要验证下它是否为空。
<?phpif (! strlen($_POST['keyname']) && ! ctype_digit($_POST['keyname']) { echo 'Your keyname must be a number bigger than or equal to zero.';}?>
?
B、判断是否为正整数或负整数,可以采用提交值与值在转换成证书之后返回的字符串进行比较。
1)类型转换法验证整数
<?phpif ($_POST['keyname'] != strval(intval($_POST['keyname']))) { echo 'Your keyname must be an integer.';}?>
?intval('025')返回25,intval('-2300')返回-2300, intval('2.2')返回2, intval('-8.8')返回-8, intval('sdf')返回0.
2)类型转换法验证小数
<?phpif ($_POST['keyname'] != strval(floatval($_POST['keyname']))) { echo 'Your keyname must be an number.';}?>
?floatval('3.025')返回3.025,floatval('-23.007')返回-23.007 floatval('sdf')返回0.
3、正则表达式验证
1)字符串中只能包含数字
<?php$str = "0238";if (preg_match('/^\d+$/', $str)) { echo 'match';}?>
2)检验PHP变量名是否符合规范
<?phpfunction pregPHPVar($str) { if (preg_match('/\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/', $str)) { return 'match'; } else { return 'mismatch'; }}echo prefPHPVar('$str'); // print match;echo prefPHPVar('$1str'); // print mismatch;?>
3)邮箱验证
<?php$email = "[email protected]";if (! preg_match('/^[^0-9][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[@][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[.][a-zA-Z]{2,4}$/', $email)) { echo 'Email is invalid.';}?>
?
?
?

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

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

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

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

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

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

ホットトピック









PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

あなたが経験豊富な PHP 開発者であれば、すでにそこにいて、すでにそれを行っていると感じているかもしれません。あなたは、運用を達成するために、かなりの数のアプリケーションを開発し、数百万行のコードをデバッグし、大量のスクリプトを微調整してきました。

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。
