0

我正在编写一个邮件表单,以允许用户从联系 PHP 页面发送电子邮件。

我使用正则表达式来验证电子邮件地址并对不同的字段进行大量检查。

如果用户犯了“错误”,表单将跳转到第二页,回显所有字段(那些可以的和不可以的)并在问题所在的地方以红色显示(“您忘记填写验证码” ,“你忘了填写你的名字”,等等......)。由于<input type='text'>' 值中的 $_SESSION 完成了字段的回显

一切都很顺利,直到我想到输入一个包含单引号的电子邮件地址(因为它是有效的)

问题 1: 我们的老朋友jim_o'brien在回显时变成了 jim_o

问题 2: 由于我想将电子邮件的发送限制为每 24 小时发送 1 封,因此我会在数据库中检查 Ip 地址或...电子邮件地址在不到 24 小时前已经被记录,这里 => SQL SELECT 失败

问题

  • 这两种现象的原因是什么?
  • 是否不可能接受电子邮件中的单引号并同时进行我想要的支票?
  • 附带问题:在 XSS 或 SQL 注入中有用的字符是什么,同时在电子邮件地址中被禁止?

非常感谢。

4

2 回答 2

0

问题 1:您应该将单引号转换为 html 实体。将单引号替换为&lsquo ;. 但是最后一个字符和分号之间没有空格。

于 2012-10-18T21:53:28.417 回答
0

问题 1. 我假设您将地址插入到元素的value标签中。<input/>于是就变成了<input type='text' value='jim_o'brien'/>。你看到那里的报价有问题吗?它正在终止价值。解决方案是使用以下htmlentities()功能:

echo "<input type='text' value='".htmlentities($_SESSION['email'], ENT_QUOTES)."'/>";

这也应该可以保护您免受 XSS 注入。

问题 2。您没有显示查询数据库的代码,但听起来您可能也没有正确处理那里的引号。如果您使用准备好的语句,这应该不是问题,它会保护您免受 SQL 注入。如果您仍在使用 mysql_XXX 函数,因此您不能使用准备好的语句,请mysql_real_escape_string()在插入 SQL 的所有用户输入上使用。

您可以从RFC 5322获取电子邮件地址的完整语法。

于 2012-10-18T22:02:21.190 回答