我没有使用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);

?>

最佳答案

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'] . '%'));

关于php - 我真的不了解mysql注入(inject)吗?它是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7893361/

10-14 13:05
查看更多