我没有经验的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);
?>
Run Code Online (Sandbox Code Playgroud)
SQL注入是攻击的名称,但潜在的问题是输入验证不足.请使用以下代码:
$search = $_POST['search'];
$sql = "SELECT name,lastname,email
FROM test_mysql
WHERE name LIKE '%".$search."%'";
$result = mysql_query($sql);
Run Code Online (Sandbox Code Playgroud)
如果有人进入O'Reilly搜索表单会怎么样?
好吧,查询最终构造为:
SELECT name, lastname, email FROM test_mysql
WHERE name LIKE '%O'Reilly%'
Run Code Online (Sandbox Code Playgroud)
这不是有效的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');
--%'
Run Code Online (Sandbox Code Playgroud)
最后一行是注释而被忽略.Mallory现在可以将任意内容写入数据库!
请注意,这需要能够在一个MySQL中执行多个命令.如果未启用该功能,Mallory必须使用子查询和谓词.在某些情况下,Mallory不应该能够查看整个表格(例如,他应该只能在网上商店中查看他的购买,而不能查看其他客户的购买).他只需输入' OR ''='即可查看查询的全部内容.
您可以通过转义值来保护自己,如下所示:
$search = $_POST['search'];
$sql = "SELECT name,lastname,email
FROM test_mysql
WHERE name LIKE '%". mysql_real_escape_string($search) ."%'";
$result = mysql_query($sql);
Run Code Online (Sandbox Code Playgroud)
或者,使用PDO和准备好的声明:
$sql = "SELECT name,lastname,email
FROM test_mysql
WHERE name LIKE :search";
$statement = $pdo->execute($sql,
array(':search' => '%' . $_POST['search'] . '%'));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
729 次 |
| 最近记录: |