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インジェクション攻撃につながる可能性があります。プリペアドステートメントを使用することを強くお勧めします。これは、PHPを使用してデータベースの読み取りと書き込みを行う方法であるPDOとMySQLiの両方の機能であり、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は危険なデータが含まれている可能性があるため、DBに挿入する前に、これらのアレイからデータを準備する必要があります。

まず、正しいデータ型に型キャストする値が必要です。(string)PHPでは、文字列データ、数値データ、ブールデータの次の(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 に答える