【发布时间】:2014-09-02 16:11:20
【问题描述】:
我想知道有没有一种方法可以限制用户输入特殊字符并且用户只能输入 A-z 和 0-9 字符并防止 Android 中的任何 SQL 注入?这里的最佳做法是什么?
谢谢。
【问题讨论】:
-
您有 3 个答案,请选择对您帮助最大的一个。
标签: java android sqlite sql-injection
我想知道有没有一种方法可以限制用户输入特殊字符并且用户只能输入 A-z 和 0-9 字符并防止 Android 中的任何 SQL 注入?这里的最佳做法是什么?
谢谢。
【问题讨论】:
标签: java android sqlite sql-injection
对于EditText,您可以添加TextWatcher 监听器
edt.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
});
在onTextChanged() 或afterTextChanged() 中,您可以获取文本并删除不需要的字符,您可以使用rejex 来简化。
【讨论】:
您可以使用InputFilter 来验证用户在EditText 中输入的内容。
当缓冲区要替换范围时调用此方法 dstart ... dend of dest 带有来自范围 start ... end of 的新文本 资源。返回您想要放置的 CharSequence 相反,如果合适的话,包括一个空字符串,或者 null 到 接受原来的替换。
例如,像这样:
InputFilter filter = new InputFilter()
{
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend)
{
if (source.toString().contains("'"))
return "";
else
return null; // Accept original replacement.
}
};
editText.setFilters(new InputFilter[] { filter });
但是,这将是一种非常糟糕的避免 SQL 注入的方法。在数据层使用parameterized queries 会好很多。
【讨论】:
您可以将EditText 与这些 xml 选项一起使用:
<EditText
android:inputType="text"
android:digits="0123456789qwertzuiopasdfghjklyxcvbnm"
android:hint="Only letters, digits allowed"/>
虽然请记住,如果您正确使用SQLitedatabase 的查询方法,它会自行阻止所有 SQL 注入。
【讨论】: