0

preg_split を使用して、ツイートのメッセージ ID などからタグ情報を削除しました。これは Twitter からの元の出力です

tag:search.twitter.com,2005:7551711354822656

「tag:search.twitter.com」を取り除くために preg_split を適用します

  $arr = preg_split("/,/", "strip_tags(mysql_real_escape_string($status->id))");
  $msg_ID =  $arr[1];

& テーブルに $msg_ID[1] を挿入します。これで、Twitter の出力が

  #DIYse_D  DELIVERAB: twitter messages 1, 9th OCT 2010

preg_split を適用して、次のように「twitter メッセージ 1」を削除します

  $arr2 = preg_split("/,/", "strip_tags(mysql_real_escape_string($status->content))");
  $msg =  $arr[1];

& $msg[1] をテーブルに挿入しますが、SQL 構文エラーが発生します。OK、ここでの 1 つのことは、$ status->id 出力で、twitter が id の先頭にタグを追加し、ここでは元のメッセージ コンテンツ内に 'twitter メッセージ 1' を追加したことです。
これがSQL挿入クエリです

INSERT INTO msg2(id,msg,msg_id,depth,name) VALUES ('','$msg','$msg_ID','0','$name')
4

1 に答える 1

2
$arr = preg_split("/,/", "strip_tags(mysql_real_escape_string($status->id))");
                         ^--here                                           ^--here
$arr2 = preg_split("/,/", "strip_tags(mysql_real_escape_string($status->content))");
                           ^---here                                              ^---here

ここで示した 4 つの二重引用符は、これらの「コード」のビットを文字通りのテキスト文字列に変換します。strip_tags 関数呼び出しの結果を分割しようとしているのではなく、「strip_tags(etc...)」という文字列を分割しようとしています。二重引用符を削除して、PHP が文字列ではなく関数呼び出しであることを認識できるようにします。

そのリテラル文字列にはコンマがないため、$arr2[1]値はありません。そのため、データベースに空白 (または null) を挿入しようとしています。

同様に、関数シーケンスを次のように変更します。

mysql_real_escape_string(strip_tags(etc...))

データベース挿入のためのエスケープは、挿入前に行う最後のことです。strip_tags によってエスケープの順序が変更され、「悪い」文字列が生成され、SQL インジェクション攻撃にさらされる可能性があります。

于 2010-11-27T13:31:32.577 に答える