Php 在MySQL查询中使用GET变量安全吗?
我有一个简单的场景:一个用户连接到“get.php?city=london”,然后服务器在MySQL数据库中搜索与该请求匹配的数据并将其输出 我正在使用以下代码执行此操作:Php 在MySQL查询中使用GET变量安全吗?,php,mysql,apache,security,http,Php,Mysql,Apache,Security,Http,我有一个简单的场景:一个用户连接到“get.php?city=london”,然后服务器在MySQL数据库中搜索与该请求匹配的数据并将其输出 我正在使用以下代码执行此操作: <?php $con = mysql_connect( 'localhost', 'user', 'pass') or die('Could not connect to mysql server.' ); mysql_select_db('mydb', $con) or die('Could not select d
<?php
$con = mysql_connect( 'localhost', 'user', 'pass') or die('Could not connect to mysql server.' );
mysql_select_db('mydb', $con) or die('Could not select database.');
if(!isset($city)) return;
$c=$_GET["city"];
$q = "select * FROM cities WHERE city = '{$c}'";
$re = mysql_query($q);
... etc
它根本不安全,只需更改网址即可伪造GET请求。不,它们不在mysql函数中。您需要使用mysql\u real\u escape\u字符串使它们敏感 最好将PDO与bindParams一起使用,PDO库将为您完成这项工作 php.net/pdo_mysql
相信用户输入是危险的。有人可以更改city参数的值,将SQL注入您的查询,并访问您的数据您应该使用准备好的语句。这意味着您需要使用mysqli扩展或扩展
我建议使用PDO扩展,主要是因为它允许您在将来切换数据库,而无需重新编写所有代码。如果您使用mysql\u real\u escape\u string,则用户无法向mysql注入传递字符串。因此,对于城市来说,我认为使用GET没有问题。然而,如果您使用个人用户信息,我将使用$\u POST使用
mysql.*
扩展本身正变得越来越安全。使用mysqli
。我建议使用预先准备好的语句。这些似乎是目前最安全的……”努夫说谢谢你。。我更新了我的问题,呵呵!这次我赢了,我的朋友!哈哈,我的时区凌晨1:30已经很晚了,可能需要尽快睡觉:)哈哈,下午2点在这里!你应该,我猜你的快速打字能力会随着你越来越清醒而消失!如果修改了字符集,则可以在使用mysql\u real\u escape\u string
时进行sql注入,但这是一种非常边缘的情况。
if(!isset($city)) return;
$city=$_GET["city"];
$q = "SELECT row1, row2 WHERE city= ?;";
$mysqli = new mysqli('localhost', 'root', 'pass', 'dbname');
$stmt = $mysqli->stmt_init();
if($stmt->prepare($q)){
$stmt->bind_param("s", mysql_real_escape_string($city));
$stmt->execute();
$stmt->bind_result($row1, $row2);
while ($stmt->fetch()) {
//do stuff with the data in the $row array
}
$stmt->close();
}