如果已经使用 FILTER_VALIDATE_EMAIL,FILTER_SANITIZE_EMAIL 是否毫无意义?
我只是创建一个注册表单,我只想将有效且安全的电子邮件插入数据库。
为了安全起见,一些站点(包括 w3schools)建议先运行 FILTER_SANITIZE_EMAIL,然后再运行 FILTER_VALIDATE_EMAIL;但是,这可能会将提交的电子邮件从无效电子邮件更改为有效电子邮件,这可能不是用户想要的,例如:
用户的电子邮件地址 [email protected],但意外插入jeff"@gmail.com。FILTER_SANITIZE_EMAIL
将删除 ",使电子邮件[电子邮件受保护]< /a> FILTER_VALIDATE_EMAIL 会说是有效的尽管这不是用户的实际电子邮件地址。
为了避免此问题,我计划仅运行 FILTER_VALIDATE_EMAIL。 (假设我不打算输出/处理任何声明无效的电子邮件)
这将告诉我该电子邮件是否有效。如果是,则无需通过 FILTER_SANITIZE_EMAIL 传递它,因为任何非法/不安全字符都会导致电子邮件返回无效,对吗?
我也不知道有任何经 FILTER_VALIDATE_EMAIL 批准为有效的电子邮件可用于注入/xss,因为空格、括号 () 和分号会使电子邮件无效。还是我错了?
(注意:除此之外,我将使用准备好的语句插入数据,我只是想澄清这一点)
I am just creating a registration form, and I am looking only to insert valid and safe emails into the database.
Several sites (including w3schools) recommend running FILTER_SANITIZE_EMAIL before running FILTER_VALIDATE_EMAIL to be safe; however, this could change the submitted email from an invalid into a valid email, which could not be what the user wanted, for example:
The user has the email address [email protected], but accidentally inserts jeff"@gmail.com.
FILTER_SANITIZE_EMAIL would remove the " making the email [email protected] which FILTER_VALIDATE_EMAIL would say is valid even though it's not the user's actual email address.
To avoid this problem, I plan only to run FILTER_VALIDATE_EMAIL. (assuming I don't intend to output/process any emails declared invalid)
This will tell me whether or not the email is valid. If it is then there should be no need to pass it through FILTER_SANITIZE_EMAIL because any illegal/unsafe characters, would've already caused the email to be returned invalid, correct?
I also don't know of any email approved as valid by FILTER_VALIDATE_EMAIL that could be used for injection/xss due to the fact that white spaces, parentheses () and semicolons would invalidate the email. Or am I wrong?
(note: I will be using prepared statements to insert the data in addition to this, I just wanted to clear this up)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
以下是仅插入有效电子邮件的方法。
FILTER_VALIDATE_EMAIL
和FILTER_SANITIZE_EMAIL
都是有价值的函数,并且有不同的用途。验证正在测试电子邮件的格式是否有效。
清理是指清除电子邮件中的不良字符。
PHP 是开源的,所以这些问题只要使用它就可以轻松回答。
FILTER_SANITIZE_EMAIL 来源:
来源FILTER_VALIDATE_EMAIL:
Here's how to insert only valid emails.
FILTER_VALIDATE_EMAIL
andFILTER_SANITIZE_EMAIL
are both valuable functions and have different uses.Validation is testing if the email is a valid format.
Sanitizing is to clean the bad characters out of the email.
PHP is open source, so these questions are easily answered by just using it.
Source for FILTER_SANITIZE_EMAIL:
Source for FILTER_VALIDATE_EMAIL:
我读了同一篇文章并想到了同样的事情:简单地更改无效变量是不够的。我们需要实际告诉用户存在问题,而不是仅仅忽略它。我认为,解决方案是将原始版本与经过净化的版本进行比较。即使用 w3schools 示例,只需添加:
I read the same article and thought the same thing: Simply changing an invalid variable is not good enough. We need to actually tell the user that there was a problem, instead of just ignoring it. The solution, I think, is to compare the original to the sanitized version. I.e. to use the w3schools example, just add:
执行此操作的“正确”方法是两次询问用户的电子邮件(这是常见/良好的做法)。但要回答您的问题,
FILTER_SANITIZE_EMAIL
并不是毫无意义的。它是一个可以清理电子邮件的过滤器,而且它的工作效果很好。您需要了解验证的过滤器要么返回< code>true 或
false
而过滤器 清理 实际上修改给定的变量。两者的目的不同。The "proper" way of doing this is asking for the user's email two times (which is common/good practice). But to answer your question,
FILTER_SANITIZE_EMAIL
is not pointless. It's a filter that sanitizes emails and it does its job well.You need to understand that a filter that validates either returns
true
orfalse
whereas a filter that sanitizes actually modifies the given variable. The two do not serve the same purpose.始终在输入时尽早使用验证过滤器,而清理最好在输出后期使用,因为它会在值到达用户之前清理该值
always use validation filters early at moment of input, while sanitization is better used late in output as it clean the value before it reach the user