2

わかりました、この件は温床であることは理解しています。この状況は、コードとして使用しているものに依存していることも理解しています。解決しなければならない状況が 3 つあります。

  1. コンマやチルダなどを使用したコメントやステートメントを作成できるようにする必要があるフォームがありますが、それでも攻撃からは保護されています。

  2. 英語で 10/13/11 mm/dd/yy のように日付を入力する人がいますが、これはサニタイズできますか?

  3. htmlspecialchars()を正しく使用する方法htmlentities()を理解するにはどうすればよいですか? real_escape_string()私はphp.netサイトといくつかの投稿を読んだことがありますが、これはすべて、質問を読んでいる人が正しい答えであるかにかかっている状況のようです。

私は本当にそれを受け入れることができません...私がここに投稿しているものと同様のテキスト形式をサニタイズできる回答が必要です。それが可能かどうか、またどのように可能かを知りたいです。

ありがとう...他の場所でこの質問をするとイライラする傾向があるように思えるので...私は知る必要があることを学んでいますが、何の例がなくても知ることができることは頭打ちになっていると思いますそれはすることを意図しています...

前もって感謝します。

4

3 に答える 3

10

これは非常に重要な質問であり、実際にはエンコーディングの形で簡単な答えがあります。あなたが直面している問題は、同時に多くの言語を使用していることです。最初にHTMLを使用し、次にPHPを使用し、数秒後にSQLを使用します。これらの言語にはすべて、独自の構文規則があります。

覚えておくべきことは、文字列は常に適切なエンコーディングである必要があるということです。

例を見てみましょう。HTMLフォームがあり、ユーザーはそのフォームに次の文字列を入力します。

I really <3 dogs & cats ;')

送信ボタンを押すと、この文字列がPHPスクリプトに送信されます。これがGETを介して行われると仮定しましょう。独自の構文を持つURLに追加されるため(たとえば、&文字には特別な意味があります)、言語を変更しています。これは、文字列を適切なURLエンコードに変換する必要があることを意味します。この場合、ブラウザがそれを行いますが、PHPにはそのurlencodeための機能もあります。

PHPスクリプトでは、文字列はに格納さ$_GETれ、PHP文字列としてエンコードされます。PHPをコーディングしている限り、これはまったく問題ありません。しかし、SQLクエリで使用する文字列を配置しましょう。言語と構文規則を変更するため、文字列は関数を介してSQLとしてエンコードする必要がありmysql_real_escape_stringます。

もう一方の端では、文字列をユーザーに再度表示したい場合があります。データベースから文字列を取得し、PHP文字列として返されます。出力用にHTMLに埋め込みたい場合は、言語を再度変更するため、htmlspecialchars関数を使用して文字列をHTMLにエンコードする必要があります。

ずっと、文字列は常に適切なエンコーディングでした。つまり、ユーザーが思いつくことができるすべての文字がそれに応じて処理されます。すべてがスムーズかつ安全に実行されている必要があります。

避けるべきこと(時にはこれは無知な人によっても推奨されます)は、文字列を時期尚早にエンコードすることです。たとえば、データベースに配置するhtmlspecialcharsに文字列に適用できます。このようにして、後でデータベースから文字列を取得するときに、問題なくHTMLに貼り付けることができます。いいですね?ええ、PDFレシートががらくたでいっぱいである理由を疑問に思う人々のサポートチケットを入手し始めるまでは本当に素晴らしいです。&amp; &gt;

コード内:

form.html:

<form action="post.php" method="get">
    <textarea name="comment">
        I really <3 dogs &amp; cats ;')
    </textarea>
    <input type="submit"/>
</form>

生成されるURL:

http://www.example.org/form.php?comment=I%20really%20%3C3%20dogs%20&amp;%20cats%20;')

post.php:

// Connect to database, etc....

// Place the new comment in the database
$comment = $_GET['comment']; // Comment is encoded as PHP string

// Using $comment in a SQL query, need to encode the string to SQL first!
$query = "INSERT INTO posts SET comment='". mysql_real_escape_string($comment) ."'";
mysql_query($query);

// Get list of comments from the database
$query = "SELECT comment FROM posts";

print '<html><body><h2>Posts</h2>';
print '<table>';

while($post = mysql_fetch_assoc($query)) {
    // Going from PHP string to HTML, need to encode!
    print '<tr><td>'. htmlspecialchars($post['comment']) .'</td></tr>';
}

print '</table>';
print '</body></html>'
于 2011-12-06T18:14:43.873 に答える
1

重要なことは、使用可能な各サニタイズ機能が何のためにあり、いつ使用する必要があるかを理解することです。たとえば、データベース エスケープ関数は、データを安全にデータベースに挿入できるように設計されており、そのように使用する必要があります。ただし、HTML エスケープ関数は、悪意のある HTML コード (JavaScript など) を中和し、ユーザーが表示できるデータを安全に出力できるように設計されています。適切なタイミングで適切なものをサニタイズします。*

  • HTML を受信したときにサニタイズする方法と、受け取ったとおりに HTML を保存し、ユーザーに出力するときにのみサニタイズする方法の 2 つの異なる基本的な方法があります。これらの方法にはそれぞれ支持者がいますが、おそらく 2 番目の方法が最も問題が発生しにくい方法です (最初の方法では、サニタイズ手順に欠陥が発見され、データベースに保存されているサニタイズが不十分なコンテンツが見つかった場合はどうすればよいでしょうか) ?)

日付は、日付解析関数を使用してサニタイズできます。PHP では、 strtotime()を見ることができます。あなたの目的は通常、日付の文字列表現を取得し、日付を表すオブジェクト、または同じ日付を標準的な方法 (つまり、特定の形式) で表す別の文字列のいずれかを出力することです。

于 2011-12-06T18:09:13.143 に答える
0

日付のサニタイズに関して、PHP には役立つ組み込み関数がいくつかあります。strtotime() 関数は、考えられるほぼすべての日付/時刻形式を Unix タイムスタンプに変換します。これを date() 関数に渡して、好きな形式に変換できます。

例えば:

$date_sql = date( "Ymd", strtotime( $_POST["date"] ) );

于 2011-12-06T20:06:55.353 に答える