这个查询容易受到sql注入吗?

时间:2010-03-16 16:24:11

标签: php sql sql-injection

$myq = sprintf("select user from table where user='%s'", $_POST["user"]);

我想知道是否可以使用SQL注入利用上述查询。是否有任何高级SQL注入技术可能会破坏此特定查询的sprintf

8 个答案:

答案 0 :(得分:25)

我认为不需要特别先进......尝试输入

' OR 1 = 1 OR user='

换句话说,你将获得SQL:

select user from table where user='' OR 1 = 1 OR user=''

这看起来像你真正想要执行的查询吗? (现在考虑它可能会丢弃表格,或类似的东西。)

最重要的是你应该使用参数化查询。

答案 1 :(得分:8)

使用sprintf并不能提供比使用简单字符串连接更多的保护sprintf的优势在于它比使用简单的PHP字符串连接时更具可读性。但是sprintf在使用%s格式时不会做简单的字符串连接:

$str = implode('', range("\x00", "\xFF"));        // string of characters from 0x00 – 0xFF
var_dump(sprintf("'%s'", $str) === "'".$str."'"); // true

你需要使用那些逃避你想要插入数据的上下文特殊字符的函数(在这种情况下为string declaration in MySQL,假设你正在使用MySQL),如**mysql_real_escape_string**那样:

$myq = sprintf("select user from table where user='%s'", mysql_real_escape_string($_POST["user"]));

答案 2 :(得分:8)

是的,我会说你有潜在的问题:)

need to escape\x00, \n, \r, \, ', "\x1asprintf() does not do thatsprintf()不对字符串进行修改,它只是根据您指定的格式将您提供的任何可变参数扩展到您提供的缓冲区中。

如果正在转换字符串,则可能是magic quotes(评论中注明为Rob),而不是sprintf()。如果是这种情况,我高度建议禁用它们。

答案 3 :(得分:4)

当$ _POST [“user”]等于“'; SHUTDOWN;” - 会发生什么?

答案 4 :(得分:1)

啊,我来到这个神奇的答案! :)
magic quotes为你逃跑!

所以,你必须关闭magic_quotes_gpc ini指令 然后按照建议使用mysql_real_escape_string。

答案 5 :(得分:1)

实际上,请关闭魔术引号。

在PHP中,在适当的地方使用过滤器:

$inUser = $_POST['user'];
$outUser = filter_var($inUser, FILTER_SANITIZE_STRING);

过滤掉HTML标记并转义各种字符。

此外,您可以让数据库为您转义:

$inUser = $_POST['user'];
$outUser = mysqli_real_escape_string($conn, $inUser);

这会逃脱MySQL特定的特殊字符,如双引号,单引号等。

最后,您应该使用参数化查询:

$sql = "SELECT user FROM table WHERE user = ?";
$stmt = $pdo->prepare($sql);
$params = array($outUser);
$stmt->execute($params);

参数化查询会自动在字符串等周围添加引号,并且还有进一步限制使SQL注入更加困难。

我按顺序使用这三个。

答案 6 :(得分:0)

$_POST["user"] = "' or 1=1 or user='"

答案 7 :(得分:0)

如果有人在您的表单中输入以下内容:

'; delete * from table