ホームページ  >  記事  >  バックエンド開発  >  フォーム送信における PHP のフィルタリングと特殊文字の処理_PHP チュートリアル

フォーム送信における PHP のフィルタリングと特殊文字の処理_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 17:45:371228ブラウズ

前天天缘把博客文章做过一次内容批量修改,由于在源程序存在BUG,导致很多路径或代码中的反斜杠被无辜去除,昨天通过bankw3000网友的留言才发现这个问题,已做了部分修正不排除还有些路径存在问题,如果大家发现博客上存在路径丢失反斜杠\的问题,欢迎留言反馈,天缘会再做修正。天缘本文特别把PHP关于表单提交特殊字符的处理方法做个汇总,主要涉及htmlspecialchars/addslashes/stripslashes/strip_tags/mysql_real_escape_string等几个函数联合使用,与大家共同交流。
一、几个与特殊字符处理有关的PHP函数

 

 函数名

 释义

 介绍

htmlspecialchars

将与、单双引号、大于和小于号化成HTML格式

&转成& 
"转成"
' 转成'
<转成<
>转成>

htmlentities()

所有字符都转成HTML格式

除上面htmlspecialchars字符外,还包括双字节字符显示成编码等。

 

 

 

addslashes

单双引号、反斜线及NULL加上反斜线转义

