Php e($查询); $stmt->execute(数组($id));

Php e($查询); $stmt->execute(数组($id));,php,eval,Php,Eval,现在这似乎有些牵强和愚蠢,但相信我:所有这些事情都发生了,比我想知道的还要多。添加一些代码会意外地覆盖一个在更深层使用的现有变量,这种情况一直在发生。特别是在程序法典中。不要盲目地打开数组。保留该单一变量,并使用键避免: 白发 突然的、戏剧性的秃顶 失去理智 溃疡出血 在工作环境中:灾难性的数据丢失 突然失业 。。。因为这样的代码会让独角兽哭泣,而野马会追捕你 首先,我对您的代码有一些问题: eval非常、非常少需要,而且非常危险,请谨慎使用。我用PHP开发了10多年,从未真正遇到过需要eva

现在这似乎有些牵强和愚蠢,但相信我:所有这些事情都发生了,比我想知道的还要多。添加一些代码会意外地覆盖一个在更深层使用的现有变量,这种情况一直在发生。特别是在程序法典中。不要盲目地打开数组。保留该单一变量,并使用键避免:

  • 白发
  • 突然的、戏剧性的秃顶
  • 失去理智
  • 溃疡出血
  • 在工作环境中:灾难性的数据丢失
  • 突然失业
  • 。。。因为这样的代码会让独角兽哭泣,而野马会追捕你

