所以我想在我的index.php中有一个表有一个删除链接,可以将你带到delete.php?id = x和delete.php:
$id=$_GET['id'];
$query="delete * from table WHERE id=".$id;
mysqli_query($conn,$query);
这样做是否安全?它不是SQL注入友好的吗?
答案 0 :(得分:4)
修改:答案是从原始问题https://stackoverflow.com/revisions/48928503/1发布的,他们没有对无效的DELETE *
语法进行评论,只是在没有呼吸的情况下对其进行了编辑编辑原始帖子后的一个单词。
是的,您可以使用sql injection。
您可以使用首选的prepared statement,也可以简单地将GET数组转换为int(编辑:假设它始终是整数)。否则,请准备好声明;这是你最好的选择。
$id=(int)$_GET['id'];
但是,这里有一个语法错误delete *
,摆脱了星号。
使用mysqli_error($conn)
会指出语法错误。
仅仅为了论证,table
is a MySQL reserved word,只是让你知道,应该通过用蜱来包装它来给予特殊处理。
即:
delete from `table` ...
旁注:如果目标是删除具有相同ID的所有内容,那么您现在拥有的内容和减去星号的内容就是这样做的。但是,如果目标是删除表格的全部内容,则需要使用TRUNCATE。
答案 1 :(得分:2)
最好使用这样的东西:
$id=$_GET['id'];
$mysqli = new mysqli('host', 'db_user', 'db_password', 'db');
/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$stmt = $mysqli->prepare("DELETE FROM table WHERE id=?");
$stmt->bind_param('i', $id);
mysqli_stmt_execute($stmt);
或使用PDO:
$pdo= new PDO('mysql:host=db_host;dbname=db_name', $db_user, $db_pass);
$sql = "DELETE FROM yor_table WHERE id = :id";
$stmt = $pdo->prepare($sql);
$stmt->bindParam(':id', $_GET['id'], PDO::PARAM_INT);
$stmt->execute();
但是,您确定需要验证site_user访问权限才能对数据库执行此操作。
答案 2 :(得分:1)
如果您的网站使用您的网址删除数据,该怎么办?我不知道,有人,但我知道这是你可以通过传递id来删除它。我可以随机删除,可以删除所有用户,甚至可以崩溃。问题不是关于GET / POST,问题是关于你做什么来阻止你以外的任何人做这件事。
也许,您可以保持验证,例如只有管理员可以删除它,也许删除您需要使用令牌,也许您可以加密ID并可以发送它。
也许你可以使用编码解码
这样做<?php
$str = 'YmFzZTY0IGVuY29kZWQgc3RyaW5n';
echo base64_encode($str); //Encode
?>
<?php
$str = 'YmFzZTY0IGVuY29kZWQgc3RyaW5n';
echo base64_decode($str); //Decoding
?>
答案 3 :(得分:0)
当然是!首先使用prepare statements来防止SQL注入,并且通过GET
请求删除数据也不是一个好主意。如果您没有任何类型的中间件或授权,任何人都可以通过发送请求来删除您的数据。请改用POST
或DELETE
方法。
另请阅读why shouldn't a GET request change data on the server和how to prevent sql injection
答案 4 :(得分:0)
其他人提到了SQL注入攻击的可能性。这很严重,你需要解决它。在使用之前,请确保您的id
参数是一个整数。如果有人告诉你别的东西,可以认为它们是敌对的。
但是这里还有另一种攻击可能性。有人可能只是通过一系列GET
这样的操作来打击你的应用程序数据库。
https://my.example.com/delete.php?id=1
https://my.example.com/delete.php?id=2
https://my.example.com/delete.php?id=3
...
https://my.example.com/delete.php?id=99999
https://my.example.com/delete.php?id=100000
https://my.example.com/delete.php?id=100001
你是如何解决这个问题的?有几种方法。
1)确保您的用户已登录到您的系统,并且执行删除的用户有权删除该记录。大多数登录系统向用户的浏览器提供某种会话cookie。在完成任何删除请求之前,您应确保会话cookie有效。
2)使用nonce系统。 nonce是&#34; number-once&#34;。很难猜出随机字符串或数字。在这样的超链接中生成URL,在一个页面中邀请您的合法用户点击它们。
https://my.example.com/delete.php?id=4635&nonce=slwvlz36t72ixmn
生成它们时将nonces放入表中。然后,当有人向您的某个页面显示一个nonce时,检查它是否在表中,然后从表中删除它。使nonce超时:例如,在生成它之后十分钟给每个人一个到期时间。
如果有人提出不在你桌子上的随机数,请认为它们是敌对的。
3)还有其他方法。您可以阅读有关REST服务身份验证等信息。(不要再问好问题了!)