1

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

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

举例$_POST['comment']来说,我有想要添加到数据库的 POST 值,这是否是一种在数据库进入之前对其进行清理的好且安全的方法?

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 数据库之前,我还需要做些什么吗?还是前两条线自己发挥了作用?请让我知道这是否是一种安全的好方法,或者是否有更好的方法!谢谢!

4

6 回答 6

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 提供了参数化查询,您应该熟悉它们,并将真正对应于数据库驱动程序的内容留给库。

于 2013-05-20T22:31:11.197 回答
1

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

而且,

根据这个答案,人们应该避免写帖子,这样人们就可以使经过清理的代码远离未经清理的代码。即使你“消毒”一切,它也会导致坏习惯。

于 2013-05-20T22:32:43.433 回答
1

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

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

将正确参数化的预处理语句与 mysqli 一起使用的示例:

$stmt = mysqli_prepare($connection, "INSERT INTO comments VALUES (?)");
mysqli_stmt_bind_param($stmt "s", $comment);
mysqli_execute($stmt);
于 2013-05-20T22:33:14.103 回答
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;

参数类型

人物描述
我对应的变量具有整数类型
d 对应变量的类型为 double
s 对应的变量为字符串类型
b 对应的变量是一个 blob,将在数据包中发送

文档

于 2013-05-20T22:30:02.660 回答
0

不利的一面是您损坏了帖子变量,因此您不能将它们用于查询以外的其他目的。例如,如果您仍然想回显一些帖子变量怎么办?

更好的是逃到一个新的数组

更好的是不要转义而是使用参数化查询。

于 2013-05-20T22:31:54.700 回答
0

您错过了安全 PHP 编码的一些最重要的事情。

让我们从头开始。

请从这些链接开始:请阅读代码注释

这是第一个//而这第二个!

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/Mysql我不能解决一切!确保

有关如何设置 PDO,请参阅我的另一个问题

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

遵循这些安全 PHP 实践以获得更安全的 php 编码。

享受

于 2013-05-20T22:47:07.760 回答