【问题标题】:Update MySQL with PHP用 PHP 更新 MySQL
【发布时间】:2012-12-12 09:59:29
【问题描述】:

我想使用输入表单更新 MySQL 数据库,本质上是一个设置页面,用户可以在其中更新/更改他们的信息。使用下面的代码,底部的回显运行并且我没有收到任何错误,但数据库没有更新。我在本地机器和服务器上都对其进行了测试,但两者都无法使用,尽管我不确定这与它有什么关系。 $_SESSION['yourName'] 在用户登录时已设置,因此它将等于数据库中的当前值。我知道这里有大量的 sql 注入漏洞,但这只是一个概念验证代码,还没有准备好上线。我尝试在 phpMyAdmin 中运行查询,它运行良好。

PHP

if(isset($_POST['name']) || isset($_POST['password']) || isset($_POST['location']) || isset($_POST['img'])) {
 //put this in an external file for a little extra security
 $username = "my_username";
 $password = "my_password";
 $database = "database_name";
 $con = mysql_connect('localhost',$username,$password);
 if (!$con) {
    die('Oh poop.... Could not connect: ' . mysql_error());
 }
 //print item from database
 mysql_select_db($database, $con);

 if(isset($_POST['name'])) {
    $query = 'UPDATE users SET username=' . $_POST['name'] . 'WHERE username=' . $_SESSION['yourName'];
    mysql_query($query);
    $_SESSION['yourName'] = $_POST['name'];
 }
 if(isset($_POST['password'])) {
    $query = 'UPDATE users SET password=' . $_POST['password'] . 'WHERE username=' . $_SESSION['yourName'];
    mysql_query($query);
 }
 if(isset($_POST['location'])) {
    $query = 'UPDATE users SET location=' . $_POST['location'] . 'WHERE username=' . $_SESSION['yourName'];
    mysql_query($query);
    $_SESSION['location'] = $_POST['location'];
 }
 if(isset($_POST['img'])) {
    $query = 'UPDATE users SET img=' . $_POST['img'] . 'WHERE username=' . $_SESSION['yourName'];
    mysql_query($query);
    $_SESSION['img'] = $_POST['img'];
 }
 echo '<script type="text/javascript">alert("changes saved")</script>';
}

HTML

<form method="post">
    new name: <input type="text" name="name" /><br />
    new password: <input type="text" name="password" /><br />
    new location: <input type="text" name="location" /><br />
    new img: <input type="text" name="img" /><br />
    <input type='submit' name='save' value='save' />
    <input type='submit' name='logout' value='logout' />
</form>

【问题讨论】:

  • var rq = new XMLHttpRequest(); rq.open('POST', 'update.php', false); rq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); rq.send('password=' + encodeURIComponent("'password';--")); 是的,我可以登录任何帐户!请了解 SQL 注入预防并停止将未转义的用户输入直接放入您的查询中。准备好的语句很好,特别是考虑到 PHP 5.5 弃用了 mysql_ 扩展。
  • ...但是您看到的问题是缺少字符串周围的引号。

标签: php mysql sql


【解决方案1】:

尝试使用双引号而不是单引号来修改您的 php 语句。

$query = "UPDATE users SET username='" . $_POST['name'] . "' WHERE username= '" . $_SESSION['yourName'] . "'";

但是上面的查询是有SQL Injection的漏洞,请阅读下面的文章,

【讨论】:

  • 那就行了,谢谢!正如问题中所说,这只是一些测试代码,还远未准备好上线。但总是很高兴知道人们会指出 sql 漏洞
【解决方案2】:

我建议使用 PDO。不鼓励 php mysql 对象支持 PDO 或 mysqli。

PDO:http://php.net/manual/en/book.pdo.php

您还需要为 WHERE 语句更新主键列(id 或 user_id)上的行,或者您可能允许影响多个用户行。

根据您的应用程序,我建议不要将密码存储在您的数据库中。存储他们输入的密码的加盐哈希。

密码哈希:http://php.net/manual/en/faq.passwords.php

if(isset($_POST['name']) || isset($_POST['password']) || isset($_POST['location']) || isset($_POST['img'])){
//put this in an external file for a little extra security  
$username = "my_username";
$password = "my_password";
$database = "database_name";                                
try{
    $conn=new PDO('mysql:dbname='.$database.';host=localhost;port=3306',$username,$password);
}
catch(PDOException $ex){
    die('Could not connect: '.$ex->getMessage());
}
$stm = $conn->prepare("UPDATE users SET username=?,password=?,location=?,img=? WHERE user_id=?");
$stm->execute(array($_POST['name'],$_POST['password'],$_POST['location'],$_POST['img'],$_SESSION['user_id']));
}   

【讨论】:

    猜你喜欢
    • 2013-11-03
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-01
    相关资源
    最近更新 更多