2

スマイリーを解析するために書いている一部のphpで一重引用符/アポストロフィに問題があります。

一重引用符は私の人生の悩みの種ですが、ここに行きます。

まず、ここにいくつかのコードがあります...

まず、スマイリーとそのスマイリーのファイル名を保持する配列。

これは別のファイルです (smiley-map.php)。

<?php 
$smilies = array (
array('code' => ':)', 'filename' => 'smiley.gif'),
array('code' => ':(', 'filename' => 'sad.gif'),
array('code' => ';)', 'filename' => 'wink.gif'),
array('code' => ':D', 'filename' => 'grin.gif'),
array('code' => ';D', 'filename' => 'cheesy.gif'),
array('code' => '>:-(', 'filename' => 'angry.gif'),
array('code' => ':O', 'filename' => 'shocked.gif'),
array('code' => '8)', 'filename' => 'cool.gif'),
array('code' => '???', 'filename' => 'huh.gif'),
array('code' => '::-)', 'filename' => 'rolleyes.gif'),
array('code' => ':P', 'filename' => 'tongue.gif'),
array('code' => ':-[', 'filename' => 'embarrassed.gif'),
array('code' => ':*', 'filename' => 'lipsrsealed.gif'),
array('code' => ':-/', 'filename' => 'undecided.gif'),
array('code' => ':x', 'filename' => 'kiss.gif'),
array('code' => ':\'(', 'filename' => 'cry.gif'),
array('code' => '>:-D', 'filename' => 'evil.gif'),
array('code' => '^-^', 'filename' => 'azn.gif'),
array('code' => 'O0', 'filename' => 'afro.gif'),
array('code' => 'LOL', 'filename' => '2funny.gif'),
array('code' => ':bash:', 'filename' => 'knuppel2.gif'),
array('code' => '>_<', 'filename' => 'tickedoff.gif'),
array('code' => ':?', 'filename' => 'idiot.gif'),
array('code' => ':!', 'filename' => 'uglystupid.gif'),
);
?>

次に、次のような簡単な方法でそれらを解析します。

 <?php
 function parseSmilies($string)
 {
require_once("smilies/smiley-map.php");

for ($i = 0; $i < count($smilies); $i++)
{
    $filename = '<img src="smilies/' . $smilies[$i]['filename'] . '" alt="smiley" title="' . $smilies[$i]['code'] . '" />';
    $string = str_replace($smilies[$i]['code'], $filename, $string);
}
return $string;
 }
 ?>

つまり、スマイルマップを含める...アレイが利用可能になりました...コードの検索文字列...画像タグのコードを交換します。

これはすべて、ローカル マシン (XAMPP) で正常に動作します。しかし、サーバーにアップロードして実行すると、泣き声が見逃されます:'(

配列でエスケープしたにもかかわらず、これは問題を引き起こす単一引用符であると思います..

おそらく、これに影響を与えているPHP設定がいくつかありますか?

誰でもアドバイスしてもらえますか?

どうもありがとう。

編集: $string は $_POST から発生します

4

2 に答える 2

2

これはおそらくMagicQuotesと関係があります。PHPサーバーでMagicQuotesがオンになっている
場合、すべてのスーパーグローバル(など)のはに置き換えられ、に置き換えられます。このメカニズムは、PHP 5.3.0で非推奨になり、PHP5.4.0で削除されました。'$_GET$_POST\'"\"

ただし、ほとんどのWebホスティングサーバーにはまだPHP 5.3.0が搭載されていませんが、XAMPPなどのプライベートサーバーにはより新しいバージョンのPHPが搭載されている可能性があります。したがって、ローカルホストでは、Webサーバーがオンになっている間、MagicQuotesがオンになっていない可能性があります

Magic Quotesを使用すると、スーパーグローバル値をクエリに直接含める場合にSQLインジェクションを実行できなくなります。例えば:

<?php

$query = 'SELECT id FROM users WHERE name = "' . $_POST['name'] . '" AND password = "' . $_POST['password'] . "'";

?>

フィールドにa1" OR "1" = "1を入力すると、パスワードを知らなくてもpassword、クエリを簡単に変更SELECT id FROM users WHERE name = "admin" AND password = "1" OR "1" = "1"して、管理者アカウントに効果的にログインできます。


とは言うものの、 Magic Quotesは、入力を保護していない人々のための単なるフォールバックメカニズムであり、常にオフにする必要があると思います。PHPに任せるのではなく、独自のアプリケーションを保護することをお勧めします。

マジッククォートを無効にする

これはを使用php.iniして実行できますが、ホストされたサーバー上のそのファイルにアクセスできないと思います。次のスニペットは、MagicQuotesの無効化をエミュレートします

<?php

if( get_magic_quotes_gcp( ) )
{
    function stripslashes_deep( $val )
    {
        return is_array( $val ) ? array_map( 'stripslashes_deep', $val )
                                : stripslashes( $val );
    }
    
    $_GET     = stripslashes_deep( $_GET );
    $_POST    = stripslashes_deep( $_POST );
    $_COOKIE  = stripslashes_deep( $_COOKIE );
    $_REQUEST = stripslashes_deep( $_REQUEST );
}

?>
于 2012-05-17T13:30:11.827 に答える
0

配列でエスケープしたにもかかわらず、これは問題を引き起こす単一引用符であると思います..

いいえ、違います。そうではありません。

おそらく、これに影響を与えているPHP設定がいくつかありますか?

いいえ、それに影響を与える PHP 設定はありません。

誰でもアドバイスしてもらえますか?

単体テストの作成を開始し、コードを公開する前にテストする必要があります。たとえば、関数が 1 回しか機能しないことがわかっているとします。次回呼び出されると、置換ペアはもはや定義されていません (require_onceトリガーされます)。

その問題に続いて、ライブ システムのデータがローカル システムと異なることが想像できます。ローカル システム上の同じデータに対して関数を実行すると、同様に機能しないことがわかります。

ヒント:

  1. var_dump($string)を与えるのですか?
  2. strtr.
于 2012-05-17T13:07:38.527 に答える