Php 如何从输入中保护SQL查询?
如何从输入中保护SQL查询 我将参数发布到php中的一个页面&然后我必须将其插入数据库,但我不知道如何保护输入参数Php 如何从输入中保护SQL查询?,php,mysql,Php,Mysql,如何从输入中保护SQL查询 我将参数发布到php中的一个页面&然后我必须将其插入数据库,但我不知道如何保护输入参数 <?php $con=mysqli_connect("example.com","peter","abc123","my_db"); // Check connection if (mysqli_connect_errno()) { echo "Failed to connect to MySQL: " . mysqli_connect_error(); } mys
<?php
$con=mysqli_connect("example.com","peter","abc123","my_db");
// Check connection
if (mysqli_connect_errno())
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
mysqli_query($con,"INSERT INTO Persons (FirstName, LastName, Age)
VALUES ($_POST['FirstName'], $_POST['LastName'],$_POST['Age'])");
mysqli_close($con);
?>
您需要做多件事。首先,为什么要使用常用的MYSQL方法?您应该使用PDO对象
然后可以使用prepare()方法,然后将其作为数组插入
请检查通过预先转义这些字符串,您可以轻松地使用mysqli
函数集完成此操作。MySQL PHP驱动程序包含一个函数,用于安全地转义字符串以插入字符串->mysqli\u real\u escape\u string
这会将您的查询更改为:
mysqli_query($con,"INSERT INTO Persons (FirstName, LastName, Age) VALUES ('" . mysqli_real_escape_string($_POST['FirstName']) . "', '" . mysqli_real_escape_string($_POST['LastName']) . "', '" . mysqli_real_escape_string($_POST['Age']) . "')");
这将解决您对SQL输入安全性的大部分担忧
可选
通过使用准备好的语句,充分利用其他类型和更安全查询的驱动程序转义,您也可以使用mysqli
这样做:
// Prepare our query
$stmt = mysqli_prepare($con, "INSERT INTO Persons (FirstName, LastName, Age) VALUES (?, ?, ?)");
// Bind params to statement
mysqli_stmt_bind_param($stmt, "ssi", $_POST["FirstName"], $_POST["LastName"], $_POST["Age"]);
// Execute the query
mysqli_stmt_execute($stmt);
最好的方法是使用CodeIgniter、Kohana、Zend等框架。。。
它已经内置了安全类。
如果你不想使用这些框架,你可以选择这些类
另一种方法,你可以使用ORM。
你可以用红豆
如果涉及用户输入,那么使用参数化查询以避免SQL注入。这可能是一个复制品。看一看,这可能是最好的东西,这不一定是一个实用的答案-我认为这更多的是一个评论。你可以使用prepare
和mysqli
-为什么他必须切换到PDO并放弃这种方法?PDO是一种安全的方法,你可以更有效地控制和更安全。如果你想了解更多的原因,那么请看我对阅读教程不感兴趣,如果你建议换成PDO,你应该解释原因-他问了怎么做,很可能想坚持目前的设置。为什么他需要研究你的链接?PDO比mysql稍慢一点,但它有很好的可移植性。PDO提供跨多个数据库的单一接口。这意味着您可以使用多个DB,而无需使用mysql的mysql\u查询、mssql的mssql\u查询等。只需始终使用类似$DB->query(“插入…”)的内容即可。无论您使用的是什么DB驱动程序。因此,对于较大或可移植的项目,PDO更可取。甚至zend框架也使用PDO。对你来说足够好了,伊苏里尔?->我没有问这个问题,我只是给了你一些建议来提高你答案的质量。不管你怎么想,发布链接并不是很有帮助。查看MetaStackOverflow上的第一个答案以了解更多信息。我使用mysqli\u real\u escape\u字符串,但不使用时间outing@user2522767mysqli\u real\u escape\u string
很可能不是罪魁祸首,而是您在代码文件中正在做的其他事情。