这是清理php $ _POST输入的好方法吗?

时间:2013-05-20 22:26:57

标签: php mysql database post

我已经在我的网站上使用这段代码很长一段时间了,只是想确保我正确地对我的PHP $_POST输入进行了整理......

foreach($_POST as $key=>$val) //this code will sanitize your inputs.
  $_POST[$key] = mysqli_real_escape_string($connection, $val);

比如说我有一个我想要添加到数据库的POST值$_POST['comment'],这是一个在数据库输入之前对它进行整理的好方法吗?

foreach($_POST as $key=>$val) //this code will sanitize your inputs.
  $_POST[$key] = mysqli_real_escape_string($connection, $val);

  //is this safe? or is there another step?
  $comment = $_POST['comment'];

  if($comment != ""){
  //add $comment to database
  }

在将$comment添加到MYSQL数据库之前,还有什么需要做的吗?或者那些前两行是否自己做了魔术?如果这是一个很好的安全方法,或者有更好的方法,请告诉我!谢谢!

6 个答案:

答案 0 :(得分:2)

可能重复:https://stackoverflow.com/questions/15664021/php-escaping-vars-posted-through-var-and-got-by-postvari-with-a-meth

我已经尝试过了。似乎没有神奇的功能。但是,从经典的MySQL注入中,你可以安全地将mysqli_real_escape_string添加到每个发布的值,然后在数据库中将其用作字符串(引用),但它被认为是不好的做法,也不是最安全的方式

由于MySQLi提供了参数化查询,您应该熟悉它们,并将与数据库驱动程序对应的真实信息留给库。

答案 1 :(得分:1)

不是。可以使用multibyte攻击,这将绕过所有这些消毒剂。

此外,

根据this answer,应该避免写信给人,这样可以保持消毒的代码远离未经消毒的代码。即使你“消毒”一切,也会导致坏习惯。

答案 2 :(得分:1)

这不是清理输入的好方法。查询应该参数化,输入应该作为参数提供,无论它来自何处。不应该进行额外的卫生设施(否则可能会重复)。

如果您有特定规则(例如$comment != ""),则这是验证,由您自行决定验证规则以及如何处理无效输入(与未经过验证的输入不同输入)。

使用mysqli:

使用正确参数化的预准备语句的示例
$stmt = mysqli_prepare($connection, "INSERT INTO comments VALUES (?)");
mysqli_stmt_bind_param($stmt "s", $comment);
mysqli_execute($stmt);

答案 3 :(得分:0)

_real_escape_string不会完全清理用户输入。你必须使用准备好的陈述。

面向对象的风格

$stmt = $mysqli->prepare("INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)");
$stmt->bind_param('sssd', $code, $language, $official, $percent);

$code = 'DEU';
$language = 'Bavarian';
$official = "F";
$percent = 11.2;

程序风格

$stmt = mysqli_prepare($link, "INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)");
mysqli_stmt_bind_param($stmt, 'sssd', $code, $language, $official, $percent);

$code = 'DEU';
$language = 'Bavarian';
$official = "F";
$percent = 11.2;

参数类型

Character     Description
i   corresponding variable has type integer
d   corresponding variable has type double
s   corresponding variable has type string
b   corresponding variable is a blob and will be sent in packets

Documentation

答案 4 :(得分:0)

不利的一面是你使用post vars,因此除了查询之外你不能将它们用于其他目的。例如,如果你还想回应一些后期变量怎么办?

更好的是逃到新阵列

甚至更好的是不转义但使用参数化查询。

答案 5 :(得分:0)

您缺少安全PHP编码的一些最重要的事情。

让我们从头开始。

请从以下链接开始:请阅读代码评论

This first // and this second!

  

1)如果数据通过验证,则验证并过滤数据!

所以我们有一个注册表,一个接收电子邮件......所以我们现在所做的就是验证电子邮件。

$email = $_POST['email']; // Declare the variable
if (filter_var($email, FILTER_VALIDATE_EMAIL)) { // If validation passes ... 
    $safe_email = filter_var($email, FILTER_SANITIZE_EMAIL) // Sanitize the email
} else { // Validation fails no need to sanitize
    echo "WRONG EMAIL PUNK!!!!";
}
  

2)现在使用Mysqli或PDO(我更喜欢PDO):

$dbh = new PDO("mysql:host=xxxxxx;dbname=xxxxxx;charset=utf8", USERNAME(XXXXXXXXX), PASSWORD(XXXXXXXX); // Set up the PDO instance PLEASE DO NOT FORGET TO EXPLICETELY STATE A CHARSET!!!!
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // Set up error mode
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE); // I prefer emulate prepares to be false

$sql = INSERT INTO ..... (........., email) VALUES (............, :email); // Set up our named parameter
$query -> $dbh -> prepare($sql); // Prepare the query 
$query -> bindParam (':email', $email);
$query -> execute() // Yay!

使用PDO和MysqlI这一切都很好,但是有一个名为:

的表达式
Its not the wand, its the wizard. 

PDO / MysqlI无法解决所有问题!确保

Refer to my other question on how to set up PDO

1)验证 2)消毒 3)使用参数进行更安全的查询! 4)逃避任何外部(不受信任的数据)

遵循这些安全PHP实践,以实现更安全的PHP编码。

享受