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

クロスサイト スクリプティング攻撃が心配な場合、最も簡単な最初のステップは、データベースに保存する前にスクラブするのではなく、ページに再表示するときにユーザーが入力したデータを 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 に答える
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 に答える