0

我不太清楚如何写标题,所以我会尽力在这里解释。

我创建了一个注册系统,并遇到了一个我在开发系统时从未考虑过的错误。当用户在输入框或文本区域中键入时,如果他们使用单引号,则数据不会发送到数据库,因为它将关闭查询。

这是我的查询代码:

mysqli_query($uys, "INSERT INTO users SET bandname='$bandname', genre='$genre', location='$location', bio='$bio', password='$password', email='$email', ip='$ip'"); 

当然,如果他们不使用单引号,就不会出错。他们可以很好地使用双引号。

我的变量是这样的:

$bandname = $_POST['bandname'];
$genre = $_POST['genre'];
$location = $_POST['location'];

有什么办法解决这个问题?我在 PHP 方面不是最好的,还在学习,所以你的帮助会很棒,会帮助我很多。

对不起,如果这没有得到很好的解释,如果你对我的意思感到困惑,我会尽力解释得更好

4

3 回答 3

1

这是一个严重的问题。您在这里面临的是一个开放的 SQL INJECTION

您从未经处理的字符串中连接查询 - 这可能会导致任何类型的麻烦,其中最小的问题是删除整个数据库......

不要在未使用适当清理的情况下连接查询字符串!在这种情况下,mysqli_real_escape_string正确的解决方案。

最值得推荐的(是一个词吗?)解决方案是尽可能使用准备好的语句:

$stmt = $mysqli->prepare("INSERT INTO users SET bandname=?, genre=?, location=?, bio=?, password=?, email=?, ip=?");

$stmt->bind_param("sssssss", $bandname, $genre, $location, $bio, $password, $email, $ip);
$stmt->execute();

注意:从内容的角度来看,清理仍然很重要,以防止 XSS 攻击或 Javascript 注入页面等问题......

(另外,使用PDO也保证了数据库的独立性,值得一试......)

于 2013-09-26T21:31:13.627 回答
0

您需要将单引号替换为 2 个单引号,如下所示:

str_replace("'", "\''", $bandname);

在将字符串发送到 SQL 之前。然后它将在 SQL 表中显示为单引号。

于 2013-09-26T19:18:29.470 回答
0

这应该可以解决问题:

$bandname = mysqli_real_escape_string($_POST['bandname']);
$genre = mysqli_real_escape_string($_POST['genre']);
$location = mysqli_real_escape_string($_POST['location']);

mysqli_query($uys, "INSERT INTO users SET bandname='$bandname', genre='$genre', location='$location', bio='$bio', password='$password', email='$email', ip='$ip'");`

您需要转义您的字符串,否则可能会使用sql injection攻击您的数据库。

于 2013-09-26T21:24:56.883 回答