php - 防止注入(inject): Using prepared statements and parameters in a function - syntax error

标签 php mysql sql-injection

我对 PHP 非常陌生,我正在尝试了解安全措施,例如防止注入(inject)。下面是我的代码。基本上我收到错误“您的 SQL 语法有错误;请检查与您的 MySQL 服务器版本相对应的手册,以获取在第 1 行'1'附近使用的正确语法”。数据仍在发送到数据库中,但此错误让我认为注入(inject)预防不起作用。当我使用 Dreamweaver 时,我没有遗漏任何 {,它至少会告诉我是否遗漏了。

另外,要注意的是,数据库连接线和函数位于一个单独的 php 文件中,而不是 $_POST 代码中的内容。

$conn = mysqli_connect($host, $user, $password, $databaseName);

if ($_POST) { 
  if(isset($_POST['register'])){
      registerUser(           //I'm calling the function here
      $_POST['username'],
      $_POST['user_password'],
      $_POST['user_fname'],
      $_POST['user_lname'],
      $_POST['email'],
      $_POST['phone'],
      $_POST['user_birthdate'],
      $_POST['user_address1'],
      $_POST['user_address2'],
      $_POST['user_city'],
      $_POST['user_postcode'], 
      $conn);
      } 
}


function registerUser(
  $username,
  $user_password,
  $user_fname, 
  $user_lname, 
  $email, 
  $phone, 
  $user_birthdate, 
  $user_address1, 
  $user_address2, 
  $user_city, 
  $user_postcode, 
  $conn){
    if($stmt = $conn->prepare("INSERT INTO fcusers (
        username, 
        user_password, 
        user_fname, 
        user_lname, 
        email, 
        phone, 
        user_birthdate, 
        user_address1, 
        user_address2, 
        user_city, 
        user_postcode) 
        VALUES (?,?,?,?,?,?,?,?,?,?,?)")){
            $stmt->bind_param("sssssssssss",
            $username,
            $user_password,
            $user_fname, 
            $user_lname, 
            $email, 
            $phone,             
            $user_birthdate, 
            $user_address1, 
            $user_address2, 
            $user_city, 
            $user_postcode);

            $sql = $stmt->execute();
            $stmt->close();
        }
    $result = mysqli_query($conn,$sql) or die(mysqli_error($conn));
    if($result){
       echo "CONGRATS";
     }
  }

最佳答案

生成的错误来自您的 mysqli_query(),而不是准备好的语句。准备好的语句通过 $sql = $stmt->execute() 执行。

使用mysqli_query($conn,$sql),您正在运行一个返回值为$stmt->execute()的查询,在本例中将对其进行评估as 1 (boolean true) 因此出现错误:在'1'附近使用的语法

您可以在 $stmt->execute() 上运行您的条件:

$result = $stmt->execute() or die(mysqli_error($conn));

关于php - 防止注入(inject): Using prepared statements and parameters in a function - syntax error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30152744/

相关文章:

php - 在php中将字符串转换为MySQL时间戳格式

mysql - 使用十六进制值伪装恶意负载的 SQL 注入(inject)

php - 进行自定义站点搜索的方法

PHP实时动态计算mysql结果之和

MySQL 5.7 : LOAD DATA LOCAL INFILE "You can' t specify target table for update in FROM clause"

c# - 我可以防止 SQL 注入(inject)吗?

mysql - SELECT NULL, *, NULL, NULL 中的混淆 SQL 错误

php - SQL 语句(内部连接?)

javascript - 未使用 jquery 和 ajax 设置 session

mysql - Node.js mysql db 在查询后连接