2017-07-06 3 views
0

私はPHPを勉強し、彼らはポストからフォームデータを取得し、データベースに挿入チュートリアルでphpbridge.orgPHPのデータの挿入が確実に

でデータクラスのチュートリアルを作成OOPを追っています。

ステップ1:フォームTopicData.php

に含ま

<h2>New Topic</h2> 
<form action="add.php" method="POST"> 
    <label> 
     Title: <input type="text" name="title"> 
    </label> 
    <br> 
    <label> 
     Description: 
     <br> 
     <textarea name="description" cols="50" rows="20"></textarea> 
    </label> 
    <br> 
    <input type="submit" value="Add Topic"> 
</form> 

ステップ2 PHPファイル

<?php 
require 'TopicData.php'; 

if (isset($_POST) && sizeof($_POST) > 0) { 
    $data = new TopicData(); 
    $data->add($_POST); 
} 
?> 

ステップ3

機能ここ

コードであります

public function add($data) 
{ 
    $query = $this->connection->prepare(
     "INSERT INTO topics (
      title, 
      description 
     ) VALUES (
      :title, 
      :description 
     )" 
    ); 

    $data = [ 
     ':title' => $data['title'], 
     ':description' => $data['description'] 
    ]; 

    $query->execute($data); 
} 

私の質問はセキュリティに関するものです。このデータをデータベースに挿入する前に、filter_input()関数を使用してフォームの各フィールドを実行するのはベストプラクティスではありませんか?また、これらもfilter_var()で実行する必要がありますか?

これが必要な場合は、フィルタコードはどのようになりますか?

ありがとうございます!

+0

フィルタリングする理由は、特定の分野でタイトルや説明に含めることのできる制限はありますか? – tadman

+0

@tadman - 私はタイトルや説明に制限がありません。しかし、私はセキュリティのために$ _Postに直接アクセスすることはないという印象のもとに、常にfilter_input()関数を使用していました。ここに記述: https://www.phparch.com/2010/07/never-use-_get-again/ – user1609391

+0

その記事は石器時代からのものかもしれませんが、それはすべて間違っているわけではありません。あなたはintegerやfloatやemailのような型に制約する必要がありますが、普通の古い文字列の場合はもっと複雑です。 「有効」とは何ですか?通常は、コード内でより具体的に定義する必要があります。 – tadman

答えて

0

TopicData.phpファイルは、準備されたSQLクエリを使用しています。準備されたクエリを使用する利点は、SQLクエリが外部入力に基づいていない場合、SQLインジェクションの可能性を排除することです。準備されたクエリを使用する場合、クエリのテンプレートはデータとは別に送信されます。これには、ここで説明する多くの利点があります。https://www.w3schools.com/php/php_mysql_prepared_statements.asp

フォームデータのサニタイズの必要性がなくなります。ただし、最大文字列長、最大値、最小値などの検証が必要な場合は、filter_var関数を使用してフォームデータをフィルタリングする必要があります。

+0

あなたは "SQLクエリが外部入力に基づいていなければ"と述べました。それはどういう意味ですか?また、attr_emulate_prepares属性のPDOを使用するかどうか、MySQLに送信されるすべてのフォームデータに対してfalseかどうか、SQLインジェクションを防止する最善の方法であると言えるでしょうか? – user1609391

+0

SQLクエリに変数が含まれている場合。たとえば、 '' INSERT INTO $ table_name($ field_name1、$ field_name2)VALUES($ title_value、$ description) ''とすると、SQLインジェクションの可能性が高まります。たとえば、$ table_nameや$ title_valueのように、クエリ内で使用されている変数の1つがユーザによって送信された場合、SQLクエリに悪質なコードを挿入することができます。準備されたクエリを使用する場合、クエリには変数を含めるべきではありません。代わりに、次のようなプレースホルダを使用する必要があります:titleまたは?あなたがしたように。 –

+0

attr_emulate_prepares属性は、データベースドライバが常にエミュレートされたプリペアドステートメントを使用するかどうかを決定します。いくつかのデータベースドライバは準備済みの文をサポートしていません。そのような場合、PDOは準備されたクエリをエミュレートするので、データベースドライバにアクセスするための一貫したインタフェースがあります。 attr_emulate_preparesのデフォルト値を変更する必要はありません –

関連する問題