1

テキスト入力を受け入れるフォームがあります。&や;などの文字を受け入れられるようにしたいと思います。および>および<。これらは、ユーザーが提供するデータに役立つ文字です。たとえば、ユーザーに次のように言ってもらいたい

アンパサンド(&)は&としてエンコードされます(プレビューから、ここではそれもできません。アンパサンド(&)は&amp;としてエンコードされているように見えますが、amp;amp;と入力する必要がありました。アンパサンドの後、正しく表示されます。)(ところで、プレビューはかっこいいですが、スクリプトが有効になっているユーザーには期待できません)

データを解析し、問題が発生した場合は、編集と再送信のために、同じフィールドに事前に入力された同じフォームでユーザーのエントリをユーザーに提示します。

生データを提示すると、ブラウザによって敵対的な入力(スクリプトやHTMLなど)が実行されるリスクがあります。ただし、(htmlspecialcharactersなどを介して)フィルタリングすると、ユーザーは入力した文字(たとえば、アンパサンド)(の表現)が表示されますが、再送信すると、=実際に=送信されます。置換(この場合は&amp;のように見えます)。これには、アンパサンドが含まれていることがわかります。それでも入力に問題がある場合は、編集のために再度表示され、置換のレベルがさらに深くなります。

ユーザーデータは、ユーザーが実際に送信したものがサニタイズされたバージョンのデータと同一である場合にのみ受け入れられます。これは、サーバー上のテキストファイルと、Webサイトの背後にある組織に送信される電子メールに送信されます。

「答えられる質問」は「これも可能か」だと思います。

ホセ

編集:

<?php
$var=$_GET["test2"];
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
 "http://www.w3.org/TR/html4/strict.dtd">

<html>
<head>
<meta content="text/html; charset=ISO-8859-1" http-equiv="content-type">

<title>Input Escape Test</title>
</head><body>
The php parser would store the following input:<br>
<?php echo $var ?>
<br>

<form method="get" action="test.php"><p>
  <label for "test2">Test - question five: <br>type in a character on the first line<br>and its HTML entity on the second line.
  <textarea name="test2" cols="50" rows="3"><?php echo  $var; ?></textarea><br/>
  <input type="submit"/>
</p></form>
</body></html>

結果は、ユーザーがアンパサンドとアンパサンドセミコロンで質問に答えようとするフォームになります。それが拒否された場合(たとえば、他の不正な文字が原因で)、ユーザーには、削除された文字を除いた入力が返されます。ただし、アンプのセミコロンも表示されません(ソースには含まれていますが)。次に、ユーザーは表示された結果に別のアンプセミコロンを追加しようとします。

ユーザーがアンパサンドセミコロンが表示されるのを確認する唯一の方法は(入力が拒否された場合)、アンパサンドセミコロンとセミコロンを入力することです。

最後に満足しました。ユーザーは[送信]をもう一度クリックすると、アンプのセミコロンが再び消えたように見えます。ユーザーは、自分の(送信された)回答がどのように保存されるかを知りません。

ユーザーが次のように入力できるようにします。アンパサンドセミコロン。拒否された場合はアンパサンドセミコロンを参照し、受け入れた場合はアンパサンドセミコロンを保存します。

ホセ

4

2 に答える 2

1

はい、これは Javascript だけでなくサーバー側のコードでも可能です。あなたが言ったように、JavaScript が有効になっているユーザーはカウントされませんが、サーバー側でこの種の変換を行いたいと思いますか? ユーザーが POST リクエストを介してサーバー側コードにフォーム データを送信するだけで、HTML 応答ページにデータを書き戻すときに、<、>、&、"、および ' のすべての出現をそれぞれのエンティティ フォームに変換できます。 . これは、ユーザーが入力したとおりにブラウザーに表示されます。

編集:申し訳ありませんが、あなたの質問を十分に注意深く読んでいませんでした。1 つのレベルのエスケープのみを使用できるようにする必要があります。&amp; ではなく「&」の場合。この 1 つのレベルは、ブラウザーがページを解析するときに取り除かれ、フォーム データとして送り返されるときにデータから消えます。生成された html コードを見て、第 2 レベルのエスケープが必要な理由を見つけてください。

Edit2 のコメントに応えて: これは、IE 8.0 と Firefox で期待どおりに動作する簡単なテスト ページです。送信ボタンを押すと、ブラウザのアドレスバーにサーバーに送信されているものが表示されます (%26 は & の URL エンコードです)。ご覧のとおり、値から、またサーバーに送信されるデータからも取り除かれます。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"><head>
<meta http-equiv="Content-type" content="text/html;charset=ISO-8859-1" />
<title>Input Escape Test</title>
</head><body>
<form method="get" action=""><p>
  <input name="test1" type="text" size="30" value="hello &amp; test"/><br/>
  <textarea name="test2" cols="50" rows="3">hello &amp; test</textarea><br/>
  <input type="submit"/>
</p></form>
</body></html>
于 2009-12-23T18:12:13.550 に答える
0

PHPから、ブラウザ、データベース、どこにでもデータをプッシュするときは、その表現を受信側が受け入れられるものに変更する必要があります。

ブラウザにデータを送信する場合は、htmlentitiesコンバータが必要です。

print "<input type='text' name='inp' value='" . htmlentities($_POST['inp']) . "'>\n";

C。

于 2009-12-23T18:22:32.517 に答える