Php mysql真正的转义字符串能防止黑客攻击吗?

Php mysql真正的转义字符串能防止黑客攻击吗?,php,security,sql-injection,Php,Security,Sql Injection,可能重复: 我是PHP新手,我想确定一下。如果我对用户生成的输入(变量)使用mysql\u real\u escape\u字符串,查询不会被破解 示例脚本: // Getting Unique ID $sql = "select `Person_id` from `accounts` where `username` = '$username'"; $query = mysql_query($sql) or die ("Error: ".mysql_error()); while ($row

可能重复:

我是PHP新手,我想确定一下。如果我对用户生成的输入(变量)使用mysql\u real\u escape\u字符串,查询不会被破解

示例脚本:

// Getting Unique ID
$sql = "select `Person_id` from `accounts` where `username` = '$username'";
$query = mysql_query($sql) or die ("Error: ".mysql_error());
while ($row = mysql_fetch_array($query)){
    $pid = $row['Person_ID'];
}
mysql_free_result($query);
$username = mysql_real_escape_string($_POST['Username']);
$newname = mysql_real_escape_string($_POST['Full_name']);
$newgender = mysql_real_escape_string($_POST['Patient_gender']);
$newmonth = mysql_real_escape_string($_POST['Month']);
$newday = mysql_real_escape_string($_POST['Day']);
$newyear = mysql_real_escape_string($_POST['Year']);
$newacctss = mysql_real_escape_string($_POST['Acct_SS']);
$newaddress = mysql_real_escape_string($_POST['Address']);
$newaddress2 = mysql_real_escape_string($_POST['Address2']);
$newcity = mysql_real_escape_string($_POST['City']);
$newstate = mysql_real_escape_string($_POST['State']);
$newzipcode = mysql_real_escape_string($_POST['Zip_code']);
$newhomephone = mysql_real_escape_string($_POST['Home_phone']);
$newcellphone = mysql_real_escape_string($_POST['Cell_phone']);
$neworkphone = mysql_real_escape_string($_POST['Work_phone']);
$newsure = mysql_real_escape_string($_POST['Sure']);
$newfav = mysql_real_escape_string($_POST['Favorite']);
$newcars = mysql_real_escape_string($_POST['Cars']);
$newdrinks = mysql_real_escape_string($_POST['Drinks']);
$newmoi = mysql_real_escape_string($_POST['About_moi']);

//Update Name Only
$sql = "UPDATE accounts SET `full_name` = '$newname' WHERE Username = '$username'"; 
$query1 = mysql_query($sql) or die ("Error: ".mysql_error());

//Everything else being udpated here 
$sql2 = "UPDATE profile SET `Patient_gender` = '$newgender', 
`Month` = '$newmonth', `Day` = '$newday', `Year` = '$newyear', 
`Acct_SS` = '$newacctssn', `Address` = '$newaddress', 
`Address2` = '$newaddress2', `City` = '$newcity', `State` = '$newstate', 
`Zip_code` = '$newzipcode', `Home_phone` = '$newhomephone', 
`Cell_phone` = '$cellphone', `Work_phone` = '$neworkphone', 
`Sure` = '$newsure', `Favorite` = '$newfav', `Cars` = '$newcars', 
`Drinks` = '$newdrinks', `About_moi` = '$newmoi' WHERE Person_id = '$pid'"; 
$query2 = mysql_query($sql2) or die ("Error: ".mysql_error());

如果您同时使用引号和mysql\u real\u escape\u字符串,那么您就相当安全了。出于其他原因,您可能希望查看PDO或至少是mysqli。

不要使用纯mysql。使用
mysqli
(注意i)或PDO库并使用准备好的语句。使用预处理语句比使用直接查询和在查询字符串中包含变量更安全


根据PHP文档。它不再是欠发达的,应该改用
mysqli
PDO
扩展。

这要看情况而定。只要它是用引号括起来的字符串数据,就可以了。你能展示一下你的现实生活中的疑问吗?在第3页的inb4“使用准备好的语句”评论中。。。。2.1…Stack Overflow有一个搜索框:PDO是一个很好的主意,但是,没有它,您可以获得相同的结果。PDO最大的好处不是增加了更多的安全性,而是更容易安全地编写查询。是否需要定义“更安全”?准备好的语句如何更安全?数据库引擎不会将绑定的变量组合到SQL语句中,然后解析整件事;绑定的变量保持独立,从不作为通用SQL语句进行分析。这样,用户就无法注入SQL,因为它从未被解析为SQL。