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 インジェクションです。

サニタイズされていない文字列からクエリを連結すると、あらゆる種類の問題が発生する可能性があり、最小のものではデータベース全体が削除されます...

適切なサニタイズを使用せずにクエリ文字列を連結しないでください! この場合、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

これでうまくいくはずです:

$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 インジェクションでデータベースを攻撃する可能性があります。

于 2013-09-26T21:24:56.883 に答える
0

次のように、単一引用符を 2 つの単一引用符に置き換える必要があります。

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

文字列を SQL に送信する前に。その後、SQL テーブルに単一引用符として表示されます。

于 2013-09-26T19:18:29.470 に答える