我可以对此代码执行SQL注入吗?

时间:2011-01-28 17:47:25

标签: php sql mysql database sql-injection

我还在学习SQL注入,但总是最好的方法是使用示例,所以这是我的代码的一部分:

$sql = "INSERT INTO `comments` (`id`, `idpost`, `comment`, `datetime`, `author`, `active`) 
        VALUES (NULL, '" . addslashes($_POST['idcomment']) . "', '" . 
        addslashes($_POST['comment']) . "', NOW(), '" . 
        addslashes($_POST['name']) . "', '1');";

  mysql_query($sql);

知道用户输入的所有POST变量,你能告诉我如何注入这个脚本吗?所以我可以更多地了解这个漏洞。谢谢!

我的数据库服务器是MySQL。

4 个答案:

答案 0 :(得分:5)

请勿使用addslashes(),请始终使用mysql_real_escape_string()。已知有edge cases where addslashes() is not enough

如果从头开始新的东西,最好使用支持PDO或mysqli等预处理语句的数据库包装器。

答案 1 :(得分:3)

其他大多数答案似乎完全忽略了这个问题。

那就是说,基于你上面的例子(尽管你的代码没有遵循mysql_real_escape_string()的最佳实践用法),当你使用addslashes()时,我无法注入任何真正有害的东西。

但是,如果您要省略它,用户可以在name字段中输入一个字符串,如下所示:

some name'; DROP TABLE comments; --

目标是结束当前语句,然后执行自己的语句。 --是一个注释,用于确保在处理注入的字符串后通常不会发生任何事情。

然而(再次),我的理解是MySQL默认在单个语句执行结束时自动关闭数据库连接。因此,即使我确实试图删除一个表,MySQL也会导致第二个语句失败。

但这不是唯一的SQL注入类型,我建议阅读更多有关该主题的内容。我的研究从dev.mysql.com发现了这个文件非常好:http://dev.mysql.com/tech-resources/articles/guide-to-php-security-ch3.pdf

<小时/> 编辑,另一个想法:

根据数据进入数据库后发生的情况,我可能根本不想注入任何SQL。我可能想要在Cross-Site Scripting (XSS)攻击中将数据发布回网页时注入一些运行的HTML / JavaScript。这也是值得注意的事情。

答案 2 :(得分:1)

如前所述,字符串 ,使用mysql_real_escape_string()代替addslashes(),但代表整数,使用intval()

/* little code cleanup */

$idcomment = intval($_POST['idcomment']);
$comment = mysql_real_escape_string($_POST['comment']);
$name = mysql_real_escape_string($_POST['name']);

$sql = "INSERT INTO comments (idpost, comment, datetime, author, active)
        VALUES ($idcomment, '$comment', NOW(), '$name', 1)";

mysql_query($sql);

答案 3 :(得分:0)

Addslashes仅处理引号。

但是这里有一些更重要的案例:

Be careful on whether you use double or single quotes when creating the string to be escaped:

$test = 'This is one line\r\nand this is another\r\nand this line has\ta tab';

echo $test;
echo "\r\n\r\n";
echo addslashes($test);

$test = "This is one line\r\nand this is another\r\nand this line has\ta tab";

echo $test;
echo "\r\n\r\n";
echo addslashes($test);

另一个:

In particular, MySQL wants \n, \r and \x1a escaped which addslashes does NOT do. Therefore relying on addslashes is not a good idea at all and may make your code vulnerable to security risks.

还有一个:

Be very careful when using addslashes and stripslashes in combination with regular expression that will be stored in a MySQL database. Especially when the regular expression contain escape characters!

To store a regular expression with escape characters in a MySQL database you use addslashes. For example:

$l_reg_exp = addslashes( �[\x00-\x1F]� );

After this the variable $l_reg_exp will contain: [\\x00-\\x1F].

When you store this regular expression in a MySQL database, the regular expression in the database becomes [\x00-\x1F].

When you retrieve the regular expression from the MySQL database and apply the PHP function stripslashes(), the single backslashes will be gone!

The regular expression will become [x00-x1F] and your regular expression might not work!

请记住,魔法可能发生在:

  • addslashes可能会错过某事
  • 添加到数据库之前
  • 从数据库中检索后

你的例子只是一个摘录。 尚未

可能无法看到真正的问题

(基于来自php.net的评论,这些评论通常比手册本身更有价值)