我已经在我的网站上使用这段代码很长一段时间了,只是想确保我正确地对我的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数据库之前,还有什么需要做的吗?或者那些前两行是否自己做了魔术?如果这是一个很好的安全方法,或者有更好的方法,请告诉我!谢谢!
答案 0 :(得分:2)
我已经尝试过了。似乎没有神奇的功能。但是,从经典的MySQL注入中,你可以安全地将mysqli_real_escape_string添加到每个发布的值,然后在数据库中将其用作字符串(引用),但它被认为是不好的做法,也不是最安全的方式
由于MySQLi提供了参数化查询,您应该熟悉它们,并将与数据库驱动程序对应的真实信息留给库。
答案 1 :(得分:1)
答案 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
答案 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编码。
享受