时间:2011-01-19 22:50:46

标签: php mysql

我正在使用$ _POST并了解mysql漏洞,我决定在我的页面顶部使用此函数,因此所有POST都是安全的: 你能告诉我,如果我错过了一些东西,这个功能真的会按照我的想法完成吗?

function clean_post(){
    if ( $_POST){
            foreach ($_POST as $k => $v) {
            $_POST[$k]=stripslashes($v);
            $_POST[$k]=mysql_real_escape_string($v);
            $_POST[$k]=preg_replace('/<.*>/', "", "$v");
        }
  }

  if ( $_COOKIE){
            foreach ($_COOKIE as $k => $v) {
            $_COOKIE[$k]=stripslashes($v);
            $_COOKIE[$k]=mysql_real_escape_string($v);
            $_COOKIE[$k]=preg_replace('/<.*>/', "", "$v");
        }
  }
}

它还将删除所有html标记,输出结果的最安全选项可能是使用:

<pre>
  $foo 
</pre> 

干杯!

干杯!

7 个答案:

答案 0 :(得分:10)

我认为这样做是个坏主意。它会破坏用户在访问数据库之前输入的数据。这种方法还会鼓励您使用延迟编码,因为您始终认为所有数据都已“干净”。有一天当你需要输出一些不安全的角色并且你忘记逃脱它们或者你不确定你需要调用哪个函数这样你只是尝试一些东西并希望它有效时,这会回来咬你。 / p>

要正确地执行此操作,您应确保禁用magic quotes并且仅在必要时使用正确的转义方法转义数据 - 不多也不少。

答案 1 :(得分:2)

它有一些问题。

首先在不需要它们的类型上应用函数,例如,整数只需要(int)强制转换为安全。

其次你没有保证长度,当你要求'12字符串'时,最好确保你只有12个字符,而不是2048字符。限制大小确实是你的攻击者不会等。

你的foreach循环中有第三个你有一个$ v变量,你将$ v上的一个函数分配给$ _POST [$ k]。因此,当第3次发生时,前两个分配将丢失......

然后以前所说的所有事情都是正确的: - )

规则是在适当的时刻应用过滤器以获得正确的输出。 HTML输出需要一个html过滤器(htmlspecialchars),但数据库不需要它,它需要一个数据库转义。假设您想从数据库中提取数据以构建CSV或PDF,HTML转义将使您的生活更加艰难。您此时需要CSV转义,或PDF转义。

最后,如果您正在操作已经为输出完成转义的数据,则实际上很难记住。我建议您阅读关于Apps Hungarian的Joel on Software的精彩内容。文本很长,但非常好,并且网络转义序列用作为什么Apps匈牙利语好(即使System Hungarain不好)的例子。

答案 2 :(得分:1)

嗨,这是我在网上提出的任何问题的第一个答案,所以请查看。

将此代码放在脚本的顶部,无需将这些已发布的值分配给任何变量,以便为数据库的输入数据安全做同样的工作。只需在查询语句中使用$ _POST值。

foreach ($_POST as $k => $v) {                  
      if(!is_array($_POST[$k]) ) {       //checks for a checkbox array & so if present do not escape it to protect data from being corrupted.
          if (ini_get('magic_quotes_gpc')) {      
                $v = stripslashes($v); 
            }               

            $v = preg_replace('/<.*>/', "", "$v");           //replaces html chars
            $_POST[$k]= mysql_real_escape_string(trim($v));

        }
 }

答案 3 :(得分:0)

使用stripslashes时,我会使用get_magic_quotes_gpc()

if (get_magic_quotes_gpc()) {
    $_POST[$k]=stripslashes($v);
}

否则你会过度剥离。

答案 4 :(得分:0)

不要忘记$ _GET []

if ($_POST OR $_GET)

您还可以添加 strip_tags()

答案 5 :(得分:0)

我不知道你的功能是否正确,但原则肯定是不正确的。你只想在你需要的地方逃脱,即在你把事情传递到MySQL之前(实际上你甚至不想这样做,理想情况下;使用绑定参数)。

在很多情况下,您可能希望通过HTTP请求传入原始数据。根据您的方法,没有能力这样做。

答案 6 :(得分:0)

总的来说,我认为这不是一个好主意。

  1. 并非所有的帖子数据都必然会进入MySQL,因此如果没有,则无需转义。也就是说,使用像PDO和预处理语句这样的东西是更好的方法,mysql_*函数已被弃用。
  2. 正则表达式可能会破坏许多可能有效的文本。输出时你应该担心像HTML这样的东西,而不是输入。此外,使用strip_tagshtmlspecilchars等函数来处理此问题。
  3. stripslashes仅在启用魔术引号时才有必要(它们不应该是,但总是可行的)