假设我们只期望用户发送数据的字符串或数字。使用ereg和preg_match函数检查数据是否足够安全?有没有办法伪造它们?我们还应该使用mysql_real_escape_string吗?
答案 0 :(得分:3)
答案 1 :(得分:1)
足够安全与您自己的需求相关。如果您出于某种原因想要避免使用mysql_real_escape_string,那么我首先要问为什么。
我的回答是:确定......取决于你的条件
你可以预先与[0-9a-z]比赛,没有什么可担心的。尝试传递多字节字符是安全的。只要你的条件不允许你做任何事情,如果匹配不符合你的要求那么我就知道在这样一个严格的规则中不会使用恶意字符。
但术语“字符串”非常开放。这包括标点符号吗?什么样的,等等。如果你允许标准注入字符作为你所谓的“字符串”,那么我的答案就不再确定了。
但是我仍然建议所有用户提交的信息都使用mysql_real_escape_string(),无论你如何手动净化它。
答案 2 :(得分:0)
如果使用正则表达式匹配有效输入,并且成功,则用户输入有效。话虽这么说,如果您在有效输入中没有任何恶意字符(特别是引号或可能是多字节字符),那么您不需要调用mysql_real_escape_string
。同样的原则适用于:
$user_in_num = intval( $_POST['in_num']); // Don't need mysql_real_escape_string here
如下所示:
$subject = $_POST['string_input'];
if( !preg_match('/[^a-z0-9]/i', $subject))
{
exit( 'Invalid input');
}
$subject
成功后,在SQL查询中使用preg_match
是完全正确的。