在我的PHP代码中,我可以使用php $ _GET方法获取数据。这是代码看起来像..
<?php
<a href='userprofile.php?uname=$uname'>$uname</a>
?>
如果我点击该链接,则显示用户个人资料页面,以便userprofile.php页面的网址如下所示。
http://localhost/evantechbd1/userprofile.php?uname=shibbir
我的问题是我如何防止这个URL被sql注入或任何其他攻击。
如果我写:
http://.......uname=shibbir'OR'='-1-'
然后它显示:
SHIBBIR%27OR%27%3D%27-1-%27'S PROFILE.
但是我想要提供给该链接的任何文本,它必须只显示有效的用户名个人资料页面。
任何想法。
答案 0 :(得分:1)
最好的方法是使用预准备语句,请参阅examples here,尽管我通常会对将要在预准备语句中使用的数据进行一些数据验证。
例如,如果某人注册,则用户名中只允许使用某些字符,并且当有人输入要提取的用户名时,我会使用相同的检查。
答案 1 :(得分:0)
您无法阻止某人试图攻击,您只能阻止攻击成功。但是,预防实际上取决于您将要使用的数据库。没有“魔术子弹”功能可以在每种情况下使每一位数据都安全,因为许多“清理”功能会破坏其他使用情况下必需的数据。
e.g。如果坏的数据永远不会在SQL查询中使用,那么使用(例如)mysql_real_escape_string()
进行SQL注入攻击防护毫无意义。当字符串不在HTML上下文中使用时执行htmlspecialchars()
同样没用。
答案 2 :(得分:0)
在SQL中使用$uname
之前,请将其转义
例如,如果您使用旧的但PHP PHP扩展程序:
$uname = mysql_real_escape_string($uname);
$res = mysql_query("SELECT * FROM users WHERE name = '$uname'");
如果$uname
为shibbir'OR'='-1-'
,则在使用我编写的函数后,它将为shibbir\'OR\'=\'-1-\'
,无法破解您的查询。
在这里阅读更多内容:
http://php.net/manual/en/function.mysql-real-escape-string.php
http://www.php.net/manual/en/security.database.sql-injection.php
答案 3 :(得分:0)
另一个问题是跨站脚本攻击。有几种方法可以解决这个问题,但通常的方法是检查$ _GET [&#39; uname&#39; ]在数据库中首先存在用户名,然后再在html块中使用它。