2

我启动了一个带有在线承诺组件的网站,它不断被使用 html/javascript 的人入侵/利用,从而在签名页面上发生疯狂的事情。我不知道如何从字段中编写非 alpha 脚本以防止这种情况发生。

下面是我用来在数据库中记录表单数据的代码。关于如何实现 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());
}
4

3 回答 3

2

你应该用 htmlspecialchars 包装你所有的 $_POST 变量

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

此外,如果您使用的是 PHP5,则应该使用 PDO 对象来连接数据库,并且不应将 var 直接放入 MySQL 查询中(这允许 SQL 解析器从用户处注入 SQL 代码)。您需要使用参数化查询。 如何防止 PHP 中的 SQL 注入?

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

于 2012-07-23T03:11:42.917 回答
1

您可以使用表单标记。实施可能需要一点时间,但很简单:

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

当您收到用户提交的表单数据时,仅当提供的令牌存在于数据库中时才对其进行处理。(然后删除令牌)。

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

您可以通过执行诸如将令牌绑定到用户会话以及只允许每个会话一个令牌等事情来进行更多、更进一步的操作,但它可能是一个很好的起点。

实际上,看起来这可以只使用不接触数据库的会话来完成,可能会更容易一些。

于 2012-07-23T03:24:09.810 回答
1

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

例如,而不是做

<?php echo $FirstName; ?>

做:

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

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

此外,要防止 SQL 注入,您还应该$_POST在保存输入(数据)之前对其进行清理。

于 2012-07-23T03:16:25.943 回答