-1

有人可以告诉我我做错了什么吗?我正在尝试使用 php 过滤器清理和验证表单用户输入。此输入将进入 mySql 数据库,然后是 html 页面输出,因此我需要删除所有 html 标记并为 mySQL 提供安全性。

谢谢。

      /*
 * BEGIN Sanitize and validate
 */

  // Adding fields to sanitize array.
$filters = array(
   'author'  => FILTER_SANITIZE_SPECIAL_CHARS,
   'title'  => FILTER_SANITIZE_SPECIAL_CHARS,
   'description'  => FILTER_SANITIZE_SPECIAL_CHARS,
);


/*** apply the filters to the POST array ***/
$filtered = filter_input_array(INPUT_POST, $filters);


 // filtering out anything that isn't an email address
    $sanitized_email = filter_var(($_POST["email"]), FILTER_SANITIZE_EMAIL);
    if ( filter_var($sanitized_email, FILTER_VALIDATE_EMAIL)  == TRUE) {
        echo '';
    } else {
        echo 'Invalid Email Address.  Go Back.';
        exit;
    }

    /*
 * BEGIN sanitize and validate
 */

新代码但仍然无法正常工作。我做错了什么。仍然在数据库中获取 html 并且错误不起作用。

      /*
 * BEGIN Sanitize and validate
 */

  // Adding fields to sanitize array.
$filters = array(
   'author'  => FILTER_SANITIZE_STRING,
   'title'  => FILTER_SANITIZE_STRING,
   'description'  => FILTER_SANITIZE_STRING,
);


/*** apply the filters to the POST array ***/
$filtered = filter_input_array(INPUT_POST, $filters);
$filters = array_map('mysql_real_escape_string',$filters);
$filters = array_map('htmlspecialchars',$filters);
    if ( filter_var_array($filtered, FILTER_SANITIZE_STRING)) {
        echo '';
    } else {
        echo 'Invalid Input.  Go Back.';
        exit;
    }



// filtering out anything that isn't an email address
    $sanitized_email = filter_var(($_POST['email']), FILTER_SANITIZE_EMAIL);
    if ( filter_var($sanitized_email, FILTER_VALIDATE_EMAIL)) {
        echo '';
    } else {
        echo 'Invalid Email Address.  Go Back.';
        exit;
    }

    /*
 * BEGIN sanitize and validate
 */

第二次编辑如下:

通过将清理代码添加到将数据带入数据库的脚本区域,将清理后的数据显示在数据库中。

 $_POST['author'] = mysql_real_escape_string(trim($_POST['author']));
      $author=filter_var($_POST['author'], FILTER_SANITIZE_STRING);

      $_POST['email'] = mysql_real_escape_string(trim($_POST['email']));
      $email=filter_var($_POST['email'], FILTER_SANITIZE_EMAIL);

现在我必须完成验证电子邮件的尝试。

4

1 回答 1

0

第一件事:过滤器模块不提供您的查询安全性;该扩展与数据库交互无关,它只清理或验证用户输入(之后你可以在不使用数据库的情况下用它做很多事情)

更新:例如,在使用过滤器模块后,会破坏 sql 查询的引号或撇号仍然存在,并且因为字符串没问题,如果您决定将其保存在数据库中(或者它赢了),您的工作就是将其转义在绑定参数的 PDO 等系统中不是问题)

因此,为了保护您的查询,您应该使用PDO,或者如果您被其他系统卡住,您可以使用适当的东西(例如使用mysql_real_escape_string为 mysql_* 函数转义输入)

考虑到您没有说您遇到的问题是什么,我可能会补充说,如果您想“清理”用户输入并删除 html,您还应该使用FILTER_SANITIZE_STRING标志而不是FILTER_SANITIZE_SPECIAL_CHARS

对我来说,这个脚本http://codepad.org/Wrgl0qEg工作正常并从输入中删除 html 标签

于 2012-04-26T14:48:58.873 回答