1

我有一个接受文本输入的表单。我希望它能够接受 & 和 ; 等字符 和 > 和 <,它们是用户提供的数据的有用字符。例如,我希望用户能够说

与号 (&) 被编码为 & (我从预览中看到我什至不能在这里这样做 - 它应该看起来像 & 号 (&) 被编码为 & 但我必须输入 amp;amp;在&符号之后让它看起来正确。)(顺便说一句,预览很酷,但我不能指望用户启用脚本)

我解析数据,如果有问题,我会将用户的输入以相同的形式呈现给用户,预先填写在相同的字段中,以供编辑和重新提交。

如果我呈现原始数据,我会冒着被浏览器执行恶意输入(例如脚本或 HTML)的风险。但是,如果我过滤它(例如通过 htmlspecialcharacters),那么用户将看到(表示)他输入的字符(例如,& 符号),但是当他重新提交时,他将 =actually= 正在提交替换(在这种情况下看起来像&amp;),结果它甚至包含一个&符号。如果输入仍然有问题,将再次呈现以进行编辑,我们将在替换中进入另一个层次。

仅当用户实际提交的内容与数据的净化版本相同时,才接受用户数据。它的目标是服务器上的文本文件,以及发送到网站背后组织的电子邮件。

我想“可以回答的问题”是“这可能吗?”

何塞

编辑:

<?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>

导致用户尝试使用 & 和 & amp 分号回答问题的表单。如果被拒绝(比如说,因为其他非法字符),用户会看到他的输入,减去被剥离的字符。但是, amp 分号也被从视图中删除(尽管它在源代码中)。然后,用户将尝试在显示的结果中添加另一个 amp 分号。

用户看到显示的 & amp 分号(在拒绝输入时)的唯一方法是输入 & amp 分号 amp 分号

终于满意了,用户再次点击提交,amp分号貌似又消失了。用户不知道他的(提交的)答案将被存储为什么。

我希望用户能够输入:& amp 分号,并在拒绝时看到 & amp 分号,并在接受时存储 & amp 分号

何塞

4

2 回答 2

1

是的,这在 Javascript 和服务器端代码中都是可能的。正如您所说,您不会计算启用了 javascript 的用户,我假设您想在服务器端进行这种转换?您只需让用户通过 POST 请求将表单数据发送到您的服务器端代码,然后当您将数据写回 html 响应页面时,您将每次出现的 <、>、&、" 和 ' 转​​换为它们各自的实体表单. 这将完全按照用户输入的方式显示在浏览器中。

编辑:对不起,我没有仔细阅读你的问题。您应该只能使用一级转义,即编写 & 对于'&'而不是&amp;。当浏览器解析您的页面时,这一层将被剥离,当它作为表单数据被发送回时,它将从数据中消失。查看生成的 html 代码并尝试找出是什么让您需要第二级转义。

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 回答