如果我不写入数据库,我应该如何清理用户输入?

How should I clean user input if I am not writing to a databse?

我有一个带有文本区域的简单网页,当输入多行制表符分隔的文本时,php 脚本会处理文本并将生成的字符串作为文本文件输出,供用户下载。

页面本身不过是一个文本区域和一个 post 提交按钮。如果收到 post 数据,它基本上会在文本框中创建一个文本行数组(使用 explode("\n",$text),然后遍历每一行并创建该行中每个文本部分的数组(使用explode("\t",$text)。最后,它获取数组中的每个元素并用它构造一个字符串。脚本中唯一使用的其他 php 函数是 date 函数和 strtotime与几个 foreach 语句一起运行。

当字符串完成后,使用几个 header() 函数(Content-Disposition: attachment;Content-Type: 等)将字符串作为文本文件发送到浏览器。所以,假设 $str 是字符串,这是它发送到浏览器的方式:

header('Content-Disposition: attachment; filename="file.txt"')
header('Content-Type: text/plain'); 
header('Content-Length: ' . strlen($str));
echo $str;
exit();

例如,假设提供的文本是这样的(假装文本之间的空格是制表符)

John    Smith    Freshman
Jane    Doe      Sophomore

然后脚本创建一个字符串如下:

Student:\nfirstname:John\nlastname:Smith\nYear:Freshman\nEndStudent\nStudent:\nfirstname:Jane\nlastname:Doe\nYear:Sophomore\nEndStudent\n

然后该脚本作为 text/plain 文件发送到浏览器。

脚本运行良好,输出文件正确。我的问题是我让自己打开了什么样的安全漏洞,是否有可能关闭它们(以及如何关闭它们)。我希望页面为 public.

因为您从不解释文本并执行任何代码以响应说明 在文本中找到,这里绝对没有安全问题。

您唯一需要注意的是特殊字符的使用:您的输出使用具有特定含义的特定字符,即\n。如果您的输入包含一个 \n,并且您按原样将该槽传递给输出,您的输出的含义会改变吗?也许您需要 转义删除 在输入中找到的任何 \n