[mysql]格兰特的声明语法问题和 php,分配权限

标签: MySQL PHP
发布时间: 2017/4/9 22:35:27
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

嗨所有我试着做一个小程序,创建一个用户并分配上 php 中的数据库管理器的权限

这是的代码︰

 <?php 
$host1='localhost'; 
$user1='root'; 
$pass1=''; 
$conexion=mysql_connect($host1,$user1,$pass1); 
if(!$_POST) 
{ 
?> 
<form id="form1" method="post" action="base.php" enctype="multipart/form-data"> 
<input type="text" name="usuario" > Nombre usuario <br> 
<br><b>Datos:</b><br> 
<input type="checkbox" name="insert" value="insert"> Insert <br> 
<input type="checkbox" name="delete" value="DELETE"> Delete<br> 
<input type="checkbox" name="file" value="FILE"> File<br> 
<input type="checkbox" name="SELECT" value="SELECT"> SELECT<br> 
<input type="checkbox" name="UPDATE" value="UPDATE">UPDATE<br> 
<INPUT name="Registrar" type=submit value="Registrar"> 
<?php 
} 

else 
{ 

$host = 'localhost'; 
$pass = '12345'; 
$user =$_POST["usuario"];
$delete =$_POST["delete"]; 
$file =$_POST["file"]; 
$insert =$_POST["insert"]; 
$select =$_POST["SELECT"]; 
$update =$_POST["UPDATE"]; 

$createQ = "CREATE USER '{$user}'@'{$host}' IDENTIFIED BY '{$pass}'"; 
$grantQ = "GRANT  {$file},{$insert},{$delete},{$selec},{$update}  ON  *.* TO '{$user}'@'{$host}' WITH GRANT OPTION"; 
if(mysql_query($createQ)){ 
    echo 'Usuario creado <br/>'; 
    if(mysql_query($grantQ)){ 
        echo 'Permisos concedidos<br/>'; 
    }else{ 
        echo 'permissions query failed:'.mysql_error().'<br/>'; 
    } 

}else{ 
    echo '<b>El usuario posiblemente ya existe </b>:'.mysql_error().'<br/>'; 
} 
} 
?>

用逗号 (,),如果不是选择复选框在句中的逗号是问题 (所以一起将两个逗号) 和出现语法错误

然后我可以做什么?

我感谢你及时的帮助

欢呼

解决方法 1:

这的确是非常不安全的代码,我同意道。但实际的问题是如何解决'之间要用逗号问题',和我说,那下面。使用数组来存储特权关键词和 join() 函数来胶水他们之间加一个逗号︰

$insert = $_POST["insert"]; 
$delete = $_POST["delete"]; 
$file = $_POST["file"]; 
$select = $_POST["SELECT"]; 
$update = $_POST["UPDATE"]; 

$privs = array();
if ($insert != "") $privs[] = $insert;
if ($delete != "") $privs[] = $delete;
if ($file != "") $privs[] = $file;
if ($select != "") $privs[] = $select;
if ($update != "") $privs[] = $update;

if (count($privs) > 0) {        
    $privclause = join(", ", $privs);
    $grantQ = "GRANT $privclause ON *.* TO '{$user}'@'{$host}' WITH GRANT OPTION";
    }

另请注意,是否没有选项选中的 GRANT 语句没有被执行。

现在,假设只对 INSERT 和选择选项进行检查。SQL 语句将会变成︰

GRANT INSERT, SELECT ON *.* TO ''@'' WITH GRANT OPTION

如果只选中选择选项,而语句变成︰

GRANT SELECT ON *.* TO ''@'' WITH GRANT OPTION

join()函数将仅粘贴给定的字符串之间部分,不会自动之前之后的部分。

官方微信
官方QQ群
31647020