Maison  >  Questions et réponses  >  le corps du texte

Formulaire d'inscription du nom de l'entreprise

<p>Pour référence uniquement, nouveau venu dans le codage, l'auto-apprentissage, détendez-vous...</p> <p>J'ai un formulaire d'inscription qui crée une nouvelle table SQL. Le nom de l'entreprise qu'ils saisiront sera le nom de la nouvelle table créée à chaque connexion. </p> <p>Tout fonctionne correctement, à l'exception de la vulnérabilité dans la variable de nom de table. </p> <p>J'utilise PHP et MySQL. </p> <p>Au début, j'ai eu des problèmes si le nom de l'entreprise avait un espace entre les 2 mots, mais j'ai résolu ce problème en utilisant str_replace</p> <p>J'ai fait beaucoup de tests et j'ai découvert que si je mets le nom de l'entreprise dans "out", cela casse le code. </p> <p>J'ai reçu ce message d'erreur : </p> <p>"Erreur fatale : mysqli_sql_exception non interceptée : il y a une erreur dans votre syntaxe SQL ; consultez le manuel de la version de votre serveur MySQL pour connaître la syntaxe correcte à utiliser près de 'out (id INT UNSIGNED AUTO_INCRMENT PRIMARY KEY, first_name VARCHAR(128 ) NOT ' Trace de pile à la ligne 1 dans C:Usersreece.groverOneDriveXML Websiteopregister.php:73 : #0 C:Usersreece.groverOneDriveXML Websiteopregister.php(73) : mysqli->query('CREATE TABLE ou ...') #1 {main} lance "</p> dans C:Usersreece.groverOneDriveXML Websiteopregister.php à la ligne 73 <p>Cela semble conduire non seulement à des erreurs, mais également à une injection SQL. </p> <p>J'ai appris à bind_param, mais cela empêche toujours une éventuelle rupture de code avec la fonction CREATE TABLE. </p> <p> Ceci est mon code PHP côté serveur, le formulaire est juste un simple formulaire HTML avec Bootstrap.</p> <pre class="brush:php;toolbar:false;">//supprimer les espaces $entreprise = str_replace(' ', '', $_POST["entreprise"]); //hachage du mot de passe $password_hash = password_hash($_POST["mot de passe"], PASSWORD_DEFAULT); // Créer un nouvel opérateur $mysql = nécessite __DIR__ . "/database.php"; $sql = "Opérateurs INSERT INTO (prénom, nom, email, hash_mot de passe, société) VALEURS (?, ?, ?, ?, ?)" ; $stmt = $mysql->stmt_init(); if ( ! $stmt ->prepare($sql)){ die("Erreur SQL : " . $mysql->erreur); } $stmt->bind_param("sssss", $_POST["prénom"], $_POST["nom_dernier"], $_POST["e-mail"], $password_hash, $entreprise); if ( ! $stmt->execute()) { die($mysqli->error . " " . $mysqli->errno); } //Créer la nouvelle table société $sql = "CREATE TABLE $entreprise ( id INT CLÉ PRIMAIRE AUTO_INCREMENT NON SIGNÉE, prénom VARCHAR(128) NON NULL, nom_VARCHAR(128) NON NULL, email VARCHAR(255) NON NULL UNIQUE, la société VARCHAR(128), crédit VARCHAR(60), téléphone VARCHAR(60))" ; if ( ! $mysql->query($sql)) { die("Échec de la création de la table : " . $mysql->erreur); } $sql = "INSERT INTO $company (prénom, nom, email, société, crédit, téléphone) VALEURS (?, ?, ?, ?, ?, ?)" ; $stmt = $mysql->stmt_init(); if ( ! $stmt ->prepare($sql)){ die("Erreur SQL : " . $mysql->erreur); } $stmt->bind_param("ssssss", $_POST["prénom"], $_POST["nom_dernier"], $_POST["e-mail"], $entreprise, $_POST["crédit"], $_POST["téléphone"]); if ($stmt->execute()) { header("Emplacement : signup_success.php"); quitter;</pre></p>
P粉904191507P粉904191507379 Il y a quelques jours531

répondre à tous(1)je répondrai

  • P粉186897465

    P粉1868974652023-09-06 15:21:05

    Vous devriez avoir une table company prédéfinie au lieu d'une table company_name distincte. Vous ne devez pas non plus créer de tableaux basés sur les entrées de l'utilisateur.

    Pré-créer une table d'entreprise :

    CREATE TABLE companies (
      id INT PRIMARY KEY AUTO_INCREMENT,
      company_name VARCHAR(255),
      email VARCHAR(255),
      phone VARCHAR(20)
    );

    Vous pouvez ensuite INSERTvos données dans ce tableau :

    $stmt = $conn->prepare("INSERT INTO companies (company_name, email, phone) VALUES (?, ?, ?)");
    //Example company data
    $companyName = "Example Company";
    $email = "info@example.com";
    $phone = "123-456-7890";
    $stmt->bind_param("sss", $companyName, $email, $phone);
    $stmt->execute();

    Chaque entreprise est insérée dans ce tableau. Ils se distinguent par la colonne id.

    Vous pouvez également ajouter des contraintes de clé étrangère sur les operators tables.

    ALTER TABLE operators
    ADD COLUMN company_id INT,
    ADD CONSTRAINT key_constraint_company_id FOREIGN KEY (company_id) REFERENCES company(id);

    Si vous souhaitez que les données de votre entreprise soient supprimées lorsque vous supprimez un opérateur, vous pouvez faire DELETE CASCADE :

    ALTER TABLE operators
    ADD COLUMN company_id INT,
    ADD CONSTRAINT key_constraint_company_id FOREIGN KEY (company_id) REFERENCES company(id) ON DELETE CASCADE;

    répondre
    0
  • Annulerrépondre