被改的字符包括单引号(')、双引号(")、反斜线backslash (\) 以及空字符NULL。

stripslashes

去掉反斜线字符

去掉字符串中的反斜线字符。若是连续二个反斜线,则去掉一个,留下一个。若只有一个反斜线,就直接去掉。

 

 

 

quotemeta

加入引用符号

将字符串中含有. \\ + * ? [ ^ ] ( $ ) 等字符的前面加入反斜线"\" 符号。

nl2br()

将换行字符转成

 

strip_tags

去掉HTML及PHP标记

去掉字符串中任何HTML标记和PHP标记,包括标记封堵之间的内容。注意如果字符串HTML及PHP标签存在错误,也会返回错误。

mysql_real_escape_string

转义SQL字符串中的特殊字符

转义\x00  \n  \r  空格  \  '  " \x1a,针对多字节字符处理很有效。mysql_real_escape_string会判断字符集,mysql_escape_string则不用考虑。

 

 

其它字符串处理函数,请参考:PHP常用字符串正则替换及 剖分函数比较。
下面针对常用表单特殊字符处理进行总结:
测试字符串:
1 $dbstr='D:\test
http://www.metsky.com,天缘博客
3 \'!=\'1\' OR \'1\'


5
6
7
8 PHP 出力" ?>';
テストコード:
01 header("Content-Type: text/html; charset=UTF-8");
02 エコー」 ----------------------------------------------- ----------- -------
rn";
03 echo $dbstr."
rn------------------------------------- -------- ------------------
rn";
04 $str=fnAddSlashes($_POST['dd']);
05 echo $str."
rn------------------------------------- --- -------------------
rn";
06
07 $str = preg_replace("/s(?=s)/","\1",$str);//連続する複数のスペースのうち1つだけを保持
08 $str = str_replace("r","
",$str);
09 $str = str_replace("n","
",$str);
10 $str = preg_replace("/((
)+)/i", "
", $str);//複数の連続した
タグのみ保持1つ
11
12 $str=ストリップスラッシュ($str);
13 エコー ストリップタグ($str)."
rn--------------------------------- --------------------
rn";
14 echo htmlspecialchars($str)."
rn--------------------------------- --------------------
rn";
15 echo htmlentities($str)."
rn--------------------------------- --------------------
rn";
16 echo mysql_escape_string($str)."
rn--------------------------------- --------------------
rn";
文字列には、バックスラッシュ パス、一重引用符および二重引用符、HTML タグ、リンク、ブロックされていない HTML タグ、データベース構文許容値、JS 実行判定、PHP 実行判定、連続する複数のキャリッジ リターン、改行、スペースが含まれます。これらの概念の一部は包括的であり、以下でも同様です。
ソースコードの出力は次のとおりです (JS スクリプトが実行されます):

フォーム送信における PHP のフィルタリングと特殊文字の処理_PHP チュートリアル

2. フォーム送信データの処理
1. バックスラッシュを強制的に追加する
一部のホストではマジック クオート get_magic_quotes_gpc がデフォルトで有効になっており、一部のホストでは無効になっている場合があるため、単一引用符、二重引用符、およびバックスラッシュが含まれる文字を均一に処理できるように、プログラムにバックスラッシュを強制的に追加することが最善です。
1 関数 fnAddSlashes($data)
2{
3 If(!get_magic_quotes_gpc()) //POST/GET/cookie
からのデータにのみエスケープを追加します 4 return is_array($data)?array_map('addslashes',$data):addslashes($data);
他に5つ
6 $data を返します;
7}
関数 fnAddSlashes($data) を使用すると、結果は次のようになります (JS スクリプトは実行されませんが、HTML、JS、および PHP タグはフォールト トレラントである必要があります)。

フォーム送信における PHP のフィルタリングと特殊文字の処理_PHP チュートリアル

ストリップスラッシュ、改行置換、スペース置換を使用した結果は次のようになります:

フォーム送信における PHP のフィルタリングと特殊文字の処理_PHP チュートリアル

2. 特殊文字の処理
以下に一般的に使用される文字列処理をいくつか示します。これらは特定の状況に応じて選択できます。送信されたフォームデータは上記でエスケープされているため、内容を置換またはフィルターする必要がある場合は、関連する文字に対するアッドスラッシュの影響を考慮する必要があり、置換または検索時にバックスラッシュの追加を考慮する必要があります。 rn 置換など、他の文字置換は効果がありません。
A. 連続する複数のスペースのうち 1 つだけを保持してください
$data = preg_replace("/s(?=s)/","\1",$data );//複数の連続するスペースのうち 1 つだけを保持します
B. 復帰と改行を

に置き換えます $data = str_replace("r","
",$data );
$data = str_replace("n","
",$data );
// html のデフォルトの
はブロックされませんが、xhtml では
を使用することをお勧めします: http://stackoverflow.com/questions /1946426/ html-5-is-it-br-br-or-br
C. 複数の連続した
は 1 つだけ保持します
$data = preg_replace("/((
)+)/i", "
", $data );//複数の連続した
タグのみが保持されます。

D. すべての HTML タグをフィルタリングします
この方法では、HTML、リンク、ブロックされていない HTML タグ、JS、PHP などの潜在的に危険なタグをすべてフィルターで除外します。
関数strip_tags($data)を使用します
この機能を使用すると、すべての HTML タグ (リンクを含む)、PHP タグ、JS コードなどがフィルタリングされ、リンクの元のテキストが保持され、コンテンツの タグと href 部分のみが削除されます。 . 以下に示すように、PHP タグと JS タグは、中間のコンテンツを含めて全体として削除されます。

フォーム送信における PHP のフィルタリングと特殊文字の処理_PHP チュートリアル

E. タグをフィルタリングせず、HTML に変換するだけです

この方法では、投稿されたすべてのオリジナルコンテンツを通常のテキストとして処理します。
関数 htmlspecialchars($data) を使用します。関数が実行されると、以下に示すように、送信されたすべてのデータが通常のテキストとして表示されます。

フォーム送信における PHP のフィルタリングと特殊文字の処理_PHP チュートリアル htmlentities関数を使用した実行結果(中国語で文字化けが表示されます):

フォーム送信における PHP のフィルタリングと特殊文字の処理_PHP チュートリアル 3. データベースに書き込みます

addslashes($data) を使用した後、高度な信頼できるユーザーはデータベースに直接書き込むことができますが、addslashes は 0xbf27 で置き換えられた一重引用符をインターセプトできないため、エスケープするには mysql_real_escape_string または mysql_escape_string を使用するのが最善ですが、エスケープする前にバックスラッシュを削除する必要があります。 (addslashes がデフォルトで有効になっていると仮定します)。

01 関数 fnEscapeStr($data)
02
03{
04
05 if (get_magic_quotes_gpc())
06
07 $data= ストリップスラッシュ($value);
08}
09 $data="'".mysql_escape_string($value) ."'";
10 $data を返します;
11}
12
13 $data=fnEscapeStr($data);
実行後、次の画像が表示されます:

フォーム送信における PHP のフィルタリングと特殊文字の処理_PHP チュートリアル 4.投稿後即時表示

1. 上記でアッドスラッシュが使用されている場合は、データをエコーする前にバックスラッシュを削除する必要があります

関数stripslashes($data)を使用します
この関数は、addslashes($data) によって処理されたデータのみに適用されることに注意してください。使用しないと、バックスラッシュが失われます (Tianyuan でエラーが発生しました)。数日前、データベースを読み取るときにこの関数が使用されたため (コードが古く、変更するのを忘れていました)、データベースに再度書き込むときにパス内の多くのバックスラッシュが失われ、そうしないと記事がありません。 。
2. 関数 htmlspecialchars($data) を使用します。この関数を実行すると、リンクなどに特別な処理が許可されていない限り、送信されたすべてのデータがテキストとして表示されます。特にブロックされていない HTML タグの出力には htmlspecialchars を使用できます。フィルタリングやタグ変換を行わないと、出力でレイアウトが混乱する可能性があります。
htmlentities の使用は推奨されません。一方で、出力されるソース コードが非常に読みにくくなります。また、htmlentities 関数を使用すると、中国語などの 2 バイト文字が大量に文字化けして表示されます。 。他の文字は通常通り表示されます。
2 番目の出力方法は、不正なタグや潜在的な実行リスクがないことが確認できれば、状況に応じて直接出力することもできます。

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/478662.html技術記事一昨日、Tianyuan はソース プログラムのバグにより、昨日、bankw3000 ネチズンのコメントを通じてブログ記事の内容を一括修正しました。
前の記事:mysql.class.php リンク データベース class_PHP チュートリアル次の記事:mysql.class.php リンク データベース class_PHP チュートリアル

関連記事

続きを見る