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.