php查询字符串验证


php query string validation

在我的php代码中,我可以使用php$_get方法获取数据。这里的代码看起来像这样。。

<?php 
<a href='userprofile.php?uname=$uname'>$uname</a>
?>

如果我点击链接,它将显示用户配置文件页面,因此userprofile.php页面的url如下所示。

http://localhost/evantechbd1/userprofile.php?uname=shibbir

我的问题是如何防止这个url受到sql注入或任何其他攻击。

如果我写:

http://.......uname=shibbir'OR'='-1-'

然后显示:

SHIBBIR%27OR%27%3D%27-1-%27'S PROFILE.

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

任何想法。

最好的方法是使用准备好的语句,请参阅这里的示例,尽管我通常会对准备好的声明中使用的数据进行一些数据验证。

例如,如果有人注册,用户名中只允许某些字符,当有人输入要提取的用户名时,我会使用相同的复选框。

你无法阻止某人尝试攻击,只能阻止攻击成功。然而,这种预防实际上是什么,完全取决于你将使用数据库。没有"灵丹妙药"功能可以在任何情况下确保每一位数据的安全,因为许多"净化"功能会破坏其他使用情况下所需的数据。

例如,如果坏数据永远不会在SQL查询中使用,那么用(例如)CCD_ 1进行SQL注入攻击预防是没有意义的。当字符串不打算在HTML上下文中使用时执行htmlspecialchars()同样是无用的。

在SQL中使用$uname之前,请对其进行转义。
例如,如果您使用旧的但黄金的PHP MySQL扩展:

$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

另一个问题是跨站点脚本攻击。有几种方法可以解决这个问题,但通常的方法是在html块中使用$_GET['uname']之前,先检查它是否作为用户名存在于数据库中。