これは非常に重要な質問であり、実際にはエンコーディングの形で簡単な答えがあります。あなたが直面している問題は、同時に多くの言語を使用していることです。最初に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レシートががらくたでいっぱいである理由を疑問に思う人々のサポートチケットを入手し始めるまでは本当に素晴らしいです。& >
コード内:
form.html:
<form action="post.php" method="get">
<textarea name="comment">
I really <3 dogs & cats ;')
</textarea>
<input type="submit"/>
</form>
生成されるURL:
http://www.example.org/form.php?comment=I%20really%20%3C3%20dogs%20&%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>'