0

这是一个小段,为了简单和测试目的,使用 PHP 和数据库构建,这里是一个文本示例。

这个想法是表单将提交,然后 PHP 将处理结果。但是我试图为每个帖子使用 mysql_real_escape_string 以确保安全(也许有更好的方法?)

无论如何,这就是问题所在。当我保持 foreach 循环到位时, qty[] 和 optname[] 的两个后数组变量都返回为 NULL(通过 var_export($_POST) 输出用于测试目的。这是 WITH foreach mysql_real_escape_string 循环输出的内容:

array (
  'update' => 'Yes',
  'qty' => NULL,
  'optname' => NULL,
)

如果我删除 foreach 循环一切正常,这就是我得到的,也是 php 处理结果所需要的,这就是我用 foreach mysql_real_escape_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>

谢谢!

4

3 回答 3

2

我正在尝试使用 mysql_real_escape_string 来保证安全

那就是你做错了。此功能与安全性完全无关
事实上,你真正想做的是恢复一个已经被弃用和删除magic quotes的功能,破坏你的数据而不保证它的安全。

至少您必须以这种方式使用此功能

$var = "'".mysql_real_escape_string($value)."'"; 

将引号添加到转义值(当然同时从查询中删除它们)。而且您必须在查询构建之前完成它,而不是其他任何地方。

于 2013-04-06T20:26:40.060 回答
1
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 函数。他们不会在未来的版本中工作......

于 2013-04-06T20:14:12.907 回答
0

一种更简单的方法(未经测试)是尝试array_walk_recursive().

function MyEscape( &$string, $key ) {
    if( !is_array($string) )
        $string = mysql_real_escape_string( $string );
}
array_walk_recursive($_POST, 'MyEscape');
于 2013-04-06T20:41:56.237 回答