Php 如何使$\u GET中的版本变量安全

Php 如何使$\u GET中的版本变量安全,php,Php,我有page?vesion=1.0.1 我如何通过类似这样的方式使$_GET['version']安全 $version = (float) $_GET['version']; 但是,如果它是1.2或1.0,这将起作用,如果它的1.0.1使用诸如/[0-9]+(\.[0-9]+){0,3}/之类的正则表达式来验证它,这将不起作用。你的朋友是: if (preg_match('/[0-9]+(\.[0-9]+){0,3}/', $_GET['version'], $match)) { /

我有
page?vesion=1.0.1

我如何通过类似这样的方式使$_GET['version']安全

$version = (float) $_GET['version'];

但是,如果它是1.2或1.0,这将起作用,如果它的1.0.1使用诸如
/[0-9]+(\.[0-9]+){0,3}/
之类的正则表达式来验证它,这将不起作用。你的朋友是:

if (preg_match('/[0-9]+(\.[0-9]+){0,3}/', $_GET['version'], $match)) {
    // $match[0] contains the validated version number
}
如果我能确切地知道你想要接受什么和拒绝什么,我可以帮你更多


编辑:用第二版本号替换正则表达式中的3;对于3,允许使用0.1.2.3,但不允许使用0.1.2.3.4

使用正则表达式,例如
/[0-9]+(\.[0-9]+){0,3}/
,对其进行验证。你的朋友是:

if (preg_match('/[0-9]+(\.[0-9]+){0,3}/', $_GET['version'], $match)) {
    // $match[0] contains the validated version number
}
如果我能确切地知道你想要接受什么和拒绝什么,我可以帮你更多


编辑:用第二版本号替换正则表达式中的3;允许使用3 0.1.2.3,但不允许使用0.1.2.3.4

不要忘记
^
$
锚定<代码>2.5.0';DROP TABLE…不是一个允许的好版本号。;-)类似于php 5.3版。0@Wiseguy无论如何,您确实应该通过mysql\u real\u escape\u查询传递数据,即使您完全确定您的变量是什么。但是,如果您在其他方面使用版本号,例如文件操作(例如,
2.5.0;rm-rf/
),该怎么办呢。关键是要确保
$\u GET['version']
是一个有效的版本号,如果没有锚,这将无法实现。这只是一个额外的好处,无效的版本字符串也可能被恶意使用(我从提问者希望“确保其安全”的愿望中推断出来)。@Wiseguy,使用
preg_match
的正确方法是获取其返回值并从
$retval[0]获取匹配项
。这将削弱任何此类攻击。不要忘记
^
$
锚定!
2.5.0';DROP TABLE…
不是一个允许的好版本号。;-)类似于php 5.3版。0@Wiseguy你真的应该通过mysql\u real\u escape\u查询传递数据,当然,即使你完全确定你的变量是什么。但是,如果您在其他方面使用版本号,例如文件操作(例如,
2.5.0;rm-rf/
),该怎么办呢。关键是要确保
$\u GET['version']
是一个有效的版本号,如果没有锚,这将无法实现。这只是一个额外的好处,无效的版本字符串也可能被恶意使用(我从询问者希望“确保其安全”的愿望中推断出来)。@Wiseguy,使用
preg_match
的正确方法是获取其返回值并从
$retval[0]
获取匹配。这将削弱任何此类攻击。