首先,我对您的代码有一些问题:

  • eval
    非常、非常少需要,而且非常危险,请谨慎使用。我用PHP开发了10多年,从未真正遇到过需要
    eval
    的情况。这也不例外。不需要评估
  • 您正在清理整个
    $\u POST
    数组。这很好,但是有一些特殊的功能可以实现,比如:,还有很多很多。。。更不用说已经包含可靠的请求验证组件的现成的开源项目和框架了
  • 始终检查函数的返回值,您似乎正在使用
    strstrstr
    ,但对返回不同类型的函数感到厌倦(例如
    strstr
    :如果未找到指针,它将返回
    false
    ,如果在草堆字符串的开头找到指针,则返回
    0
    )。您的
    if
    语句可能无法按预期工作
  • 您假设
    sanitize($value)
    值不包含任何单引号。为什么?因为如果他们这样做,您将在求值字符串中出现语法错误
  • 尽管如此,您可以轻松地使用变量编写代码,并添加一个简单的检查,以避免对范围中的现有变量进行检查:

    $sanitized = array_filter($_POST, 'sanitize');//call sanitize on all values
    foreach ($sanitized as $key => $value)
    {
        if (!isset($$key) && strstr($key, 'removeFile') === false)
            $$key = $value;
    }
    
    但实际上,
    $\u POST
    值属于一起,它们是请求的一部分,应该保持分组。。。要么在数组中,要么在某种类型的对象中。不要把每个值都赋给它自己的变量,因为很快你就会忘记设置了哪些变量,哪些没有。使用未设置的变量创建该变量,并将值赋值为
    null
    ,因此您现在拥有的是非常容易出错的代码:

    //request 1: POST => id=123&foo=bar
    foreach ($sanitized as $k => $v)
        $$k = $v;
    $query = 'SELECT x, y, z FROM tbl WHERE id = ?';//using posted ID as value
    $stmt = $db->prepare($query);
    $stmt->execute(array($id));
    
    一切都很好,因为设置了
    $id
    ,但永远不要信任网络,不要认为,仅仅因为设置了
    $\u POST
    ,所有键都将被设置,并且它们的值都是正确的:

    //request 2: POST => foo=bar&page=2
    foreach ($sanitized as $k => $v)
        $$k = $v;
    $query = 'SELECT x, y, z FROM tbl WHERE id = ?';//using posted ID as value
    $stmt = $db->prepare($query);
    $stmt->execute(array($id));//id is null
    
    现在我们有一个问题。这只是代码可能导致问题的一个示例。想象脚本增长了一点,看看这个:

    //request 3: POST => id=123&foo=bar&page=2
    foreach ($sanitized as $k => $v)
        $$k = $v;
    //$id is 123, $foo is bar and $page = 2
    $query = 'SELECT x, y, z FROM tbl WHERE id = ? LIMIT 10';//using posted ID as value
    //a lot more code containing this statement:
    $page = someFunc();
    $log->write('someFunc returned log: '.$page);
    //more code
    $offset = 10*($page-1);//<-- page is not what we expected it to be
    $query .= sprintf(' OFFSET %d', $offset);
    $stmt = $db->prepare($query);
    $stmt->execute(array($id));
    
    //请求3:POST=>id=123&foo=bar&page=2
    foreach($k=>v)
    $$k=$v;
    //$id是123,$foo是bar,$page=2
    $query='从tbl中选择x、y、z,其中id=?限制10'//使用发布的ID作为值
    //包含此语句的更多代码:
    $page=someFunc();
    $log->write('someFunc返回的日志:'。$page);
    //更多代码
    $offset=10*($page-1)//准备($查询);
    $stmt->execute(数组($id));
    
    现在这似乎有些牵强和愚蠢,但相信我:所有这些事情都发生了,比我想知道的还要多。添加一些代码会意外地覆盖一个在更深层使用的现有变量,这种情况一直在发生。特别是在程序法典中。不要盲目地打开数组。保留该单一变量,并使用键避免:

    • 白发
    • 突然的、戏剧性的秃顶
    • 失去理智
    • 溃疡出血
    • 在工作环境中:灾难性的数据丢失
    • 突然失业
    • 。。。因为这样的代码会让独角兽哭泣,而野马会追捕你

    首先,我对您的代码有一些问题:

  • eval
    非常、非常少需要,而且非常危险,请谨慎使用。我用PHP开发了10多年,从未真正遇到过需要
    eval
    的情况。这也不例外。不需要评估
  • 您正在清理整个
    $\u POST
    数组。这很好,但是有一些特殊的功能可以实现,比如:,还有很多很多。。。更不用说已经包含可靠的请求验证组件的现成的开源项目和框架了
  • 始终检查函数的返回值,您似乎正在使用
    strstrstr
    ,但对返回不同类型的函数感到厌倦(例如
    strstr
    :如果未找到指针,它将返回
    false
    ,如果在草堆字符串的开头找到指针,则返回
    0
    )。您的
    if
    语句可能无法按预期工作
  • 您假设
    sanitize($value)
    值不包含任何单引号。为什么?因为如果他们这样做,您将在求值字符串中出现语法错误
  • 尽管如此,您可以轻松地使用变量编写代码,并添加一个简单的检查,以避免对范围中的现有变量进行检查:

    $sanitized = array_filter($_POST, 'sanitize');//call sanitize on all values
    foreach ($sanitized as $key => $value)
    {
        if (!isset($$key) && strstr($key, 'removeFile') === false)
            $$key = $value;
    }
    
    但实际上,
    $\u POST
    值属于一起,它们是请求的一部分,应该保持分组。。。要么在数组中,要么在某种类型的对象中。不要把每个值都赋给它自己的变量,因为很快你就会忘记设置了哪些变量,哪些没有。使用未设置的变量创建该变量,并将值赋值为
    null
    ,因此您现在拥有的是非常容易出错的代码:

    //request 1: POST => id=123&foo=bar
    foreach ($sanitized as $k => $v)
        $$k = $v;
    $query = 'SELECT x, y, z FROM tbl WHERE id = ?';//using posted ID as value
    $stmt = $db->prepare($query);
    $stmt->execute(array($id));
    
    一切都很好,因为设置了
    $id
    ,但永远不要信任网络,不要认为,仅仅因为设置了
    $\u POST
    ,所有键都将被设置,并且它们的值都是正确的:

    //request 2: POST => foo=bar&page=2
    foreach ($sanitized as $k => $v)
        $$k = $v;
    $query = 'SELECT x, y, z FROM tbl WHERE id = ?';//using posted ID as value
    $stmt = $db->prepare($query);
    $stmt->execute(array($id));//id is null
    
    现在我们有一个问题。这只是代码可能导致问题的一个示例。想象一下
    $array = [
        'login' => true,
        'foo'   => 'bar'
    ];
    
    extract($array);
    
    extract($array, EXTR_SKIP); // Skip existing variables
    // Or
    extract($array, EXTR_PREFIX_ALL, 'prefix'); // Prefix them all.