【问题标题】:MySQL, PHP Acceptable way to sanitize Posted variable [duplicate]MySQL,PHP 可接受的方式来清理 Posted 变量 [重复]
【发布时间】:2017-09-12 00:11:24
【问题描述】:

在我之前的帖子PHP Looping through elements and adding to Database之后

我又回到了绘图板上,因为我害怕注射并且想要一些建议。以下是否“安全”:

$stmt = $conn->prepare("INSERT INTO responses (skey, rtext) VALUES (?, ?)");
$stmt->bind_param("is", $skey, $rtext);

$skey = 1;
$rtext = mysqli_real_escape_string($conn,$_POST['Q1Answer']);
if(!$stmt->execute()){trigger_error("there was an error....".$con->error, E_USER_WARNING);}

$skey = 2;
$rtext = "Hello";
if(!$stmt->execute()){trigger_error("there was an error....".$con->error, E_USER_WARNING);}

$stmt->close();
$conn->close();

我也可以调用下面的函数:

function SanitizeForSQL($str)
    {
        if( function_exists( "mysql_real_escape_string" ) )
        {
              $ret_str = mysql_real_escape_string( $str );
        }
        else
        {
              $ret_str = addslashes( $str );
        }
        return $ret_str;
    }

以上任何一项都有助于防止注射吗?

【问题讨论】:

  • prepare 将为每个参数执行转义字符串函数,因此不需要。

标签: php mysql sql-injection sanitization


【解决方案1】:

当您将变量绑定到占位符值时,您的工作就完成了。 mysqli 或 PDO 或您正在使用的任何数据库驱动程序负责从那时起对其进行安全编码。

绝对没有必要在此之上添加更多的消毒功能,其中许多弊大于利。最重要的事情应该是确保您永远不会在查询中放置未转义的数据,而最安全的方法是在使用占位符值时非常自律。

如果您预先转义了某些东西,那么您以后必须取消转义它们。当您将 API 添加到某物时,您假定将在 HTML 中使用的数据很可能会出现在 JSON 文档中,因此现在必须在正确地进行 JSON 转义之前对其进行反 HTML 转义。这真是令人讨厌。

尽可能保持数据库中的数据中立。也就是说,尽可能原始。例如,如果您使用 Markdown,请将原始 Markdown 保存在数据库中。如果您允许某些 HTML 标记,请输入用户输入的任何内容,并稍后用白名单清除。您可能希望将来更改您的规则以更加放松,如果您已经清除了该内容,那么它就永远消失了。

【讨论】:

    【解决方案2】:

    您应该使用访问令牌。对于每个数据库访问,您应该为客户端定义访问令牌,并且不会执行没有令牌查询。 你可以这样定义你的函数:

    function SanitizeForSQL($str,$token)
        {
          if($token=="Predefined token")
            {
             if( function_exists( "mysql_real_escape_string" ))
            {
                  $ret_str = mysql_real_escape_string( $str );
            }
            else
            {
                  $ret_str = addslashes( $str );
            }
            return $ret_str;
          }
            else return "Token is invalid".
        }
    

    【讨论】:

    • @Akhter - 谢谢,为什么我需要使用令牌?是否有安全原因(或只是最佳实践)...
    • 我不知道$token 在这里做什么,我不确定这是个好主意。这只是在已经破裂的模式上加倍下注。如果尝试 CSRF 保护,令牌不能是静态的,它必须是加密随机的并放入 $_SESSION
    • 是的,令牌必须是随机的。将为客户端创建的每个会话创建令牌。 @tadman 你说得对。
    • @QSTrain 您应该将它用于标准的身份验证程序。
    猜你喜欢
    • 2019-12-29
    • 1970-01-01
    • 2010-12-26
    • 2019-07-10
    • 2020-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-25
    相关资源
    最近更新 更多