$column = $_GET['id'];
$result = mysql_query("SELECT $column FROM table");
echo $result;
我正在建立一个网站与MySQL,因此试图了解SQL注入。我认为这个代码很脆弱,但我似乎无法做出正确的工作。我将如何从表'example2'拉列'这里'?这个sql查询容易被注入吗?
感谢
$column = $_GET['id'];
$result = mysql_query("SELECT $column FROM table");
echo $result;
我正在建立一个网站与MySQL,因此试图了解SQL注入。我认为这个代码很脆弱,但我似乎无法做出正确的工作。我将如何从表'example2'拉列'这里'?这个sql查询容易被注入吗?
感谢
看看PDO和使用准备好的语句,以帮助防止SQL注入的:
http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/
将$列是这样的:
" here FROM example2 -- "
'mysql_query'不允许多个查询,所以这只会引发错误。 – Yahel 2011-04-02 04:12:40
@yc我已修复它。 – 2011-04-02 04:13:07
如果以下文本以$ _GET ['id']的形式传递,您将有一个漏洞利用:
$_GET['id'] = '[other sql commands here]';
兼用mysql_real_escape_string()
或mysqli_real_escape_string()
(如果你使用的是改进的界面)
试想$ _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_系列函数,尽管如果你在运行时改变字符集,你可能会受到一些攻击。
优秀的非多重查询(即适用)风险的例子! +1 – Yahel 2011-04-02 04:17:15
非常感谢,我不知道我可以用双连字符评论查询的其余部分。 – user688579 2011-04-02 04:21:34
函数的mysql_系列是旧的,真的不应该使用。它已被mysqli_和PDO所取代,这两者都允许准备好的语句。我个人比较喜欢PDO,但如果你在使用PHP,你应该选择其中的一种。 – Erik 2011-04-02 04:23:19
它非常脆弱。尝试使用mysql_real_escape_string并清理变量(如果$ _GET ['id']是一个整数do $ id =(int)$ _ GET ['id']) – Khez 2011-04-02 04:11:06
建议'mysql_real_escape_string_for_real_this_time'几乎不会比原来好。这是2011年。使用预先准备的语句。 – 2011-04-02 04:22:59