2011-04-02 55 views
2
$column = $_GET['id']; 
$result = mysql_query("SELECT $column FROM table"); 
echo $result; 

我正在建立一个网站与MySQL,因此试图了解SQL注入。我认为这个代码很脆弱,但我似乎无法做出正确的工作。我将如何从表'example2'拉列'这里'?这个sql查询容易被注入吗?

感谢

+0

它非常脆弱。尝试使用mysql_real_escape_string并清理变量(如果$ _GET ['id']是一个整数do $ id =(int)$ _ GET ['id']) – Khez 2011-04-02 04:11:06

+3

建议'mysql_real_escape_string_for_real_this_time'几乎不会比原来好。这是2011年。使用预先准备的语句。 – 2011-04-02 04:22:59

回答

1

将$列是这样的:

" here FROM example2 -- " 
+0

'mysql_query'不允许多个查询,所以这只会引发错误。 – Yahel 2011-04-02 04:12:40

+0

@yc我已修复它。 – 2011-04-02 04:13:07

1

如果以下文本以$ _GET ['id']的形式传递,您将有一个漏洞利用:

$_GET['id'] = '[other sql commands here]';

兼用mysql_real_escape_string()mysqli_real_escape_string()(如果你使用的是改进的界面)

+2

'mysql_query'不允许多个查询... – Yahel 2011-04-02 04:12:59

+0

@yc啊,很好赶上 – Patrick 2011-04-02 04:16:00

+0

@yc我猜你可以告诉我不是一个sql注入黑客:-) – Patrick 2011-04-02 04:17:38

6

试想$ _GET [ '身份证']等于这样的

* FROM anytable_i_want; -- 

双连字符手段你的字符串的其余部分是一个评论...所以现在你正在执行的SQL是:

SELECT * FROM anytable_i_want; 

保护这种废话的最好方法就是准备好的陈述。如果使用,说PDO接口,你做这样的事情:

$HANDLE = $PDO->prepare('SELECT ? FROM mytable'); 
$HANDLE->execute(array($_GET['id'])); 

现在不管是什么系作为$ _GET [“身份证”]它woudlnt有什么奇怪的效果。

mysql_real_escape_string会覆盖你如果使用我的mysql_系列函数,尽管如果你在运行时改变字符集,你可能会受到一些攻击。

+0

优秀的非多重查询(即适用)风险的例子! +1 – Yahel 2011-04-02 04:17:15

+0

非常感谢,我不知道我可以用双连字符评论查询的其余部分。 – user688579 2011-04-02 04:21:34

+1

函数的mysql_系列是旧的,真的不应该使用。它已被mysqli_和PDO所取代,这两者都允许准备好的语句。我个人比较喜欢PDO,但如果你在使用PHP,你应该选择其中的一种。 – Erik 2011-04-02 04:23:19