【问题标题】:How do I use SQL injection prevention methods when processing the form?处理表单时如何使用 SQL 注入预防方法?
【发布时间】:2014-12-13 21:20:28
【问题描述】:

表格

<FORM method="post" action="for.php">
        <input type="text" name="first" placeholder="first"><br>
        <input type="text" name="last" placeholder="last">
        <input type="submit">
    </FORM>

表单处理

在处理表单时如何使用 SQL 注入预防方法。我检查了这个链接,读后很困惑:How can I prevent SQL injection in PHP?

<?php

$db_username = "sanoj";
$db_password = "123456";
try {
 #connection 
$conn = new PDO('mysql:host=localhost;dbname=localtest', $db_username, $db_password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$data = $conn->prepare('INSERT INTO test (first, last) VALUES (:first, :last)');

$first = mysql_real_escape_string($_POST['first']);
$last = mysql_real_escape_string($_POST['last']);
$data->execute(array(':first' => $first, ':last' => $last));
#exception handiling
} catch (PDOException $e) {
echo $e->getMessage();
}
?>

错误

当我运行上面的代码时,我得到了这个错误

已弃用:mysql_real_escape_string():mysql 扩展已弃用,将来将被删除:在第 11 行的 C:\Users\logon\Documents\NetBeansProjects\teste local\for.php 中使用 mysqli 或 PDO 代替

【问题讨论】:

  • 这只是您使用mysql_real_escape_string() 时的通知,而deprecated 您可以将任何东西插入数据库
  • @Arif_suhail_123 数据已插入,但出现上述错误
  • 检查答案。希望它能解释一些事情

标签: php forms mysqli


【解决方案1】:

您不必在此处使用mysqli_real_escape_string,因为 PDO 会处理它。你可以简单地将你的值传递给execute()

试试这个:

<?php

$db_username = "sanoj";
$db_password = "123456";

#connection
$conn = new PDO('mysql:host=localhost;dbname=localtest', $db_username, $db_password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$data = $conn->prepare('INSERT INTO test (first, last) VALUES (:first, :last)');

$data->execute(array(':first' => $_POST['first'], ':last' => $_POST['last']));

您收到的错误是通知您 mysql_real_escape_string 已弃用。你可以在这里阅读:https://www.php.net/manual/en/function.mysql-real-escape-string

【讨论】:

  • stackoverflow.com/questions/14012642/… 这是一个不好的做法,只是一个临时修复来摆脱通知......
  • 数据没有插入到表中不好的主意
  • 它没用什么也没发生仍然是负面结果
【解决方案2】:

由于您使用 PDO 准备好的语句来执行 SQL 查询,因此无需手动转义 SQL 注入的输入。

您可以在提交时传递参数:

$first = $_POST['first'];
$last = $_POST['last'];
$data->execute(array(':first' => $first, ':last' => $last));

扩展程序会处理剩下的事情。

注意:这只是一个警告,当您尝试在新版本的 PHP 中使用 mysql_* 扩展函数时,您会得到它。

注意 2:这只会保护您免受 SQL Injection 攻击,因此请记住,恶意用户可以通过多种其他方式利用您的代码使用 XSS 和无数其他攻击。

** 更新**

如果您谨慎处理该变量,则无需担心警告。要摆脱它,您可以使用:

$first = filter_input(INPUT_SERVER, 'first', FILTER_SANITIZE_STRING)
$last = filter_input(INPUT_SERVER, 'last', FILTER_SANITIZE_STRING)

Warning "Do not Access Superglobal $_POST Array Directly" on Netbeans 7.4 for PHP

【讨论】:

  • 什么是最好的保护方法或者我可以使用什么方法
  • 正如我在回答中所说,由于您使用的是准备好的语句,因此您已经受到 MySQL 注入的保护,就像 mysqli 真正的转义字符串可以保护您免受此类攻击一样。
  • 您不必这样做,这就是重点。只需使用我的答案中的代码,因为您使用的是PDO
  • 收到警告不要直接访问超级全局 $_POST
猜你喜欢
  • 1970-01-01
  • 2017-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-22
  • 2021-11-13
相关资源
最近更新 更多