有效的电子邮件地址 - XSS 和 SQL 注入

Posted

技术标签:

【中文标题】有效的电子邮件地址 - XSS 和 SQL 注入【英文标题】:Valid Email Addresses - XSS and SQL Injection 【发布时间】:2011-02-24 19:12:17 【问题描述】:

既然电子邮件地址有这么多有效字符,那么是否有任何有效电子邮件地址本身可以是 XSS 攻击或 SQL 注入?我在网上找不到这方面的任何信息。

电子邮件地址的本地部分 可以使用以下任何 ASCII 字符:

大写和小写英文字母(a-z、A-Z) 数字 0 到 9 字符! # $ % & ' * + - / = ? ^ _ ` | ~ 字符。 (点、句号、句号)只要不是最后一个 字符,并且还提供它不出现两个或 连续多次(例如 John..Doe@example.com)。

http://en.wikipedia.org/wiki/E-mail_address#RFC_specification

我不是在问如何防止这些攻击(我已经在使用参数化查询和转义/html 净化器),这更像是一个概念验证。

首先想到的是'OR 1=1--@gmail.com,除了不允许有空格。所有 SQL 注入都需要空格吗?

【问题讨论】:

【参考方案1】:

但是,如果用引号括起来,则允许使用空格,因此"'OR 1=1--"@gmail.com 是有效的电子邮件地址。此外,这可能不是一个问题,但从技术上讲,这些都是有效的电子邮件地址:

' BAD SQL STUFF -- <fake@ryanbrunner.com>
fake@ryanbrunner.com (' BAD SQL STUFF --)

即使这不可能,您仍然没有理由不使用参数化查询并对所有显示给用户的用户输入数据进行编码。

【讨论】:

可以使用isemail.info 来检查您喜欢的任何电子邮件地址,或者只是通过过滤器验证电子邮件等php 函数对可注入电子邮件地址进行过滤器测试。根据isemail.info,第一个地址是无效的,第二个地址是“地址在邮件内有效但不能原封不动地用于信封” 不仅没有理由不使用参数化查询,还有其他原因,而不仅仅是使用它们的安全性。尽管在电子邮件中不常见,但我发现有大量合法的用户提交的数据包含注入攻击中通常使用的引号或其他封装字符,这将使用非参数化查询生成错误或失败的查询。我唯一一次使用非参数化查询是数据本身是否被限制为适当的类型,比如整数,或者很少是严格的字母数字字符串。【参考方案2】:
/^[a-z0-9.-_+]@[a-z0-9.-]$/i

我认为匹配所有电子邮件地址的 99.9999% ;)

【讨论】:

顺便说一句。那只是为了验证文本是否包含 xss/sql 注入等 - 它不是验证电子邮件地址的方法。

以上是关于有效的电子邮件地址 - XSS 和 SQL 注入的主要内容,如果未能解决你的问题,请参考以下文章

防止XSS注入的方法

XSS SQL CSRF

如何实现php的安全最大化?怎样避免sql注入漏洞和xss跨站脚本攻击漏洞

sql注入和xss注入有什么不一样呢?

SiteLock SQL 注入和 XSS 扫描失败

常用正则表达式大全(Xss防范sql注入手机邮箱验证等等,持续补充~)