0

我一直在修改一个个人项目,该项目涉及我将一些变量写入 mysql 数据库,其中一些(名字、姓氏、电子邮件)已提交,并且我正在编写自己的卫生字符串. 我正在考虑做类似的事情

string allowed="@_=-ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";
string userEntered = [form submitted] // just skipping all the backstory there
for(int i=0; i<userEntered.length; i++){
    if(allowed.contains(userEnetered[i]){
       //continue processing
    }
    else{
        //flush data and deny
    }
}

这样的事情就足够了吗?还是我忘记了其他考虑因素?

谢谢您的帮助。

4

2 回答 2

0

如果你打算在 JSP 中向数据库写入一些东西,当然,你不应该使用这种类型的 SQL 查询:

String sql = "Select * from tblUsers where Username = '" + usern + " and password = '" + pwd + "'";

如果您使用上述方法,您很容易受到 SQL 注入攻击。而是尝试使用准备好的语句,它们会转义单引号字符并使其无法进行 SQL 注入攻击,如下所示:

String securesql = "Select * from tblUsers where Username = ? and Password = ?";
PreparedStatement prepstat = conn.prepareStatement(securesql);
prepstat.setString(1, usern);
prepstat.setString(2, pwd);

另外我建议您尝试在 SQL 中使用存储过程和函数。例如,为了登录创建一个存储过程,它将执行查询并使用您拥有的参数调用它。

此外,即使您可以在传递给preparedStatement 之前进行字符串操作(如您的示例代码)。

于 2013-01-20T11:11:35.030 回答
0

如果您担心跨站点脚本攻击,最简单的第一步是在将用户输入的数据重新显示在页面上时对其进行 HTML 转义,而不是在将其保存到数据库之前对其进行清理。您可以使用 JSTL escapeXml EL 函数来执行此操作。您只需将 jstl.jar 放到 WEB-INF/lib 中,然后执行以下操作:

<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>

<input name="firstName" value="${fn:escapeXml(user.firstName)}">

这是一个好的开始。如果您在其他上下文中显示用户输入的数据,例如在 Javascript 中,您需要根据上下文适当地对其进行转义。查看OWASP 跨站点脚本备忘单以获得好的示例

如果您遇到在显示之前转义用户输入的数据还不够的情况,OWASP 输入验证备忘单是一个很好的资源,其中包含使用白名单输入验证的示例。

于 2013-01-21T17:51:08.130 回答