0

次の場合に検証エラーをスローしたい -

  • ユーザー入力にはphpタグが含まれています<?php(短いタグも<?
  • <?xmlただし、php タグが検出されない場合は、XML タグ ( ) を許可したいと考えています。
  • 両方が存在する場合は、エラーをスローしたいと思います。

私は今、次の正規表現に取り組んでいます-

`(.*?)<\?(php)?[^xml](.*?)`

ただし、入力に PHP の短いタグしか含まれていない場合は一致しません。

以下に一致させたい -

PHP ショートタグ

<?

PHP タグ

<?php

xml タグが存在する場合の PHP タグ

<?php ?>
<?xml

以下に一致しない

<?xml

アップデート

この正規表現を使用しても、入力に末尾の空白がなく、のみが含まれている場合、文字は(.*?)<\?[^x](.*?)検出されません。次の位置に条件を追加して、さらに文字がある場合にのみさらにチェックする必要があると思います-<?<?

         |
         v
`(.*?)<\?[^x](.*?)`

この - を試してみると(.*?)<\?([^x]?)(.*?)xml. 私がぶら下がっているところがわかりますか?ここで正規表現が許可するものがあると思います。何か案は?

4

3 に答える 3

2

正規表現はまったく必要ですか?なぜそうしないのですか:

if file contains '<?php'
    throw an error
if file contains '<?' but *doesn't* contain '<?xml'
    throw an error

コメント<?に記載されているように、これはandを含むファイルをカバーしません<?xml(ただし、 and の出現回数を数えることはできますが、<?これが の数よりも多い場合は<?xml、エラーをスローします)。

正規表現については、いくつかのオプションがあります。正規表現フレーバーが否定先読みをサポートしている場合は、「x」が後に続かないを探すことができます<?

<\?(?!x)

または、否定的な先読みをサポートしていない場合は、試すことができます

<\?([^x]|$)

これらのいずれも、PHP フラグの存在を探します。

于 2012-05-17T08:01:00.530 に答える
1

探している正規表現は次のとおりです。

/<\?(?!xml)(?:php|.{0,3})/s

PHP のサンプル コードは次のとおりです。

if (preg_match("/<\?(?!xml)(?:php|.{0,3})/s", $str))
  echo "Not allowed\n";
于 2012-05-17T10:02:54.137 に答える
0

この正規表現を使用する場合は注意してください。

<\?(?!x)

また

<\?([^x]|$)

short_open_tags が有効になっている場合でも脆弱です。この行は、Hello World を出力します。

<?xml_error_string(1); echo 'Hello World!'; ?>

私はこの正規表現しか思いつかなかった

<(\?([^x]|xml_.*?)|\%)

しかし、あなたにはまだこの断片が残っています...

error_string(1); echo 'Hello World'; ?>

私はより良い解決策にうんざりしていますが、実行されるコードよりも優れています。;-)

于 2012-08-22T20:09:18.860 に答える