使用用户输入安全MYSQL查询

问题描述:

我只是想检查我的PHP-MYSQL查询有多安全(如果有的话),我使用的是通过$ _POST进行验证的用户数据,然后验证 - 所有数据的验证过程包括对字符串和trim()使用mysqli_real_escape_string()。然而,我的一些输入的性质意味着我不限制用户输入中的任何字符。我在做什么是安全的,如果不是如何改善的话。使用用户输入安全MYSQL查询

插入查询的示例(其中$ name和$描述的是已通过验证函数$ _POST数据值。)

$sql = "INSERT INTO company(company_name, company_description) VALUES('".$name."', '".$description."')"; 
$result = mysqli_query($con, $sql); 

选择查询的一个实例(其中$ companyid是用户输入,real_escaped和剥离)

$sql = "SELECT * FROM events WHERE event_company=".$companyid.""; 
$result = mysqli_query($con, $sql); 

在此先感谢。

+3

你的查询是不是安全可言,你需要使用PDO或mysqli的准备语句 – cmorrissey

+1

感受一下SQL注入的后果** [这里](https://开头xkcd.com/327/)**,如果你不想处理它,请阅读** [这个相当全面的问题/答案](https://*.com/questions/60174/如何防止SQL注入在PHP)** – YvesLeBorg

+1

'mysqli_real_escape_string'不会保护您的选择查询。你可以用'$ company =“1或event_company = 2来试试';'。如果1和2在你的数据库中,你会得到两个。 – jh1711

这里是您的查询更新为使用mysqli预准备语句。

$sql = "INSERT INTO `company` (`company_name`, `company_description`) VALUES(?, ?)"; 
$stmt = $con->prepare($sql); 
$stmt->bind_param('ss',$name,$description); // ss is for string string 
$stmt->execute(); 
$result = $stmt->get_result(); 

$sql = "SELECT * FROM `events` WHERE `event_company` = ?"; 
$stmt = $con->prepare($sql); 
$stmt->bind_param('i',$companyid); // i indicates integer 
$stmt->execute(); 
$result = $stmt->get_result(); 

有一种名为“SQL INJECTION”的黑客可以欺骗你的控制。在那里阅读以获得更多信息https://www.veracode.com/security/sql-injection