【问题标题】:PHP Checking if a numbered string follows a patternPHP 检查编号字符串是否遵循模式
【发布时间】:2018-07-06 16:22:17
【问题描述】:

我正在比较不同版本号的输入,如下所示:

testname-v01.03.001.01
testname-v02.01.001.03
...

我正在做一个比较,以确保没有任何输入被恶意输入到我的教科书中以损害我的 sql 表。

我正在做的是这样的:

<?php
    function startsWith($needle, $haystack){
        return $needle === "" || strrpos($haystack, $needle, -strlen($haystack)) !== false;
    }
    $reqmethod = $_SERVER["REQUEST_METHOD"];
    $textInput = "";
    if( $reqmethod == "GET") {
        $textInput = $_GET["my_input"];
    }
    $stringComparison = "v02.01.001.01";
    if ( $textInput != ""){
        $valid_input = startsWith("testname", $textInput); #See if text starts with version
        #if not check if its a partial match
        if (!$valid_input){
            if(preg_match('/^[A-Z][0-9]+.[0-9].[0-9].[0-9]', $textInput)){
            $textInput= "version-" + $textInput;
        } else {
            $textInputReadOut = "BAD VALUE";
            $textInput= "";
        }
    }
?>

要让preg_matchv01 相等,我是否可以这样做:[A-Z][0-9][0-9]?我已经尝试过了,但是该变量返回一个 BAD VALUE 而不是

参考:Checking a string against a pattern

【问题讨论】:

  • 验证您的输入是否与预期的模式或值匹配总是好的,但这通常不是您希望依靠保护自己免受 SQL 注入的方式。您应该通过mysqliPDO 使用带有绑定参数的预处理语句。 This post 有一些很好的例子。

标签: php


【解决方案1】:

看看你的正则表达式:

if(preg_match('/^[A-Z][0-9]+.[0-9].[0-9].[0-9]', $textInput)){

你错过了结束/

必须是:

if(preg_match('/^[A-Z][0-9]+.[0-9].[0-9].[0-9]/', $textInput)){

这里是更正的版本:

^[a-zA-Z][0-9]{2}\.[0-9]{2}\.[0-9]{3}\.[0-9]{2}

您可以使用 regexr 等工具来测试您的正则表达式。

【讨论】:

  • 感谢您对 regexr 的建议,但我阅读了更多关于 @Alex Howansky 早些时候发表的评论的信息,我将沿着这条路走,因为它似乎更适合防止 SQL 注入
【解决方案2】:

您的正则表达式匹配 (^) v1.2.3.4 开头的字符串,但您的$textInputtestname 开头(或者可能是其他包名称)。

您还对正则表达式进行了编码,只检查输入是否无效。你的文本输入总是有效的,因为它总是以 testname 开头,这意味着你总是登陆你的else,其中输出是BAD VALUE。只要您的$textInputtestname 开头,就您的代码当前而言,输出为BAD VALUE

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-07
    • 2014-12-29
    • 2019-06-20
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 2011-12-21
    • 2020-09-20
    相关资源
    最近更新 更多