清理预填充的用户提供的表单输入

时间:2009-12-23 18:02:01

标签: php forms sanitize

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

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

我解析数据,如果出现问题,我会将用户的条目以相同的形式呈现给用户,并在同一字段中预先填写,以便进行编辑和重新提交。

如果我提供原始数据,我冒着浏览器执行恶意输入(如脚本或HTML)的风险。但是,如果我过滤它(例如通过htmlspecialcharacters),那么用户将会看到(他的表示)他输入的字符(例如,&符号),但是当他重新提交时,他将=实际上=提交替换(在这种情况下看起来像& 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>

会生成一个用户尝试回答问题的表单 符号 &符号和分号。 如果被拒绝(例如,由于其他非法字符),则向用户显示他的输入,减去剥离的字符。然而 一个分号 也从视图中剥离(虽然它在源中)。 然后,用户将尝试在显示的结果中添加另一个分隔符。

用户可以看到的唯一方式 &符号和分号 显示(在拒绝输入时),是输入 &符号,分号,分号,分号,

最后满意,用户再次点击提交,并且分号似乎再次消失。用户不知道他(提交的)答案将被存储为什么。

我希望用户能够输入: &符号和分号 并且,拒绝后,请参阅 &符号和分号 然后,接受,存储 &符号和分号

2 个答案:

答案 0 :(得分:1)

是的,这可以在Javascript和服务器端代码中使用。正如你所说,你不会计算启用了javascript的用户,我假设你想在服务器端进行这种转换?您只需让用户通过POST请求将表单数据发送到服务器端代码,然后在将数据写回到各自的实体表单时,将每次出现的&lt;,&gt;,&amp;,“和'转换为各自的实体形式。 html响应页面。这将在浏览器中显示与用户输入完全相同的内容。

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

Edit2以回应评论:这是一个简单的测试页面,在IE 8.0和Firefox中按预期工作。当您按下发送按钮时,您将看到在浏览器的地址栏中发送到服务器的内容(%26只是&amp;的URL编码)。你可以看到&amp; amp; amp;从值以及发送到服务器的数据中删除。

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

答案 1 :(得分:0)

将数据从PHP推送到浏览器,到任何地方的数据库时,必须将其表示更改为接收端可接受的表示。

如果要将内容发送到浏览器,则需要htmlentities转换器:

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

下进行。