有人能解释一下SQL注入吗?它是如何导致漏洞的?SQL的注入点到底在哪里?
发布于 2009-03-02 06:43:35
当应用程序的用户能够影响数据库查询的意义时,就会发生SQL注入。当连接来自用户输入的任意字符串以创建SQL并将其提供给数据库时,通常会发生这种情况。例如,假设我们有以下代码(用PHP编写,但同样适用于任何语言),可以用来处理用户登录。
$sql = "SELECT FROM users WHERE username='".$_GET['username']."' AND password='".$_GET['password']."'";
当用户输入以下内容时,就会造成危害
administrator'; --
..。作为用户名。如果没有正确的编码,查询将变成:
SELECT * FROM users WHERE username='administrator'; -- AND password=''
这里的问题是,username中的‘关闭了username字段,然后--启动了一个SQL注释,导致数据库服务器忽略字符串的其余部分。最终结果是,用户现在可以以管理员身份登录,而不必知道密码。SQL Inection还可用于执行UPDATE、DELETE或DROP查询并真正损坏数据库。
可以通过使用参数化查询或应用您的语言/工具包的转义函数(例如PHP中的mysql_real_escape_string() )来防止SQL注入。
一旦你理解了SQL注入,你就会明白this cartoon背后的笑话。
发布于 2010-05-01 08:16:41
SQL注入是指本应是数据的东西被不情愿地当作SQL代码处理。
例如,如果您要执行以下操作
mysql_query("SELECT * FROM posts WHERE postid=$postid");
通常,它会为您提供具有给定id的post,但是假设$postid
被设置为字符串10; DROP TABLE posts --
;突然之间,您发送的实际查询是
mysql_query("SELECT * FROM posts WHERE postid=10; DROP TABLE posts --");
这是一个相当大的问题,因为你会因为一个恶意用户而丢失整个posts表--哦,天哪。
防止这种情况的最简单方法是使用预准备语句,例如通过PDO或MySQLi。
PDO中的等效示例将是
$statement = $db->prepare('SELECT * FROM posts WHERE postid = :postid');
$statement->bindValue(':postid', $postid);
$statement->execute();
这样做可以确保数据库系统知道$postid将被视为数据而不是代码,因此将得到适当的处理。
发布于 2010-05-01 07:58:57
SQL注入是恶意用户将SQL放入输入字段以尝试在您的服务器上运行SQL的地方。
我坚持的第一个建议是使用参数化的存储过程,而不是在代码中构建原始SQL。
存储过程参数不会被执行,这使得它们在大多数情况下是安全的。
https://stackoverflow.com/questions/601300
复制相似问题