2013-11-02 27 views
1

我想问一下当我使用$ _GET ['something']时如何提高安全性; ?

我的意思是,如何防止人们直接从地址栏执行这些“获取”?因为我有一个测试页,您可以从中获得XP,并从XP获得等级。

它看起来像这样:

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="get"> 
<label for="addxp"><font color="yellow">Add XP:</font></label> <input type="text" name="xpadd"><br> 

<input type="submit"> 
</form> 

$xpadd = $_GET['xpadd']; 

    mysql_query("UPDATE users SET xp=xp + '" . $_GET['xpadd'] . "' WHERE user_id='" . $_SESSION['user_id'] . "'") ; 

它是工作,但是当我键入此到我的浏览器的地址栏:http://mywebsite.com/xp.php?xpadd=50它增加了50 xp下我的观点。有人可以告诉我,我该如何预防?

+1

使用nonces为:http://stackoverflow.com/questions/4145531/how-to-create-and-use-nonces – Joren

+2

此外,不要使用'mysql_'函数,他们已被弃用。改用'mysqli'或'PDO'。在插入到数据库之前转义值也是一个好主意。请参阅http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php – Joren

+1

让他们能够添加XP是最少的担心,你有一个** SQL注入**后门 - 左**宽**开 – AlexP

回答

2

正如你所说的,任何人都可以执行这个GET请求 - 因此你不能阻止人们这样做。

您需要验证在您的代码中允许当前登录的用户执行此类命令。只有验证成功后才执行更新。

一种选择是持有该表的标记,并检查这两种设置/取消设置(取决于您的业务逻辑)

例如:

SELECT 1 FROM users WHERE user_id = ? AND is_allowed_xp_update = 1 

只有这个收益真,那么执行更新

UPDATE users SET xp = xp + ? WHERE userid = ? AND is_allowed_xp_update = 1 

还可以使用备用数据库库,然后在mysql_*功能,它们已经过时,并提供DYNAM小安ic查询

0

基本上,你不能。有经验的用户可以阅读页面的HTML代码并形成GET查询(直接在浏览器的地址栏中)或POST查询(这将需要更多的工作,但仍有可能)。

安全服务器不应该信任客户端。

所以你需要在服务器端的授权码。 (从你的问题中不清楚谁可以使用addxp,谁不允许。)