我正在构建一个新的网络应用程序,LAMP 环境......我想知道 preg_match 是否可以信任所有基于文本的字段(也不是 HTML 字段;电话,姓名)的用户输入验证(当然是准备好的 stmt) , 姓氏等..)。
例如,对于经典的“电子邮件字段”,如果我检查如下输入:
$email_pattern = "/^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)" .
"|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}" .
"|[0-9]{1,3})(\]?)$/";
$email = $_POST['email'];
if(preg_match($email_pattern, $email)){
//go on, prepare stmt, execute, etc...
}else{
//email not valid! do nothing except warn the user
}
我可以对 SQL/XXS 注入轻松入睡吗?
我将正则表达式编写得尽可能严格。
编辑:如前所述,我确实使用了准备好的语句,并且这种行为仅适用于基于文本的字段(如电话、电子邮件、姓名、姓氏等),因此不允许包含 HTML(对于 HTML 字段,我使用 HTMLpurifier)。
实际上,我的任务是仅在输入值与我的 regexp-white-list 匹配时才让其传递;否则,将其返回给用户。
ps: : 我正在寻找没有 mysql_real_escape_strings 的东西;可能该项目将来会切换到Postgresql,所以需要一个跨数据库的验证方法;)