如果 -
,我想抛出验证错误<?php
(也适用于短标记<?
)<?xml
)。 我现在已经达到以下正则表达式了 -
`(.*?)<\?(php)?[^xml](.*?)`
但如果输入只包含PHP短标记,则它不匹配。
我想匹配以下内容 -
PHP Short tag
<?
PHP标记
<?php
存在xml标记的PHP标记
<?php ?>
<?xml
与以下内容不匹配
<?xml
更新
如果输入仅包含(.*?)<\?[^x](.*?)
,则使用此正则表达式<?
不会检测到<?
字符,而没有任何结尾空格。我想我只需要在以下位置添加条件,只有在有更多字符的情况下才能进一步检查 -
|
v
`(.*?)<\?[^x](.*?)`
如果我尝试使用此功能 - (.*?)<\?([^x]?)(.*?)
,则不再排除xml
。你看到我挂在哪里吗?我想这里有正则表达式允许的东西。有什么想法吗?
答案 0 :(得分:2)
你需要正则表达式吗?为什么不这样做:
if file contains '<?php'
throw an error
if file contains '<?' but *doesn't* contain '<?xml'
throw an error
如评论中所述 编辑,这不会涵盖包含<?
和<?xml
的文件(尽管您可以计算<?
的出现次数如果这比<?xml
的数字大,那么抛出一个错误。)
Re regex,你有几个选择。如果您的正则表达式支持负面预测,则可以查找不是后跟“x”的<?
:
<\?(?!x)
或者如果它不支持负向前瞻,您可以尝试
<\?([^x]|$)
其中任何一个都会寻找PHP标志的存在。
答案 1 :(得分:1)
你正在寻找的正则表达式是:
/<\?(?!xml)(?:php|.{0,3})/s
以下是PHP示例代码:
if (preg_match("/<\?(?!xml)(?:php|.{0,3})/s", $str))
echo "Not allowed\n";
答案 2 :(得分:0)
如果您使用此正则表达式,请记住:
<\?(?!x)
或
<\?([^x]|$)
启用short_open_tags后,您仍然容易受到攻击。这一行将输出Hello World:
<?xml_error_string(1); echo 'Hello World!'; ?>
我只能提出这个正则表达式
<(\?([^x]|xml_.*?)|\%)
但是你仍然留下了这个片段......
error_string(1); echo 'Hello World'; ?>
我已经厌倦了一个更好的解决方案,但它仍然比运行的代码更好。 ; - )