使表单安全地提交变量

时间:2009-10-15 01:00:00

标签: mysql

while($info = mysql_fetch_array( $data )) {
// Print out the contents of the entry
Print "<li><b>Name:</b> ".$info['name'] . " <br />";
Print "<b>ID:</b> ".$info['ID']." <br />";
Print "<b>Age:</b> ".$info['age'] ." <br />";
Print "<b>Location:</b> ".$info['location'] ."<br /> ";
Print "<form action=delete.php method=POST><input name=ID value="safe(.$info['ID']." type=hidden><input type=submit name=submit value=Remove class=submit></form></li>";
 }
Print "</ol>";

这是我的代码。但是,我关注这一行:

Print "<form action=delete.php method=POST><input name=ID value=".$info['ID']." type=hidden><input type=submit name=submit value=Remove class=submit></form></li>";

正如我之前的一篇文章所指出的那样,针对SQL注入攻击并不安全。

我从另一篇文章中借用了这个函数:

function safe($value){
   return mysql_real_escape_string($value);
}

现在,我怎样才能使这部分免受攻击?

value=".$info['ID']."

非常感谢您的继续支持。

4 个答案:

答案 0 :(得分:2)

是是,您需要逃生 (不要太强调)

要保护此代码免受攻击,您需要确保拥有经过身份验证的用户。正在查看此页面的用户是否已登录?如果是这样,他们的会话存储在哪里?

您使用什么逻辑来读取删除数据时需要使用的数据。

// Read data in at top to prevent E_STRICT errors if user messes with Query string    
$User_ID  = $_SESSION['User_ID'];  //assuming it was authenticated 
$a_filter = (isset($_POST['a_filter']) ? $_POST['a_filter'] : '');

$query = "
    SELECT 
        a, b, c 
    FROM 
        table 
    WHERE 1
        AND a       = " . mysql_real_escape_string($a_filter) . "
        AND User_ID = " . intval($User_ID) . "
    ";

该查询将确保:

  1. 相关用户只能看到他们的记录。
  2. 他们发送的黑客数据无关紧要,它将被转义。
  3. 现在,当您将其打印为HTML时,请确保防范XSS攻击:

    <td><?= htmlspecialchars($data); ?></td>
    

    或者如果您在属性中:

    <input type="text" name="a_filter" value="<? htmlspecialchars($data, ENT_QUOTES); ?>" />
    

    现在,当您删除记录时,只需确保应用相同的安全措施......

    // Read data in at top to prevent E_STRICT errors if user messes with Query string
    $User_ID  = $_SESSION['User_ID'];  //assuming it was authenticated 
    $ID       = (int) (isset($_POST['id']) ? $_POST['id'] : 0);
    
    $query = "
        DELETE FROM 
            table 
        WHERE 1
            AND ID      = " . intval($ID) . " 
            AND User_ID = " . intval($User_ID) . "
        ";
    

    这篇文章涉及转义SQL,转义HTML,转义HTML属性以及确保查询得到授权。

    以下是关于逃避重要性的简短帖子:
    http://blog.gahooa.com/answers/what-kind-of-data-needs-to-be-escaped/

答案 1 :(得分:1)

只需检查服务器是否有此条目。

要做到这一点:

$query = 'SELECT * FROM `table` WHERE `ID` = '.(int)$_POST['ID'];

将它转换为整数应该是非常安全的。如果它是一个字符串,它也将被转换。请参阅PHP的类型杂耍:http://www.php.net/manual/en/language.types.type-juggling.php

此外,通过检查此条目是否存在,您可以确保数据有效。

所以:

$result=mysql_query('DELETE FROM `savannah` WHERE `ID`='.(int)$_POST['ID']);
if(!$result){
  die(mysql_error());
}

答案 2 :(得分:1)

这里的安全性可能应该是多级的 - 在这个特定的领域你没有其他的东西可以做。

你是否有一个独特的会话来识别用户(即使你还没有,简单地做这件事并不困难)?

如果是,那么您可以使用它来确定是否允许该用户删除一般项目,特别是该项目。

应该防止简单的注射攻击...

对于转义整数值 - 我通常将传入值转换为整数,这通常会消除流氓字符和无效输入的问题:

$safe['value'] = (int) $_POST['value'];

如果字符串不是数字,则您的安全值将为0.

编辑:我要提到的是,仅仅依赖于数据库字段是一个整数这一事实无论如何都是不安全的,并且在创建查询之前没有转义或转换输入,您将自己打开SQL注入。

答案 3 :(得分:1)

PHP过滤器(php 5.2.x功能)允许您验证和清理数据。

http://us.php.net/manual/en/filter.examples.php