介護予防のウェブサイトを立ち上げる

私は新しい "開発者"であり、SOFサイトの新しいメンバーです。私は最初にウェブサイトを立ち上げています。私のオンライン調査では、PHPが表面上で簡単であるかもしれないが、開発者が見逃している最も重要なことは注射であると言われています。

あなたがここで質問をする前に研究する必要があることをSOFが述べているので、私はそれを行い、mysql_real_escape_string();データベースに損害を与える可能性のある文字をエスケープする必要があります。あなたが声明を準備していることも分かりました。しかし、SOFとGoogleの両方で検索を行ったところ、ユーザーが入力したデータのどちらかを使用してdbにクエリ/挿入するため、どちらを使用するかは重要ではないことがわかりました。

だから私は今、本当に混乱しています。なぜなら、私はescape_stringステートメントのためにチャンピオンになっている人が多く、Preparedステートメントにはいくつかの人がいます。

これは私がやっていることです:

 For Post variables: 

 $thething = mysql_real_escape_string($_POST['field']);


 For Get variables: 

 $thething = mysql_real_escape_string($_GET['id']);


 For Request variables: 

 $thething = mysql_real_escape_string($_REQUEST['id']);

皆さんの考えをお聞かせください。

1
@ tomありがとう、しかし、私は笑い混乱している場合は何が良いです
追加された 著者 Sam Khan,
@ col.shrapnelセキュリティに関して言えば、変数を正しくバインドまたは書式設定すると、両方の方法に違いはありません。バインディングは単純なものです。エスケープすることはできません(したがって、エスケープ/引用の代わりにいくつかの変数をキャストする必要があります)。また、拘束もエスケープも識別子を安全にすることができないことに注意してください。したがって、クエリでフィールド名や演算子を使用する必要がある場合は、スクリプトでハードコードされた値を使用する必要があります。 ////そうでしたか?あなたはどちらを使うかは関係ありませんか?
追加された 著者 Sam Khan,
追加された 著者 Your Common Sense,
はい、あなたが何をしているのかを知っていて、ルールに従うなら、どちらを使うべきかは関係ありません。
追加された 著者 Your Common Sense,
追加された 著者 Quentin,
少なくとも新しいPHP開発者として、あなたはMysql注入保護を調べる感覚を持っていました!あなたに敬意を表します。あなたは毎日これを見ません。
追加された 著者 Tom,
新しい開発者として、あなたは引き続き文字列を頼りにしていきます。さらに進むと、pdo_mysqlのように、注射を避け、もっと簡単にあなたの人生を楽にするライブラリを使用します。このSELECT、INSERT、UPDATEをあなた自身で書くことは、お尻の痛みです。私を信頼してください:)おそらく、ある時間の中で、全体のフレームワークを使用して、あなたをもっと助けてくれるでしょう。
追加された 著者 evildead,

5 答え

すべてのパラメータが適切にエスケープされていることを確認するよりも、プリペアドステートメントを常に使用する方が簡単です。だから私は準備された声明を勧める。

関連する質問:

mysqliプリペアドステートメントとmysqli_real_escape_string

real_escape_stringと準備されたステートメント

1
追加された

悪意のあるユーザの入力を回避するために、 mysql_real_escape_string を使用する傾向があります。

プリペアドステートメントでも同じ結果が得られるので、ユーザー入力を手動でエスケープするのを忘れるかもしれませんが、プリペアドステートメントを使用できますが、入力をエスケープするとしばらくしてから、それは第2の性質になります。

CakePHPやCodeIgniterなどのPHPフレームワークを使用している場合は、一般的に同じ機能を提供します。たとえば、CodeIgniterのアクティブレコードは、すべての入力サニタイズを処理します。

追加のセキュリティ情報:

あなたはウェブ開発の初心者ですから(私もそうです)、 XSS注射、別の脆弱点。

最後に、防御的にコードを作成します。あなたのウェブサイトは公開されているので、これはWeb開発の場合にはるかに重要です。 Javascript経由でフォームデータを検証する場合は、PHPスクリプトでも検証を実行します。冗長に思えるかもしれませんが、JSをバイパスすることも可能です(1つの方法は、ブラウザでJSを無効にすることです)。

Salt passwords at the time of hashing, avoid md5 hash. Go for either sha256, sha512 or bcrypt.

