【问题标题】:Need help improving PHP & MySQL security [duplicate]需要帮助提高 PHP 和 MySQL 的安全性 [重复]
【发布时间】:2011-08-29 22:07:17
【问题描述】:

可能重复:
MySQL Syntax error. Can't solve it

任何人都可以改进此代码,使其安全并使用准备好的语句吗?

$sql= "INSERT INTO users
(level,fname, mname, lname, dob, age, reg_date, phone, email, login, pwd, type, `group`, region, school, class, ip, subject, ban, university, profession, activation_code) 
VALUES 
('1','$data[fname]', '$data[mname]', '$data[lname]', '$dob', '$age', now(), '$data[phone]', '$email', '$login', '$pwd', '$type', '$group', '$region', '$school', '$class',  '$ip', '$subject', NULL, '$university', '$profession', '$activ_code')";
$result = $db->query($sql) or die(printf("Error: %s\n", $db->error));
$id = $db->insert_id;  
$md5_id = md5($id);
$db->query("update users set md5_id='$md5_id' where id='$id'");
//  echo "<h3>Thank You</h3> We received your submission.";


?>

【问题讨论】:

  • 我们应该只是猜测这有什么问题?你得到一个PHP错误吗?一个Mysql错误?坏数据进入数据库?
  • @Marc B. $id = $db->insert_id;部分有点“危险”。如果有多个用户同时注册怎么办?我需要使用语句。但我不熟悉他们这就是为什么寻求帮助
  • 阅读文档。 MySQL 总是记住当前 CONNECTION 创建的最后一个 ID。它不是一个全局值 - 它特定于该脚本的执行,不可能在同时运行的多个脚本之间共享。
  • 这是来自stackoverflow.com/questions/7235508/… 的一个足够公平的后续问题,没有必要编辑该问题然后添加,好的,现在我如何转换为 PDO 或其他。 Tural,您可以尝试研究和解决此问题,如果/当您遇到困难时,请向我们展示您的尝试。目前有点“请帮我写代码”

标签: php mysql registration


【解决方案1】:

如果我们假设所有直接变量都填充了用户生成的内容,那么您的代码对于 sql 注入是完全开放的。相反,使用准备语句和bind_param() 自动设置正确的安全设置/转义:

$stmt = $dbh->prepare(
    "INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam('name', $name);
$stmt->bindParam('value', $value);
mysqli_stmt_execute($stmt);

【讨论】:

    【解决方案2】:

    如何定义列? MySQL 仅对字符串使用单引号,尝试将它们从非字符串字段(级别、出生日期、年龄)中取出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-26
      • 1970-01-01
      • 2011-09-19
      • 2014-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多