Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在MySQL查询中使用GET变量安全吗?_Php_Mysql_Apache_Security_Http - Fatal编程技术网

Php 在MySQL查询中使用GET变量安全吗?

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

我有一个简单的场景:一个用户连接到“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 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();
}