php查询字符串验证

时间:2012-01-27 15:38:06

标签: php

在我的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.

但是我想要提供给该链接的任何文本,它必须只显示有效的用户名个人资料页面。

任何想法。

4 个答案:

答案 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'");

如果$unameshibbir'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块中使用它。