【发布时间】:2016-05-01 16:52:13
【问题描述】:
我正在努力学习 SQL 注入,以便将来保护自己。
这是 PHP 代码:
$req = mysql_query("INSERT INTO ip_change VALUES('', '".$_SESSION['id']."', '".$_POST['raison']."')") or die(mysql_error());
并且用户可以完全控制 $_POST['raison'] 内容。
当我使用 'hello 作为 $_POST['raison'] 值时,我得到
您的 SQL 语法有错误;检查手册 对应于您的 MySQL 服务器版本,以便使用正确的语法 在第 1 行的'hello')' 附近
当我使用 '); DELETE * FROM tabledetest;") or die(mysql_error());-- 作为 $_POST['raison'] 值时,我得到
您的 SQL 语法有错误;检查手册 对应于您的 MySQL 服务器版本,以便使用正确的语法 在'DELETE * FROM tabledetest;") 或 die(mysql_error());--')' 附近 1
所以我不明白为什么我的请求没有被注入并且我无法删除我的 tabledetest 表。
任何帮助将不胜感激。
【问题讨论】:
-
你应该停止使用
mysql,开始使用mysqli或PDO。 -
@Amous 讽刺的是,就本练习而言,它实际上是最好的工具。这是出了名的缺陷。
-
mysql_query接口非常糟糕,以至于它在 PHP 7 中被删除。如果您尝试编写安全代码,您必须使用类似mysqli或 PDO以准备好的语句作为绝对最低限度。通常最好使用像 Doctrine 或 Propel 这样的 ORM 来包裹您的数据库,这会使开发更加愉快,或者更好的是,使用像 Laravel 这样的 development framework 这样可以为您提供更多支持。 -
来自
mysql_query()的文档 - mysql_query() 发送一个唯一查询(不支持多个查询)。这就是第二个代码失败的原因,因为mysql_query()只允许 1 个查询,所以;之后的任何内容都会抛出错误 -
默认情况下您不能运行多个命令,想象一下:
SELECT * FROM user WHERE username = '{$_POST['username']}' AND email = '{$_POST['email']}'。现在,这应该是安全的,因为用户需要知道用户名和电子邮件,但是admin' --的用户名意味着我们不必知道管理员电子邮件,因为--将使查询的其余部分成为评论.您还可以开始加入其他表并获取您不允许查看的信息。