Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/243.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 此正则表达式是否为^[^\s]&35; x2B;$防止SQL注入?如果没有,如何绕过限制?_Php_Sql_Regex - Fatal编程技术网

Php 此正则表达式是否为^[^\s]&35; x2B;$防止SQL注入?如果没有,如何绕过限制?

Php 此正则表达式是否为^[^\s]&35; x2B;$防止SQL注入?如果没有,如何绕过限制?,php,sql,regex,Php,Sql,Regex,用于检查用户输入,如用户名而不是登录帐户。不确定为什么您希望找到一个正则表达式来阻止SQL注入,而实际上您可以使用专门设计用于阻止SQL注入的函数,即mysql\u real\u escape\u string() 现在,您可能希望限制用户名中的字符(类型和/或数字),但这是一个完全不同的问题。或者至少应该是这样。不知道为什么您希望找到一个能够阻止SQL注入的正则表达式,而实际上您可以使用一个专门为阻止SQL注入而设计的函数,即mysql\u real\u escape\u string() 现

用于检查用户输入,如用户名而不是登录帐户。

不确定为什么您希望找到一个正则表达式来阻止SQL注入,而实际上您可以使用专门设计用于阻止SQL注入的函数,即
mysql\u real\u escape\u string()


现在,您可能希望限制用户名中的字符(类型和/或数字),但这是一个完全不同的问题。或者至少应该是这样。

不知道为什么您希望找到一个能够阻止SQL注入的正则表达式,而实际上您可以使用一个专门为阻止SQL注入而设计的函数,即
mysql\u real\u escape\u string()


现在,您可能希望限制用户名中的字符(类型和/或数字),但这是一个完全不同的问题。或者至少应该是这样。

否。为了防止SQL注入,不要使用字符串来构建查询。使用参数。

否。要防止SQL注入,请不要使用字符串生成查询。使用参数。

仔细阅读准备好的语句。这是避免SQL注入的最佳方法之一。mysqliforphp和ADO.NET都支持它。

阅读准备好的语句。这是避免SQL注入的最佳方法之一。mysqli for PHP和ADO.NET都支持它。

为了防止SQL注入,应该使用参数,而不是将用户输入直接放入SQL。或者,您可以使用一些对象关系映射器,该映射器也在内部执行此操作


这样,您就不需要关心用户输入中的“邪恶”字符。(当然,对用户输入进行额外验证不会有什么坏处。)

为了防止SQL注入,您应该使用参数,而不是将用户输入直接放入SQL。或者,您可以使用一些对象关系映射器,该映射器也在内部执行此操作


这样,您就不需要关心用户输入中的“邪恶”字符。(当然,对用户输入进行额外验证不会有什么坏处。)

不,很抱歉,您的regexp对SQL注入没有多大帮助。让我们来看一些SQL注入:

首先,假设您将SQL命令创建为字符串,例如:

snprintf(sqlcommand,dimensionof(sqlcommand),“插入用户(用户名、密码)值('%s','%s')”,用户名、密码);

SQL注入的问题在于,用户可以创建一个输入值(在本例中为用户名或密码),这会导致生成的SQL命令执行与预期不同的操作。例如,如果用户名为“aardvark',“f');DROP/**/TABLE/**/users;--”,则生成的SQL语句将变为:

插入用户(用户名、密码)值('aardvark','f');DROP/**/TABLE/**/users;--','密码(U值)')

因此,您的正则表达式遗漏了几点:

  • 从SQL字符串中“中断”的常用方法涉及未替换的单引号字符
  • /**/是分隔符,但不是空格
您不应该修复该正则表达式。正如其他人所回答的,这种过滤输入的方法是危险的。至少,您可以调用Cletus推荐的
mysql\u real\u escape\u string()

然而,jishi和Mark Byers有最好的答案:使用参数化SQL查询,而不是通过字符串操作构造SQL查询。与处理输入数据以转义所需字符相比,这种方法是绝对正确的


请接受jishi或Mark Byers的回答,因为他们是最早也是最正确的。

不,您的regexp对SQL注入没有多大帮助,我很抱歉。让我们来看一些SQL注入:

首先,假设您将SQL命令创建为字符串,例如:

snprintf(sqlcommand,dimensionof(sqlcommand),“插入用户(用户名、密码)值('%s','%s')”,用户名、密码);

SQL注入的问题在于,用户可以创建一个输入值(在本例中为用户名或密码),这会导致生成的SQL命令执行与预期不同的操作。例如,如果用户名为“aardvark',“f');DROP/**/TABLE/**/users;--”,则生成的SQL语句将变为:

插入用户(用户名、密码)值('aardvark','f');DROP/**/TABLE/**/users;--','密码(U值)')

因此,您的正则表达式遗漏了几点:

  • 从SQL字符串中“中断”的常用方法涉及未替换的单引号字符
  • /**/是分隔符,但不是空格
您不应该修复该正则表达式。正如其他人所回答的,这种过滤输入的方法是危险的。至少,您可以调用Cletus推荐的
mysql\u real\u escape\u string()

然而,jishi和Mark Byers有最好的答案:使用参数化SQL查询,而不是通过字符串操作构造SQL查询。与处理输入数据以转义所需字符相比,这种方法是绝对正确的


请接受jishi或Mark Byers的答案,因为它们是最早也是最正确的。

永远不要使用正则表达式过滤掉SQL字符串-你会失败的。使用事先准备好的语句。以下是使用PDO时的一个示例:

$sql = "
    SELECT * FROM users
    WHERE login = :l AND password = :p
";
$pdo = new PDO($dsn, $dbUser, $dbPassword);
$stmt = $pdo->prepare($sql);
$stmt->bindValue('l', $_POST['login']);
$stmt->bindValue('p', md5($_POST['password']));
$stmt->execute();
print_r($stmt->fetch());
这看起来可能需要更多的类型,但这是清理SQL字符串的唯一安全方法。而且,无论如何,您应该使用某种关系映射器来隐藏低级数据库操作(也称为无聊的东西)


请阅读php.net上的详细信息。

切勿使用正则表达式过滤SQL字符串-您将失败得很惨。使用事先准备好的语句。以下是使用PDO时的一个示例:

$sql = "
    SELECT * FROM users
    WHERE login = :l AND password = :p
";
$pdo = new PDO($dsn, $dbUser, $dbPassword);
$stmt = $pdo->prepare($sql);
$stmt->bindValue('l', $_POST['login']);
$stmt->bindValue('p', md5($_POST['password']));
$stmt->execute();
print_r($stmt->fetch());
这看起来可能需要更多的打字,但这是唯一安全的方法