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(尽管您可以计算出现的次数,<?如果这大于 的数量<?xml,则抛出错误)。

重新正则表达式,你有几个选择。如果您的正则表达式风格支持负前瞻,您可以查找<?后面没有“x”的 a:

<\?(?!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 回答