创建消毒功能

时间:2015-07-09 15:44:36

标签: php

阅读所有关于消毒的帖子让我很困惑。我正在创建一个博客类型的网站,需要清理用户输入,这些输入将进入数据库(用户个人资料信息,博客帖子和评论)以及来自GET请求的某些ID和用户名,以使用查询来显示信息。

这是我根据我所读到的内容拼凑而成的:

function escape($data) {
    global $conn;
    connect();
    $data = $conn->real_escape_string($data);
    $conn->close();
    $data = str_replace(chr(0), '', $data);
    return $data;
}

function sanitize($data) {
  $data = trim($data);
  $data = strip_tags($data);
  $data = stripslashes($data);
  $data = escape($data);
  $data = htmlspecialchars($data);
  return $data;
}

striplashes让我感到困惑。我知道PHP自动将这些放入GET和POST请求中,双斜线可能是个问题。我应该在stripslashes之后的函数中添加addslashes()以确保它没问题吗?

对于所有insert和update语句,插入的值都是使用预准备语句绑定的,但是所有其他语句都没有准备好(在这个项目的这个阶段,由于各种原因,对它们执行预处理语句效率不高)。

我很想得到您的反馈。就像我说的,这一切都很混乱!

更新:

我添加了$ data = str_replace(chr(0),'',$ data);防止空字节注入。是吗?

BTW,进入查询的唯一GET请求是ID号(我有一个删除除数字之外的所有内容的函数)或用户名。在进入任何查询之前,我正在使用上面的转义函数来清理用户名。这够好吗?

我在博客文章和个人资料信息上使用的清理功能,由用户提供并通过预准备语句插入到表中。

1 个答案:

答案 0 :(得分:1)

function cleanInput($input) {

  $search = array(
    '@<script[^>]*?>.*?</script>@si',   // Strip out javascript
    '@<[\/\!]*?[^<>]*?>@si',            // Strip out HTML tags
    '@<style[^>]*?>.*?</style>@siU',    // Strip style tags properly
    '@<![\s\S]*?--[ \t\n\r]*>@'         // Strip multi-line comments
  );

    $output = preg_replace($search, '', $input);
    return $output;
}    


function sanitize($input) {
        if (is_array($input)) {
            foreach ($input as $var => $val) {
                $output[$var] = sanitize($val);
            }
        } else {
            if (get_magic_quotes_gpc()) {
                $input = stripslashes($input);
            }
            $input = cleanInput($input);
            $output = mysql_real_escape_string($input);
        }
        return $output;
    }