保护所有帖子并在框架php中获取数据

时间:2014-05-13 21:07:03

标签: php security post get sql-injection

我刚才有这样的想法" preSecure"来自$ _post和$ _get的所有用户输入数据。但我想知道这是不是很好的做法,并希望得到一些意见。以下是我提出的建议:

function clean_str($str){
    return preg_replace('#[^a-z_ 0-9@.-]#i', '', $str);
}

if ($_POST){
    foreach ($_POST AS $key => $val){
        $_POST[$key] = clean_str($val);
    }
}

if ($_GET){
    foreach ($_GET AS $key => $val){
        $_GET[$key] = clean_str($val);
    }
}

此代码段只会在每个http请求的开头运行。可以开发clean_str函数以允许其他字符和替换字符等(这只是一个示例)。但我认为第一个目标是简单地阻止sql注入。我现在能用这种方法看到的唯一不好的事情是你的"插件"需要从用户输入发送sql命令。上面的appraoch当然可以包含在一个函数中,如果需要可以调用。 Post和Get是全局变量,所以这不会有问题。

我实际上正在编写自己的框架(还有很多工作),如果我能够完成它,我会发布它。问题是我经常看到新手开发人员在数据库查询中添加$ _POST [' userinput']。上面的代码应该可以做到这一点。那就是我所做的一些背景以及为什么我提出这个问题。

我很高兴听到你的想法。这可能不是Stack Overflow的最佳问题,我想我想更多地讨论这种方法来分享想法和输入。但是为了表达我的问题,它将符合以下内容:是否有任何其他方法比这更快或更具可扩展性,或者与此相等,或者另一种功能可以补充这种方法吗?这种方法是好的做法吗?是否可以覆盖post的全局变量并获取上述数据?

我知道上面的代码不是面向对象的,而是关于清理用户的方法。在运行检查之前自动输入数据。我认为这会节省很多代码和麻烦。

请与我分享您的想法。由于Stack Overflow上的评论有限,如果您对此表提出新的想法,我将不胜感激。评论是在这种情况下评论具体的想法/答案。

2 个答案:

答案 0 :(得分:2)

首先,如果用户尝试注入一个数组然后它会生成一个通知,你应该在调用它之前检查一个字符串,否则:

Notice: Array to string conversion 

但说实话,你只是创建自己的魔术引号版本,这不是一个好主意。

简单而好的解决方案是使用PDO或MySQLi准备好的语句。

PHP Website上有关魔术引语的帖子总结得很好:

  

魔术引号被弃用的原因是逃避/引用的一刀切方法是错误的并且非常危险。不同类型的内容具有不同的特殊字符和不同的方式来逃避它们,并且在一个中起作用的往往在其他地方具有副作用。任何样本代码,无论是在这里还是其他任何地方,假装像魔术引号一样工作 - 或者对HTML,SQL或其他任何事情进行类似的转换 - 同样是错误的并且同样危险。

     

魔术引号不是为了安全。他们从来没有。这是一个方便的东西 - 它们存在,所以PHP noob可以摸索并最终编写一些有用的mysql查询,而不必正确地学习转义/引用数据。它们可以防止一些意外的语法错误,就像他们的工作一样。但他们不会阻止恶意和半知识渊博的攻击者诋毁PHP noob的数据库。而那个可怜的菜鸟甚至可能都不知道他的数据库现在是怎样或为什么会消失,因为魔术引用(或者他那漂亮的“我将逃脱一切”的功能)给了他一种虚假的安全感。他从来不必学习如何真正处理不受信任的输入。

     

应该在需要转义数据的地方以及使用它的域中转义数据。 (mysql_real_escape_string - NOT addslashes! - 用于MySQL(除非你有线索和使用预备语句,否则这只是),htmlentities或htmlspecialchars for HTML等等。)其他任何事情都注定要失败。

答案 1 :(得分:1)

这不是一个好方法。防止MySQL注入并不仅仅是确保某些字符被转义 - 即使您尝试以这种方式进行消毒,仍然可以进行大量的攻击。当您可以使用准备好的语句并且不再担心需要检查的所有事情时,您似乎过度复杂化了事情。 http://www.php.net/manual/en/mysqli.prepare.php