2016-04-09 28 views
1

私は、ユーザーが入力したデータに対して、常に準備済みのステートメント(またはサニタイズ)を使用するべきであることを知っています。私たちはそれをやっています。私の質問は、データがプリペアドステートメントを使用して入力され、自分のデータベースに座っていると、データベースからデータを取得して自分で操作した場合(つまりユーザーの関与がない場合)に準備済みのステートメントを再度使用する必要がありますデータベース?データベースからデータをサニタイズする必要はありますか?

私はユーザーからの途中でデータを浄化するかどうかを知っています。私はそれを自分で操作してデータベースに戻すときに浄化する必要があります。しかし、これは準備文にも適用されますか?

要約すると、ユーザーからのデータ - 準備されたステートメント - >をデータベースに使用します。しかし、ユーザーが提出して準備したデータを保存前に処理するには、データベースからのデータ - >準備されたステートメントの使用 - >データベースへのデータを処理するときに次のことを行う必要がありますか?

ありがとうございます!

+1

傷つけることはありませんが、私はそれが厳密な言葉で必要とは思わないが、 – hd1

+0

ユーザーがデータを入力できる場合は、サニタイズすることをお勧めします。データがプログラム的である場合は、必要ではありません。 –

+2

そうです。誰が誰かが後で問題を引き起こすような方法でデータを更新するスクリプトを実行していないと言う人がいます。または後で、誰かがデータをサニタイズせず、インポートまたはマージを経て取得します。申し訳ありませんよりも安全な方がいいです!しかし、私はユーザー承認なしでデータを変更する大きなファンではありません... – xQbert

答えて

4

ユーザーから届いた場合は、いずれもにあります。はい、再度挿入すると準備文を使用する必要があります。

悪意のあるデータを用意し、準備されたステートメントを使用して保存するとします。その後、それを取り出して、何かを行い、それをデータベースに戻します。ちょうどそれが安全になった場合を除いて、それはまだ危険です。ユーザーが提出したデータが悪質でないと仮定することは決して安全ではありません。最初にデータを受け取ったときにデータが悪質ではなかったと考えることが安全でない場合、しばらくデータベースに座っていると魔法のように安全になることはありません。

+0

+10は私の答えよりも良く、より簡潔に表示されます。基本的に私が伝えようとしたのと同じ考えです。 (私はゴードンとフレッドがOPが "準備 - >バインド - >実行パターン"への参照として "サニタイズ"という用語を使用していたと考えていたと思っています) – spencer7593

+0

ありがとう、@ spencer7593。私は実際にあなたの答えがとても良いと思っていました。(あなたは私から投票しました)。ただちょっと違ったスピンを入れたかったのです。 –

+0

エド、私はこの答え(あなたの答え)が私よりも "スピン"が良いと思います。 – spencer7593

3

はい、同じパターンに従う必要があります。

値を挿入したvarcharカラムがあるとします。例として、last_nameとしましょう。

誰かがその列に'O'Reilly'の値を挿入している可能性があります。

それがパターン

準備次行った場合 - >バインド - >

を実行し、データベース内の列に格納された値は、単一引用符を含む、O'Reillyになるだろう。

データベースから値を取得しただけで、後でその値をデータベースから取得しても、それがSQL文のテキストに含めるのが「安全」であるとは限りません。

この値を別のSQL文で使用する場合は、ユーザーが最初に値を入力したときのと同じの問題に直面しています。

ですから、同じパターンprepare -> bind -> executeに従う必要がありますどちらか(または文字列値は、それがSQL文のテキストに含まれている場合には適切にエスケープする必要があります。)


あなただけ参照されている場合安全でない値を含んでいる列の名前。それを安全にSQL文で使用することができます。

CREATE TEMPORARY TABLE _tmp_last_names 
    AS 
    SELECT t.last_name FROM mytable t 
    ; 

バインドプレースホルダでプリペアドステートメントを使用してのパターンは、データを「サニタイズ」しません。これは、一部のデータ値の潜在的な問題を回避するメカニズムです。

バインドプレースホルダに指定された「非衛生的な」値は、データベースに格納されます。それは同じ "非衛生的な"値であり、値の "墨塗りされた"バージョンではありません。

しかし、データベースに格納されているすべての値を「サニタイズ」するために、他のロジック(prepare-> bind-> executeパターンを除いて)を実行した場合は、それを再実行することは厳密には必要ありません同じ論理。その後、データベース内の衛生値を他のプロセスで置き換えて、非衛生的な値に置き換えていないと仮定します。

3

なぜあなたはそれを浄化しませんか?あなたがデータを消毒していない点は、その開口部の恐ろしいほどの乱用に関わらず、不必要な開口部です。

一度限りのスクリプトを実行している場合は、サニタイズについて心配する必要はありません。それを実行し、それを削除します。それがあなたのプログラムの一部であれば、あなたは簡単にそれを浄化することができます。ユーザーの送信データをサニタイズするために使用している保存メソッドとは異なる保存メソッドを使用することを検討しているのはなぜですか? は両方のアクションのために同じ方法で保存して含めるかかわらず、それが開始された方法のすべてが見えると同様に動作し、常に例えば

DB()->updateColumn('table', $data)->where('id', $uid); 

をサニタイズされますので、これは単なる推測ですが、あなたが取っているアプローチにはないように思えますコードの再利用が可能な場所を検討してください。

0

このサニタイズ(と私自身の検索)の話で、実際にMySQLデータがPHPに戻される前に実際にサニタイズする方法についての説明はありません。 (Psst:50人の担当者に誰かの答えをコメントできるようにする必要はありませんが、私はこの時点でこれを探しているので、これを言う必要があると思います)

関連する問題