2016-04-28 19 views
0

私は何時間もこの場所にいました。PHPで入力が有効でないことを確認しました

私はApache 2.0ためXAMPPPHP 5.5Chromeを使用して、私のエディタのNetbeansを使用しています。

MYSQLデータベースを検索する前に、検証する入力テキストボックスがあります。私は入力を得るためにPOSTを使います。

私が使用している入力された "X/65 !!!" どのように

$searchtext = $_POST['searchbox']; 
echo "<br />" . htmlspecialchars($searchtext); 
echo "<br />htmlentitites: " . $searchtext; 
echo "<br />strip slashes : " . stripslashes($searchtext); 
echo "<br />internal encoding is: " . mb_internal_encoding(); 

と私の結果は次のとおりです。

for htmlspecialchars -> "x/65!!!"how to<b> //why isn't the <b> removed? 

for htmlentities  -> "x/65!!!"how to //shouldn't the forward slash be stripped out? 

for stripslashes  -> "x/65!!!"how to //shouldn't the '/' be stripped out? 

for mb_internal_encoding-> ISO-8859-1 //My php.ini has UTF-8 as the default, I have meta content-type charset="UTF=8" and I though php 5.5 defaulted to UTF8 

私はPHPのマニュアルからのコピーが、私よ彼らの結果は得られません。私はそれがcharset関連の疑いがありますが、私はもうどこを見るか分からない。

****コメント********

ジェフ、

I changed the spelling of entities and used this string: <b>"'This \!'": /I 

これは私がはhtmlspecialcharsを得るものです: " 'これ!'":/ I とはいすべてが大胆です。私の出力のすべてが大胆であると私は$ _POST [「検索ボックスを」]エコーとき、私は

 the escape chars showing: &quot;&quot;&lt;&gt 
のいずれかの

おかしい事は、しかしですされません。それは大胆にもかかわらず現れます。

私のmb_internal_encoding()はページの始めにメタ文をUTF-8に設定していますが、PHPではセミコロンを削除してデフォルトのUTF-8を作成しましたが、mb_internal_encoding()はISO-8859-1です。

PHPインタープリタが壊れていると思っています。彼らの最近のバージョンが何であるかを見るにはXAMPPを見なければならないでしょう。

+1

正確な質問は何ですか?質問が「これを安全にクエリに入れる方法」である場合、答えは準備することによって、または例えば、 [mysqli_real_escape_string](http://php.net/mysqli_real_escape_string)。 – Rick

+0

あなたは実際にこの行に 'htmlentities'関数を使用していないことに注意してください。' echo "
htmlentitites:"。 $ searchtext; 'あなたはechoステートメントでそれを間違って記述しました。 –

答えて

0

ブラウザがそのソースの出力をレンダリングする方法とは対照的に、これらの関数がソース出力に対して行うことの違いを混乱させるかもしれないと思います。ブラウザの画面に表示されているものとブラウザのソースに表示されているものを比較していることを確認してください。 ctrl + Uまたはhere's a reference for how to do it in a few othersを押すと、最も人気のあるブラウザでHTMLソースコードを表示できます。 htmlspecialcharsため

- >x/65!!!"how to<b>が//なぜ削除<b> ではないでしょうか?

htmlspecialchars何も削除されず、特定のhtml文字を単にhtml entity encoding formatに変換します。したがって、<b>はというページでレンダリングされるhtmlエンティティ&lt;b&gt;に翻訳されます。あなたのソースコードを見れば、それは実際には<br />&quot;x/65!!!&quot;how to&lt;b&gt;です。そうしないと、画面上に<b>が表示されなくなります。これは、ブラウザによって開かれた太字のタグとして解釈されるため、次のすべてのテキストが太字になります。これは、あなたがマークダウンのためにそれをエスケープしなかったのであなたの質問には見えない理由です。htmlentitiesため

- >x/65!!!"how to<b>が//前方 スラッシュが取り除かれるべきではないのですか?

カップルのここでの問題:なし実際の結果の

  • が、私はちょうどあなたがあなたの echo 文で間違ったhtmlentitites != htmlentitiesを綴ったことを指摘したかったです。

  • あなたが実際にあなたのコード内で htmlentities 機能を使用しませんでした。でも、偶然にも

    echo "<br />htmlentitites: " . htmlentities($searchtext); 
    
  • echo "<br />htmlentitites: " . $searchtext; 
    

    を実際にそれを使用するためには、あなたの変数をラップ正規の古いスラッシュ/html character entity、ではないため、使用していた場合は がエスケープされませんでしたそれは は、にstripslashesため​​

としてエンコードされるだろう端数スラッシュ、と非常によく似ていないが、 - >x/65!!!"how to<b> //は を/を取り除かすべきではありませんか?

stripslashesはバックスラッシュ\を削除し、slashses /を転送しません。私は、ISO-8859-1 //私のphp.iniが デフォルトとしてUTF-8を持っている>私はそれがstripbackslashes呼ばれているべきだと思いますが、彼らは私に尋ねませんでした:)

mb_internal_encoding-のためにPHP 5.5 しかしメタコンテンツ・タイプの文字セット=「UTF = 8」と私はデフォルトはUTF-8ではないことを、私はこの1つに非常に慣れていないんだけど、私はあなたを伝えることができ

をUTF8にデフォルト設定されているが、 ISO-8859-1。あなたはだと確信していますそのMy php.ini has UTF-8 as the default?私のphp.iniには次のような行があります:;mbstring.internal_encoding = UTF-8と最初はセミコロン;であることに注意してください。そのセミコロン()を削除し、Webサーバを再起動して有効にする必要があります。

あなたのmeta statement setting it to UTF-8については、<meta charset="UTF-8">のように見えるhtml meta tagを追加したことを意味します。これはhtml出力にのみ適用され、どの文字セットがブラウザに設定されているかを示し、内部サーバ設定には何の影響も与えません。

+0

上記の私のコメントを参照してください – eric

+0

@eric、私は私の答えを更新しました。あなたが全体を再読み込みしたくないなら、あなたは[ここに私の変更を見ることができます](http://stackoverflow.com/posts/36927036/revisions) –

+0

ジェフ、ありがとう。いったん私はウェブページのためのソース 'を見て、文字列は適切に消毒されました。私はエンコーディングをあきらめています。私のphp.iniにはdefault_charset = "UTF-8"(私はセミコロンを削除しました)ですが、私はまだISO-8859-1で終わります。私は持っている; mbstring.internal_encoding = EUC-JP。セミコロンを削除してEUC-JPをUTF-8に変更してみましたが、デフォルトのISO-8859-1は変更されませんでした。 php.iniファイルに多バイト数の設定がありすぎています(; mbstring.language = Japanese)。私がそれを必要とするなら、私はそれに潜り込むでしょう。あなたの助けと忍耐をもう一度ありがとう! – eric

関連する問題