正则表达式 - 让任何不是'或'的角色通过

时间:2014-04-17 04:20:39

标签: php mysql regex

我正在尝试学习正则表达式而我无法找到一种方法来制作它以便我允许任何字符(字母,数字,空格,_或特殊字符,如é,à等),但我不这样做让任何事情都可能导致MySQL注入,例如'或;有没有办法做到这一点?

我试过了:

if (preg_match("/^[^0-9][A-z0-9_]$/", $name)) {
    echo "YAY IT WORKED!";
}

但是那天我的工作没有得到回应

4 个答案:

答案 0 :(得分:4)

使用Prepared Statements来避免SQL注入。

  

如果应用程序专门使用预准备语句,开发人员可以确保不会发生SQL注入

如何使用

$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
$stmt->bindParam(1, $name);
$stmt->bindParam(2, $value);

答案 1 :(得分:3)

你可能想要PDO,但在这里:

$name = mysqli_reql_escape_string($mysqli_connection, $name);

不要拒绝输入,只是逃避它。

答案 2 :(得分:0)

正如其他人所说,你确实想要使用预备语句。但是,你可能仍然想要学习其他东西的正则表达式。现在你的正则表达式看起来像这样:"输入的开头,一个不是0-9的字符,一个字符,它是A-z,0-9或_,然后是输入结束。"如果你想要一个正则表达式,它只是告诉你字符串中是否有字符而不是',"或;,只需执行:/[^'";]/。还要注意,我不确定A-z是否适用于PHP;我不会推荐它,因为我觉得它在其他地方都不起作用。

答案 3 :(得分:0)

其他人提到这不是SQL注入保护的最佳方法。但是,在学习正则表达式方面,您可以使用以下函数将字符串'foo'bar;转换为foobar

function sanitize($input="'foo'bar;"){
    $output=preg_split("('|;)",$input);
    $output=implode("",$output);
    return $output;
}

preg_split中的正则表达式使用|作为OR运算符,因此您可以根据需要列出任意数量的字符。 preg_split将输入字符串拆分为数组,然后implode将数组合并回一个字符串,而不包含任何正则表达式匹配的字符。