0

我一直在环顾四周,找不到向我展示有效方法的地方。目前我有一个在用户提交表单时运行的查询:

$query = "UPDATE user SET username='$_POST[username]',
nicename='$_POST[nicename]', 
email='$_POST[email]', 
password=(SHA1)'$_POST[password]', 
position='$_POST[position]', 
race='$_POST[race]', 
type='$_POST[type]' WHERE username=$_SESSION[admin_login]";

我不确定如何让它真正正常工作。抱歉,如果以前有人问过,但我在任何地方都找不到一个好的解决方案。提前感谢您的帮助。

4

3 回答 3

2

首先整个事情是错误的:为什么?

因为首先你需要清理你没有做的输入,至少你应该mysqli_real_escape_string像这样使用:

$nicename = mysqli_real_escape_string($connect, $_POST['nicename']);

参考

其次,您应该在查询中使用密码之前对其进行加密,例如将加密密码分配给变量,然后在查询中使用它,如下所示:

$hashed_pass = sha1($_POST['password']);

//Query goes here

最后但并非最不重要的是,不要super global $_SESSION variable直接在查询中使用,而是使用连接它..像这样

WHERE username='".$_SESSION[admin_login]."'";
于 2012-10-06T07:56:10.327 回答
1

首先,永远记住小鲍比桌。插入这样的数据可能会导致 SQL 注入攻击,就像漫画中一样。我强烈建议您使用准备好的语句,这是 PDO 和 MySQLi 中的一个功能,它们是使用 PHP 读取和写入数据库的方法,一些信息:PDO和一些信息:MySQLi

无论您选择哪种方式都无关紧要,更多的是个人喜好。我喜欢 PDO,所以这是一个绑定数据然后使用 PDO 执行查询的示例:

$dbh = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);  

$password = sha1($_POST[password]);

$stmt = $dbh->prepare("UPDATE user SET username = :username, nicename = :nicename, email = :email, password = :password, position = :position, race = :race, type = :type WHERE  = :username");
$stmt->bindParam(':username', $_POST['username']);
$stmt->bindParam(':nicename', $_POST['nicename']);
$stmt->bindParam(':email', $_POST['email']);
$stmt->bindParam(':password', $password);
$stmt->bindParam(':position', $_POST['position']);
$stmt->bindParam(':race', $_POST['race']);
$stmt->bindParam(':type', $_POST['type']);
$stmt->bindParam(':username', $_SESSION['admin_login']);

$stmt->execute();
于 2012-10-06T08:08:08.380 回答
1

$_POST并且$_GET数组可能包含危险数据,因此您需要先从这些数组中准备数据,然后再将它们插入数据库。

首先,您需要对正确的数据类型进行类型转换。在 PHP 中,您可以使用以下构造:(string)对于字符串数据,(int)对于(float)数字数据,(bool)对于布尔数据。

email检查有效电子邮件的必要字段,使用正则表达式。

以下代码是检查数据的示例:

<?php
    $link     = mysqli_connect('localhost', 'my_user', 'my_password', 'my_db');

    $username = mysqli_real_escape_string($link, (string) $_POST['username']);
    $nicename = mysqli_real_escape_string($link, (string) $_POST['nicename']);
    $email    = mysqli_real_escape_string($link, (string) $_POST['email']);
    $email    = preg_replace( '/^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.(([0-9]{1,3})|([a-zA-Z]{2,3})|(aero|coop|info|museum|name))$/', $email );
    $password = sha1((string) $_POST['password']);
    $position = mysqli_real_escape_string($link, (string) $_POST['position']);
    $race     = mysqli_real_escape_string($link, (string) $_POST['race']);
    $type     = mysqli_real_escape_string($link, (string) $_POST['type']);
    $admin    = $_SESSION['admin_login'];

    $query = "UPDATE `user` 
              SET `username`='$username',
                  `nicename`='$nicename', 
                  `email`='$email', 
                  `password`='$password', 
                  `position`='$position', 
                  `race`='$race', 
                  `type`='$type' 
              WHERE `username`='$admin'";

    mysqli_query($link, $query);
    mysqli_close($link);
于 2012-10-06T08:08:26.460 回答