创建安全的PHP请求

时间:2012-07-23 03:09:18

标签: php mysql database-security

我推出了一个带有在线承诺组件的网站,并且它一直被人们使用html / javascript攻击/利用,导致在签名页面上发生疯狂的事情。我无法弄清楚如何编写字段中的非alphas来阻止这种情况。

下面是我用来在数据库中记录表单数据的代码。关于如何实现preg_replace函数的任何建议(如果这是最好的)?此外,这是防止漏洞利用的最佳场所,还是在其他地方更理想?

if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) {
    $insertSQL = sprintf("INSERT INTO signature (FirstName, LastName, Email, State, Country, `TSDate`, IP) VALUES (%s, %s, %s, %s, %s, %s, %s)",
                   GetSQLValueString(($_POST['FirstName']), "text"),
                   GetSQLValueString(($_POST['LastName']), "text"),
                   GetSQLValueString(($_POST['Email']), "text"),
                   GetSQLValueString(($_POST['State']), "text"),
                   GetSQLValueString($_POST['Country'], "text"),
                   GetSQLValueString($_POST['Date'], "date"),
                   GetSQLValueString($_POST['IP'], "text"));
mysql_select_db($database_petitionscript, $petitionscript);
$Result1 = mysql_query($insertSQL, $petitionscript) or die(mysql_error());
}

3 个答案:

答案 0 :(得分:2)

您应该使用htmlspecialchars

包装所有$ _POST变量

http://php.net/manual/en/function.htmlspecialchars.php

此外,如果您使用的是PHP5,则应使用PDO对象来连接数据库,并且不应将vars直接放入MySQL查询中(这样可以向SQL解析器注入用户的SQL代码) )。您需要使用参数化查询。 How can I prevent SQL injection in PHP?

(实际上我刚刚意识到你正在使用参数化查询)

答案 1 :(得分:1)

使用htmlentities()清理所有输出。

例如,而不是做

<?php echo $FirstName; ?>

执行:

<?php echo htmlentities($FirstName); ?>

这将使用您描述的疯狂HTML / JavaScript停止XSS攻击。

此外,为了防止SQL注入,您还应该在保存之前清理输入($_POST数据)。

答案 2 :(得分:1)

您可以使用表单令牌。 可能需要一点时间来实现,但只是:

当PHP提供表单时,生成一个随机字符串并将其作为“标记”保存到数据库中。 在表单上有一个带有该标记的隐藏字段。

当您收到用户提交的表单数据时,只有在数据库中存在提供的令牌时才处理它。 (然后删除令牌)。

这有助于防止人们自动提交表单的过程,因为他们每次都需要重新加载表单并提交令牌(大多数脚本小子都不会打扰。)

通过将令牌绑定到用户会话,并且只允许每个会话使用一个令牌等等,您可以更进一步,但这可能是一个好的开始。

实际上,看起来只需使用触摸数据库的session即可完成,可能会更容易一些。