我真的不明白mysql注入?它是什么?

时间:2011-10-25 17:33:12

标签: php mysql

我对mysql或php没有经验,我一直在提及我的问题,但人们一直说你需要mysql注射保护,我已经查了一下,我真的不明白。谁能帮我?我是mysql的新手,并且遇到了一些麻烦

这是我的代码:

如何改进?当我通过右键单击该站点来查看我的源代码时,不会出现任何php / mysql。

<?php
$conn = mysql_connect("", "", "");
if (!$conn) {
  echo "Unable to connect to DB: " . mysql_error();
  exit;
}

$search = "%".$_POST["search"]."%";
$searchterm = "%".$_POST["searchterm"]."%";

if (!mysql_select_db("")) {
  echo "Unable to select mydbname: " . mysql_error();
  exit;
}

$sql = "SELECT name,lastname,email 
        FROM test_mysql
        WHERE name LIKE '%".$search."%' AND lastname LIKE '%".$searchterm."%'";
$result = mysql_query($sql);

if (!$result) {
  echo "Could not successfully run query ($sql) from DB: " . mysql_error();
  exit;
}

if(empty($_GET['search'])){ // or whatever your field's name is
  echo 'no results';
} else {
  performSearch(); // do what you're doing right now
}

if (mysql_num_rows($result) == 0) {
  echo "No rows found, nothing to print so am exiting";
  exit;
}
while ($row = mysql_fetch_assoc($result)) {
  echo '<br><br><div class="data1">';
  echo $row["name"];
  echo '</div><br><div class="data2">';
  echo $row["lastname"];
  echo '</div><br><div class="data3">';
  echo $row["email"];
  echo '</div>';
}
mysql_free_result($result);

?>

6 个答案:

答案 0 :(得分:15)

SQL注入最好由this comic汇总:

Did you really name your son Robert'); DROP TABLE Students;-- ?"

bobby-tables.com解释了如何用各种语言进行辩护。

答案 1 :(得分:5)

SQL注入是攻击的名称,但潜在的问题是输入验证不足。请使用以下代码:

$search = $_POST['search'];
$sql = "SELECT name,lastname,email
FROM   test_mysql
WHERE  name LIKE '%".$search."%'";
$result = mysql_query($sql);

如果有人在搜索表单中输入O'Reilly会怎样?

嗯,查询最终构造为:

SELECT name, lastname, email FROM test_mysql
WHERE name LIKE '%O'Reilly%'

这不是有效的SQL查询,但只会导致错误消息。因此,您的代码有问题;它无法处理包含'的输入。

现在,让我们考虑一个恶意的人,马洛里。导致错误并没有帮助Mallory以他的邪恶方式,除非他想强调阅读所有错误日志的数据库管理员。他输入:%'; INSERT INTO test_mysql name,lastname,email VALUES('mal','ory','malory@evil.com');--。现在,完整的SQL查询是

SELECT name, lastname, email FROM test_mysql
       WHERE name LIKE '%%';
INSERT INTO test_mysql name,lastname,email
       VALUES('mal','ory','malory@evil.com');
--%'

最后一行是评论而被忽略。 Mallory现在可以将任意内容写入数据库了!

请注意,这需要能够在一个MySQL中执行多个命令。如果未启用该功能,Mallory必须使用子查询和谓词。在某些情况下,Mallory不应该能够查看整个表格(例如,他应该只能在网上商店中查看他的购买,而不能查看其他客户的购买)。他只需输入' OR ''='即可查看查询的全部内容。

您可以使用escaping值保护自己,如下所示:

$search = $_POST['search'];
$sql = "SELECT name,lastname,email
FROM   test_mysql
WHERE  name LIKE '%". mysql_real_escape_string($search) ."%'";
$result = mysql_query($sql);

或者,使用PDO和prepared statements

$sql = "SELECT name,lastname,email
FROM   test_mysql
WHERE  name LIKE :search";
$statement = $pdo->execute($sql,
               array(':search' => '%' . $_POST['search'] . '%'));

答案 2 :(得分:1)

您需要使用mysql_real_escape字符串转义查询:

WHERE  name LIKE '%".mysql_real_escape_string($search)."%' AND lastname LIKE '%".mysql_real_escape_string($searchterm)."%'";

您可以在此处查看SQL注入的示例:http://www.tizag.com/mysqlTutorial/mysql-php-sql-injection.php

答案 3 :(得分:1)

请注意,您的示例代码中不仅有SQL注入,而且还有 XSS安全漏洞

代码恐怖

while ($row = mysql_fetch_assoc($result)) {
  echo '<br><br><div class="data1">';
  echo $row["name"];
  echo '</div><br><div class="data2">';
  echo $row["lastname"];
  echo '</div><br><div class="data3">';
  echo $row["email"];
  echo '</div>';
}

您正在将未经过处理的输出回显到HTML页面 如果用户在namelastname和/或email字段中输入了html代码。
他们可以将任意html注入你的页面 这称为跨服务器站点脚本或XSS。

您需要始终清理您回显的输出,如下所示:

安全代码

while ($row = mysql_fetch_assoc($result)) {
  echo '<br><br><div class="data1">';
  echo htmlentities($row["name"]);       <<-- sanitize your output!
  echo '</div><br><div class="data2">';
  echo htmlentities($row["lastname"]);
  echo '</div><br><div class="data3">';
  echo htmlentities($row["email"]);
  echo '</div>';
}

请参阅:What are the best practices for avoiding xss attacks in a PHP site

答案 4 :(得分:0)

你应该特别注意这一行:

$sql = "SELECT name,lastname,email 
FROM   test_mysql
WHERE  name LIKE '%".$search."%' AND lastname LIKE '%".$searchterm."%'";

用户可以在他们的帖子请求中发送哪些可能的值,以使其执行您不想要的操作(例如DROP the table !!)

这就是SQL注入的内容,如果没有受到保护,则可能非常有害。

答案 5 :(得分:0)

SQL注入是最终用户能够将SQL代码注入您的查询并弄乱您的数据库的地方。

例如,如果您正在运行:UPDATE users SET userID=" + userID + " WHERE id = " + id + ";;

用户可以输入“; DROP TABLE用户;因为他们对userID和SQL的输入将完全运行该查询。它无法检测到”错误“查询。

你可以通过使用参数化查询来保护自己,在PHP中有多种方法可以做,你只需谷歌“sql参数php”。