php - SQL 准备语句 (PHP)

标签 php mysql

我想了解 SQL 注入(inject)的工作原理,以及如何防止它。 HTML 登录页面包含一个表单,作为一个表格,带有用户名和密码字段,以及一个提交按钮。 与 mySQL 数据库一起使用的 PHP 代码如下所示:

$conn = mysqli_connect($Host, $User, $Password, $DbName);
if (!$conn) {
 echo "Database connection error.";
 exit;
}
$query = "SELECT user_name, password from visitors where user_name = '".$_POST['user_name']."';";
$result = mysqli_query($conn, $query);
$row = mysqli_fetch_assoc($result);
$user_pass = md5($_POST['pass_word']);
$user_name = $row['user_name'];
if(strcmp($user_pass,$row['password']) != 0) {
 echo "Login failed";
}

为了防止 SQL 注入(inject)攻击,我正在尝试实现准备好的语句,查看了 W3S 网站和其他网站。我想我需要更换

$query="SELECT user_name, password from visitors where user_name='".$_POST['user_name']."';";

像这样:

$stmt = $conn->prepare("SELECT user_name, password from visitors where  user_name= ?");
if ($stmt->execute(array($_GET[‘user_name’]))) {
  while ($row = $stmt->fetch()) {
    $user_name = $row;
  }
} 

我不确定修正案的有效性。 另外,为了测试系统的漏洞是否已经被修复,我如何才能通过原始的、未修改的代码访问系统?我试过:

username: admin
password: ‘ or ‘1’=’1’ (and a number of other options too)

最佳答案

防止一阶、二阶和三阶注入(inject)的最佳方法是,我建议您使用 PDO 以及准备好的语句,同时使用正确的字符集并禁用“模拟准备语句”。有关 SQL 注入(inject)如何工作以及 PDO 如何防止它的更多信息 can be found here .

关于php - SQL 准备语句 (PHP),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32228065/

相关文章:

php - 嵌套选择查询问题

mysql - 无法通过套接字 '/var/run/mysqld/mysqld.sock' 连接到本地 MySQL 服务器。

javascript - 我如何从 mysql 获取数据并使用 nodejs 和 javascript 渲染它?

php - 加入两个mysql表

php - 使用 PHP 解析 XML 获取属性值?

PHP解析xml问题与获取值

php - 上传文件并保证其安全

php - #1045 - 用户 'root' @'localhost' 的访问被拒绝(使用密码 : YES))

php - 安卓| PHP | MySql - 将表情符号从 Android 保存到 Mysql 服务器

php - Swift Poststring 没有得到我的值