这是一个小片段,它是使用PHP和数据库构建的,目的是为了简化和测试,这里是一个文本示例。
这个想法是表单将提交,然后PHP将处理结果。然而,为了安全起见,我尝试在每个帖子中使用mysql_real_eescape_string(也许有更好的方法?(
无论如何,问题就在这里。当我保持foreach循环时,两个post数组变量qty[]和optname[]都返回为NULL(出于测试目的,通过var_export($_post(输出(。这是输出WITH foreach mysql_real_eescape_string循环的内容:
array (
'update' => 'Yes',
'qty' => NULL,
'optname' => NULL,
)
如果我删除foreach循环,一切都很好,这就是我得到的,也是php处理结果所需要的,这就是foreach mysql_real_eescape_string循环注释掉的结果:
array (
'update' => 'Yes',
'qty' =>
array (
1 => '2',
2 => '2',
3 => '2',
4 => '2',
),
'optname' =>
array (
1 => '1|4',
2 => '1|4',
3 => '1|4',
4 => '1|4',
),
)
但是,在sql查询发生之前,不会对数据进行检查/清理。如何使用循环检查每个post变量,但保持post变量不变??
以下是可以粘贴到任何本地主机并进行测试的代码。
<?php
foreach ($_POST as $key=>$value) { $_POST[$key] = mysql_real_escape_string($value); }
echo '<pre>';
var_export($_POST);
echo '</pre>';
?>
<form name="updateQty" id="updateQty" method="post" />
<input type="hidden" name="update" id="update" value="Yes" />
<input type="text" name="qty[1]" id="qty[]" class="field" value="2" />
<input type="hidden" name="optname[1]" id="optname[]" value="1|4" />
<input type="text" name="qty[2]" id="qty[]" class="field" value="2" />
<input type="hidden" name="optname[2]" id="optname[]" value="1|4" />
<input type="text" name="qty[3]" id="qty[]" class="field" value="2" />
<input type="hidden" name="optname[3]" id="optname[]" value="1|4" />
<input type="text" name="qty[4]" id="qty[]" class="field" value="2" />
<input type="hidden" name="optname[4]" id="optname[]" value="1|4" />
<input type="submit">
</form>
谢谢!
我正在尝试使用mysql_real_eescape_string进行安全
这就是你做错的地方此功能与安全性无关
事实上,您真正想做的是恢复一个已经被弃用和删除的magic quotes
功能,在不确保数据安全的情况下破坏数据。
至少你必须这样使用这个功能
$var = "'".mysql_real_escape_string($value)."'";
向转义值添加引号(当然,同时从查询中删除引号(。并且您必须在查询构建之前完成它,而不是在其他任何地方。
foreach ($_POST as $key=>$value) {
if(is_array($value)){
foreach ($value as $k => $v) {
$_POST[$key][$k] = mysql_real_escape_string($v);
}
} else {
$_POST[$key] = mysql_real_escape_string($value);
}
}
在您的情况下,POST值是数组,因此您也必须循环它们。。
正如@hjpotter92评论的那样,使用旧的mysql函数是不好的。它们在未来的版本中不起作用。。。
一种更简单的方法(未经测试(是尝试array_walk_recursive()
。
function MyEscape( &$string, $key ) {
if( !is_array($string) )
$string = mysql_real_escape_string( $string );
}
array_walk_recursive($_POST, 'MyEscape');