$column = $_GET['id'];
$result = mysql_query("SELECT $column FROM table");
echo $result;
我正在用mysql构建一个网站,因此我试图了解sql注入。我认为这段代码容易受到攻击,但我似乎无法进行有效的攻击。我如何从表'example2'中拉出'here'列?
由于
答案 0 :(得分:6)
想象一下,$ _GET ['id']等于这样的
* FROM anytable_i_want; --
double hypen意味着你的字符串的其余部分是注释...所以现在你执行的sql是:
SELECT * FROM anytable_i_want;
防止这种废话的唯一最佳方法是准备好的声明。如果您使用PDO界面,则执行以下操作:
$HANDLE = $PDO->prepare('SELECT ? FROM mytable');
$HANDLE->execute(array($_GET['id']));
现在无论提交什么作为$ _GET ['id'],它都会产生任何奇怪的效果。
如果使用我的mysql_系列函数, mysql_real_escape_string
将覆盖您,尽管如果您在运行时更改字符集,可能会受到一些攻击。
答案 1 :(得分:3)
看看PDO和使用预准备语句来帮助防止SQL注入:
http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/
答案 2 :(得分:1)
使$ column类似于:
" here FROM example2 -- "
答案 3 :(得分:1)
如果以下文本作为$ _GET ['id']传递,您将获得利用:
$_GET['id'] = '[other sql commands here]';
使用mysql_real_escape_string()
或mysqli_real_escape_string()
(如果您使用的是改进的界面)