セキュリティでは、あなたが侵害されるのは の問題ではなく、あなたが侵害されたときいつかです。セキュリティは、進行中の終わりのないプロセスでなければなりません。

0
追加された
haha ...今あなたは私を困惑させた。上記のコメントに掲載されたリンクの例2は、パスワードのエスケープされていないユーザー入力がどのように承認されるかを示しています。見ていると、私は抱えているものにいくつかの光を当てることができます
追加された 著者 xbonez,
mysql_real_escape_string はユーザー入力をサニタイズする必要はありませんが、渡された文字列を引数としてサニタイズします。ユーザー入力を保持する $ _ POST 変数を渡すと、ユーザー入力をサニタイズしますか?たとえば、ここの例2では、​​ php.net/manual/ en/function.mysql-real-escape-string.php は間接的に( $ _ POST ['password'] で保持されている)ユーザー入力をサニタイズしていませんか?
追加された 著者 xbonez,
ありがとう@xbonezはあなたの提案をすべて調べます。
追加された 著者 Sam Khan,
あなたに知らせるために、mysql_real_escape_stringはユーザの入力とは関係ありません。
追加された 著者 Your Common Sense,
あなたに知らせるために、mysql_real_escape_stringはサニタイズとはまったく関係ありません:)
追加された 著者 Your Common Sense,
確かに。この機能は「サニタイズ」しません。この機能はデリミタをエスケープするだけです。したがって、デリミタはありません。mysql_real_escape_stringには使用できません。あなたの例に `` "AND area = $ _POST ['area']" `(注入値も)を加えて見てください。
追加された 著者 Your Common Sense,

私はこれが非常に脆弱のSQLインジェクションにあると思う:

$ thething = mysql_real_escape_string($ _ GET ['id']); mysql_query( "select * from user where" =。$ thething);

コンセプトの証明: http://localhost/index.php?id = sleep(30

このページはSQLインジェクションに対して脆弱であるため、ロードに30秒かかります。

SQLインジェクションから自分自身を保護するためのより安全なアプローチは、PDOやmysqliなどのパラメータ化されたクエリライブラリです。すべてをテストする必要があります。 サイトウォッチ Skipfish をクリックします。

0
追加された
私のウェブサイトでそのことを試みました。睡眠(30)は機能しませんでした。
追加された 著者 Sam Khan,

私たちはあなたの保護の考え方はまったく間違っていると考えています。

  1. 文字がデータベースに損害を与える可能性はありません。しかし、一部の文字はクエリを壊すことがあります。あなたはこれを許してはいけません。

  2. したがって、mysql_real_escape_string();文字列を壊す可能性のある文字をエスケープする

  3. したがって、mysql_real_escape_string(); 文字列のみをエスケープする必要があります。そして、それは他の部分の質問と少しは助けにならないでしょう。

  4. また、POST GETとREQUESTだけでなく、世界のどのソースからでも文字列を取得できます。 クエリに入る文字列をエスケープする必要があります。宛先はソースではなく理由です。

  5. 詳しい説明については、コメントの質問を参照してください

0
追加された
ねえ、大佐。 #1で混乱して申し訳ありませんが、私は何か(クエリを壊す)申し訳ありませんでした!
追加された 著者 Sam Khan,

PreparedStatementsは、プレースホルダで使用すると入力をエスケープします

SELECT * FROM myTable WHERE `id` = ?

しかし、手続き型のmysql-extensionではサポートされていませんが、理由は何ですか?既存のサイトの多くは mysql_(real_)escape_string()に残っていますが、MysqliやPDOで使用できます。私は開発の冒頭にあるときに、準備されたステートメントを使用することをお勧めします。

0
追加された
あなたもmysqlのエスケープ文字列に固執するのですか?
追加された 著者 Sam Khan,
あなたが本当にparanthesesを追加した理由:mysql_(real_)escape_string()??
追加された 著者 Sam Khan,
関数 mysql_escape_string()もあります。
追加された 著者 KingCrunch,
プライベートプロジェクト( SQLite3 の上)と私の会社の PDO_Mysql に、Nope、PreparedStatementsを追加しました。
追加された 著者 KingCrunch,
PHP - 日本のコミュニティ [ja]
PHP - 日本のコミュニティ [ja]
4 参加者の

このグループではPHPについて話します。 パートナー:kotaeta.com