Problemas de validação e representação da entrada são causados por metacaracteres, codificações alternativas e representações numéricas. Confiar na entrada resulta em problemas de segurança. Os problemas incluem: “Buffer Overflows”, ataques de “Cross-Site Scripting”, “SQL Injection”, entre outros.
...
v_account = request->get_form_field( 'account' ).
v_reference = request->get_form_field( 'ref_key' ).
CONCATENATE `user = '` sy-uname `'` INTO cl_where.
IF v_account IS NOT INITIAL.
CONCATENATE cl_where ` AND account = ` v_account INTO cl_where SEPARATED BY SPACE.
ENDIF.
IF v_reference IS NOT INITIAL.
CONCATENATE cl_where "AND ref_key = `" v_reference "`" INTO cl_where.
ENDIF.
SELECT *
FROM invoice_items
INTO CORRESPONDING FIELDS OF TABLE itab_items
WHERE (cl_where).
...
SELECT *
FROM invoice_items
INTO CORRESPONDING FIELDS OF TABLE itab_items
WHERE user = sy-uname
AND account = <account>
AND ref_key = <reference>.
"abc` OR MANDT NE `+"
para v_reference e a string '1000' para v_account, a consulta se tornará a seguinte:
SELECT *
FROM invoice_items
INTO CORRESPONDING FIELDS OF TABLE itab_items
WHERE user = sy-uname
AND account = 1000
AND ref_key = `abc` OR MANDT NE `+`.
OR MANDT NE `+`
faz com que a cláusula WHERE
sempre seja avaliada como "true", pois o campo "client" nunca pode ser igual ao literal +, e, portanto, a consulta torna-se logicamente equivalente à seguinte consulta muito mais simples:
SELECT * FROM invoice_items
INTO CORRESPONDING FIELDS OF TABLE itab_items.
invoice_items
, independentemente do usuário especificado.
PARAMETERS: p_street TYPE string,
p_city TYPE string.
Data: v_sql TYPE string,
stmt TYPE REF TO CL_SQL_STATEMENT.
v_sql = "UPDATE EMP_TABLE SET ".
"Update employee address. Build the update statement with changed details
IF street NE p_street.
CONCATENATE v_sql "STREET = `" p_street "`".
ENDIF.
IF city NE p_city.
CONCATENATE v_sql "CITY = `" p_city "`".
ENDIF.
l_upd = stmt->execute_update( v_sql ).
"ABC` SALARY = `1000000"
para o parâmetro p_street, o aplicativo permitirá que o banco de dados seja atualizado com o salário revisado!
...
var params:Object = LoaderInfo(this.root.loaderInfo).parameters;
var username:String = String(params["username"]);
var itemName:String = String(params["itemName"]);
var query:String = "SELECT * FROM items WHERE owner = " + username + " AND itemname = " + itemName;
stmt.sqlConnection = conn;
stmt.text = query;
stmt.execute();
...
SELECT * FROM items
WHERE owner = <userName>
AND itemname = <itemName>;
itemName
não contiver um caractere de aspas simples. Se um invasor com o nome de usuário wiley
inserir a string "name' OR 'a'='a
" para itemName
, a consulta se tornará a seguinte:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
faz com que a cláusula "where" sempre seja avaliada como "true" e, portanto, a consulta torna-se logicamente equivalente à seguinte consulta muito mais simples:
SELECT * FROM items;
items
, independentemente do proprietário especificado.Example 1
. Se um invasor com o nome de usuário wiley
inserir a string "name'; DELETE FROM items; --
" para itemName
, a consulta se transformará nas duas consultas a seguir:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
--'
Example 1
. Se um invasor inserir a string "name'); DELETE FROM items; SELECT * FROM items WHERE 'a'='a
", as três instruções válidas a seguir serão criadas:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
SELECT * FROM items WHERE 'a'='a';
owner
corresponde ao nome do usuário autenticado no momento.
...
string userName = ctx.getAuthenticatedUserName();
string query = "SELECT * FROM items WHERE owner = '"
+ userName + "' AND itemname = '"
+ ItemName.Text + "'";
sda = new SqlDataAdapter(query, conn);
DataTable dt = new DataTable();
sda.Fill(dt);
...
SELECT * FROM items
WHERE owner = <userName>
AND itemname = <itemName>;
itemName
não contiver um caractere de aspas simples. Se um invasor com o nome de usuário wiley
inserir a string "name' OR 'a'='a
" para itemName
, a consulta se tornará a seguinte:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
faz com que a cláusula "where" sempre seja avaliada como "true" e, portanto, a consulta torna-se logicamente equivalente à seguinte consulta muito mais simples:
SELECT * FROM items;
items
, independentemente do proprietário especificado.Example 1
. Se um invasor com o nome de usuário wiley
inserir a string "name'); DELETE FROM items; --
" para itemName
, a consulta se transformará nas duas consultas a seguir:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
--'
Example 1
. Se um invasor inserir a string "name'); DELETE FROM items; SELECT * FROM items WHERE 'a'='a
", as três instruções válidas a seguir serão criadas:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
SELECT * FROM items WHERE 'a'='a';
Exemplo 2:Como alternativa, um resultado semelhante pode ser obtido com o SQLite usando o seguinte código:
...
ctx.getAuthUserName(&userName); {
CString query = "SELECT * FROM items WHERE owner = '"
+ userName + "' AND itemname = '"
+ request.Lookup("item") + "'";
dbms.ExecuteSQL(query);
...
...
sprintf (sql, "SELECT * FROM items WHERE owner='%s' AND itemname='%s'", username, request.Lookup("item"));
printf("SQL to execute is: \n\t\t %s\n", sql);
rc = sqlite3_exec(db,sql, NULL,0, &err);
...
SELECT * FROM items
WHERE owner = <userName>
AND itemname = <itemName>;
itemName
não contiver um caractere de aspas simples. Se um invasor com o nome de usuário wiley
inserir a string "name' OR 'a'='a
" para itemName
, a consulta se tornará a seguinte:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
faz com que a cláusula "where" sempre seja avaliada como "true" e, portanto, a consulta torna-se logicamente equivalente à seguinte consulta muito mais simples:
SELECT * FROM items;
items
, independentemente do proprietário especificado.Example 1
. Se um invasor com o nome de usuário wiley
inserir a string "name'); DELETE FROM items; --
" para itemName
, a consulta se transformará nas duas consultas a seguir:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
--'
Example 1
. Se um invasor inserir a string "name'); DELETE FROM items; SELECT * FROM items WHERE 'a'='a
", as três instruções válidas a seguir serão criadas:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
SELECT * FROM items WHERE 'a'='a';
...
ACCEPT USER.
ACCEPT ITM.
MOVE "SELECT * FROM items WHERE owner = '" TO QUERY1.
MOVE "' AND itemname = '" TO QUERY2.
MOVE "'" TO QUERY3.
STRING
QUERY1, USER, QUERY2, ITM, QUERY3 DELIMITED BY SIZE
INTO QUERY
END-STRING.
EXEC SQL
EXECUTE IMMEDIATE :QUERY
END-EXEC.
...
SELECT * FROM items
WHERE owner = <userName>
AND itemname = <itemName>;
itemName
não contiver um caractere de aspas simples. Se um invasor com o nome de usuário wiley
inserir a string "name' OR 'a'='a
" para itm
, a consulta se tornará a seguinte:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
faz com que a cláusula WHERE seja sempre avaliada como verdadeira, portanto a consulta torna-se logicamente equivalente à seguinte consulta, muito mais simples:
SELECT * FROM items;
items
, independentemente do proprietário especificado.Example 1
. Se um invasor com o nome de usuário wiley
inserir a string "name'; DELETE FROM items; --
" para itemName
, a consulta se transformará nas duas consultas a seguir:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
--'
Example 1
. Se um invasor inserir a string "name'); DELETE FROM items; SELECT * FROM items WHERE 'a'='a
", as três instruções válidas a seguir serão criadas:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
SELECT * FROM items WHERE 'a'='a';
...
<cfquery name="matchingItems" datasource="cfsnippets">
SELECT * FROM items
WHERE owner='#Form.userName#'
AND itemId=#Form.ID#
</cfquery>
...
SELECT * FROM items
WHERE owner = <userName>
AND itemId = <ID>;
Form.ID
não contiver um caractere de aspas simples. Se um invasor com o nome de usuário wiley
inserir a string "name' OR 'a'='a
" para Form.ID
, a consulta se tornará a seguinte:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemId = 'name' OR 'a'='a';
OR 'a'='a'
faz com que a cláusula "where" sempre seja avaliada como "true" e, portanto, a consulta torna-se logicamente equivalente à seguinte consulta muito mais simples:
SELECT * FROM items;
items
, independentemente do proprietário especificado.Example 1
. Se um invasor com o nome de usuário hacker
inserir a string "hacker'); DELETE FROM items; --
" para Form.ID
, a consulta se transformará nas duas consultas a seguir:
SELECT * FROM items
WHERE owner = 'hacker'
AND itemId = 'name';
DELETE FROM items;
--'
Example 1
. Se um invasor inserir a string "name'); DELETE FROM items; SELECT * FROM items WHERE 'a'='a
", as três instruções válidas a seguir serão criadas:
SELECT * FROM items
WHERE owner = 'hacker'
AND itemId = 'name';
DELETE FROM items;
SELECT * FROM items WHERE 'a'='a';
...
final server = await HttpServer.bind('localhost', 18081);
server.listen((request) async {
final headers = request.headers;
final userName = headers.value('userName');
final itemName = headers.value('itemName');
final query = "SELECT * FROM items WHERE owner = '"
+ userName! + "' AND itemname = '"
+ itemName! + "'";
db.query(query);
}
...
SELECT * FROM items
WHERE owner = <userName>
AND itemname = <itemName>;
itemName
não contiver um caractere de aspas simples. Se um invasor com o nome de usuário wiley
inserir a cadeia de caracteres "name' OR 'a'='a
" para itemName
, a consulta se tornará a seguinte:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
faz com que a cláusula "where" sempre seja avaliada como "true" e, portanto, a consulta torna-se logicamente equivalente à seguinte consulta muito mais simples:
SELECT * FROM items;
items
, independentemente do proprietário especificado.Example 1
. Se um invasor com o nome de usuário wiley
inserir a cadeia de caracteres "name'; DELETE FROM items; --
" para itemName
, a consulta se transformará nas duas seguintes consultas:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
--'
Example 1
. Se um invasor inserir a string "name'); DELETE FROM items; SELECT * FROM items WHERE 'a'='a
", as três instruções válidas a seguir serão criadas:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
SELECT * FROM items WHERE 'a'='a';
...
rawQuery := request.URL.Query()
username := rawQuery.Get("userName")
itemName := rawQuery.Get("itemName")
query := "SELECT * FROM items WHERE owner = " + username + " AND itemname = " + itemName + ";"
db.Exec(query)
...
SELECT * FROM items
WHERE owner = <userName>
AND itemname = <itemName>;
itemName
não contiver um caractere de aspas simples. Se um invasor com o nome de usuário wiley
inserir a cadeia de caracteres "name' OR 'a'='a
" para itemName
, a consulta se tornará a seguinte:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
faz com que a cláusula "where" sempre seja avaliada como "true" e, portanto, a consulta torna-se logicamente equivalente à seguinte consulta muito mais simples:
SELECT * FROM items;
items
, independentemente do proprietário especificado.Example 1
. Se um invasor com o nome de usuário wiley
inserir a cadeia de caracteres "name'; DELETE FROM items; --
" para itemName
, a consulta se transformará nas duas seguintes consultas:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
--'
Example 1
. Se um invasor inserir a cadeia de caracteres "name'; DELETE FROM items; SELECT * FROM items WHERE 'a'='a
", as três seguintes instruções válidas serão criadas:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
SELECT * FROM items WHERE 'a'='a';
...
String userName = ctx.getAuthenticatedUserName();
String itemName = request.getParameter("itemName");
String query = "SELECT * FROM items WHERE owner = '"
+ userName + "' AND itemname = '"
+ itemName + "'";
ResultSet rs = stmt.execute(query);
...
SELECT * FROM items
WHERE owner = <userName>
AND itemname = <itemName>;
itemName
não contiver um caractere de aspas simples. Se um invasor com o nome de usuário wiley
inserir a string "name' OR 'a'='a
" para itemName
, a consulta se tornará a seguinte:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
faz com que a cláusula "where" sempre seja avaliada como "true" e, portanto, a consulta torna-se logicamente equivalente à seguinte consulta muito mais simples:
SELECT * FROM items;
items
, independentemente do proprietário especificado.Example 1
. Se um invasor com o nome de usuário wiley
inserir a string "name'; DELETE FROM items; --
" para itemName
, a consulta se transformará nas duas consultas a seguir:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
--'
Example 1
. Se um invasor inserir a string "name'); DELETE FROM items; SELECT * FROM items WHERE 'a'='a
", as três instruções válidas a seguir serão criadas:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
SELECT * FROM items WHERE 'a'='a';
Example 1
à plataforma Android.
...
PasswordAuthentication pa = authenticator.getPasswordAuthentication();
String userName = pa.getUserName();
String itemName = this.getIntent().getExtras().getString("itemName");
String query = "SELECT * FROM items WHERE owner = '"
+ userName + "' AND itemname = '"
+ itemName + "'";
SQLiteDatabase db = this.openOrCreateDatabase("DB", MODE_PRIVATE, null);
Cursor c = db.rawQuery(query, null);
...
...
var username = document.form.username.value;
var itemName = document.form.itemName.value;
var query = "SELECT * FROM items WHERE owner = " + username + " AND itemname = " + itemName + ";";
db.transaction(function (tx) {
tx.executeSql(query);
}
)
...
SELECT * FROM items
WHERE owner = <userName>
AND itemname = <itemName>;
itemName
não contiver um caractere de aspas simples. Se um invasor com o nome de usuário wiley
inserir a string "name' OR 'a'='a
" para itemName
, a consulta se tornará a seguinte:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
faz com que a cláusula "where" sempre seja avaliada como "true" e, portanto, a consulta torna-se logicamente equivalente à seguinte consulta muito mais simples:
SELECT * FROM items;
items
, independentemente do proprietário especificado.Example 1
. Se um invasor com o nome de usuário wiley
inserir a string "name'; DELETE FROM items; --
" para itemName
, a consulta se transformará nas duas consultas a seguir:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
--'
Example 1
. Se um invasor inserir a string "name'); DELETE FROM items; SELECT * FROM items WHERE 'a'='a
", as três instruções válidas a seguir serão criadas:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
SELECT * FROM items WHERE 'a'='a';
...
$userName = $_SESSION['userName'];
$itemName = $_POST['itemName'];
$query = "SELECT * FROM items WHERE owner = '$userName' AND itemname = '$itemName';";
$result = mysql_query($query);
...
SELECT * FROM items
WHERE owner = <userName>
AND itemname = <itemName>;
itemName
não tiver um caractere de aspas simples. Se um invasor com o nome de usuário wiley
inserir a string "name' OR 'a'='a
" para itemName
, a consulta se tornará a seguinte:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
faz com que a cláusula "where" sempre seja avaliada como "true" e, portanto, a consulta torna-se logicamente equivalente à seguinte consulta muito mais simples:
SELECT * FROM items;
items
, independentemente do proprietário especificado.Example 1
. Se um invasor com o nome de usuário wiley
inserir a string "name'; DELETE FROM items; --
" para itemName
, a consulta se transformará nas duas consultas a seguir:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
--'
Example 1
. Se um invasor inserir a string "name'); DELETE FROM items; SELECT * FROM items WHERE 'a'='a
", as três instruções válidas a seguir serão criadas:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
SELECT * FROM items WHERE 'a'='a';
procedure get_item (
itm_cv IN OUT ItmCurTyp,
usr in varchar2,
itm in varchar2)
is
open itm_cv for ' SELECT * FROM items WHERE ' ||
'owner = '''|| usr || '''' ||
' AND itemname = ''' || itm || '''';
end get_item;
SELECT * FROM items
WHERE owner = <userName>
AND itemname = <itemName>;
itemName
não contiver um caractere de aspas simples. Se um invasor com o nome de usuário wiley
inserir a string "name' OR 'a'='a
" para itm
, a consulta se tornará a seguinte:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
faz com que a cláusula WHERE seja sempre avaliada como verdadeira, portanto a consulta torna-se logicamente equivalente à seguinte consulta, muito mais simples:
SELECT * FROM items;
items
, independentemente do proprietário especificado.Example 1
. Se um invasor com o nome de usuário wiley
inserir a string "name'; DELETE FROM items; --
" para itemName
, a consulta se transformará nas duas consultas a seguir:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
--'
Example 1
. Se um invasor inserir a string "name'); DELETE FROM items; SELECT * FROM items WHERE 'a'='a
", as três instruções válidas a seguir serão criadas:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
SELECT * FROM items WHERE 'a'='a';
...
userName = req.field('userName')
itemName = req.field('itemName')
query = "SELECT * FROM items WHERE owner = ' " + userName +" ' AND itemname = ' " + itemName +"';"
cursor.execute(query)
result = cursor.fetchall()
...
SELECT * FROM items
WHERE owner = <userName>
AND itemname = <itemName>;
itemName
não tiver um caractere de aspas simples. Se um invasor com o nome de usuário wiley
inserir a string "name' OR 'a'='a
" para itemName
, a consulta se tornará a seguinte:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
faz com que a cláusula "where" sempre seja avaliada como "true" e, portanto, a consulta torna-se logicamente equivalente à seguinte consulta muito mais simples:
SELECT * FROM items;
items
, independentemente do proprietário especificado.Example 1
. Se um invasor com o nome de usuário wiley
inserir a string "name'; DELETE FROM items; --
" para itemName
, a consulta se transformará nas duas consultas a seguir:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
--'
Example 1
. Se um invasor inserir a string "name'); DELETE FROM items; SELECT * FROM items WHERE 'a'='a
", as três instruções válidas a seguir serão criadas:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
SELECT * FROM items WHERE 'a'='a';
...
userName = getAuthenticatedUserName()
itemName = params[:itemName]
sqlQuery = "SELECT * FROM items WHERE owner = '#{userName}' AND itemname = '#{itemName}'"
rs = conn.query(sqlQuery)
...
SELECT * FROM items
WHERE owner = <userName>
AND itemname = <itemName>;
itemName
não contiver um caractere de aspas simples. Se um invasor com o nome de usuário wiley
inserir a string "name' OR 'a'='a
" para itemName
, a consulta se tornará a seguinte:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
faz com que a cláusula "where" sempre seja avaliada como "true" e, portanto, a consulta torna-se logicamente equivalente à seguinte consulta muito mais simples:
SELECT * FROM items;
items
, independentemente do proprietário especificado.
...
id = params[:id]
itemName = Mysql.escape_string(params[:itemName])
sqlQuery = "SELECT * FROM items WHERE id = #{userName} AND itemname = '#{itemName}'"
rs = conn.query(sqlQuery)
...
SELECT * FROM items WHERE id=<id> AND itemname = <itemName>;
itemName
e aparentemente isso impediu a vulnerabilidade contra a SQL Injection. No entanto, como a Ruby não é uma linguagem de digitação estática, mesmo que nós esperemos que id
seja um número inteiro de algum tipo uma vez que ele é atribuído a partir da entrada do usuário, ele não será necessariamente um número. Se um invasor puder, em vez disso, alterar o valor de id
para 1 OR id!=1--
, uma vez que não há nenhuma verificação de que id
é de fato numérico, a consulta SQL agora se tornará:
SELECT * FROM items WHERE id=1 OR id!=1-- AND itemname = 'anyValue';
SELECT * FROM items WHERE id=1 OR id!=1;
id
for igual a 1 ou não, o que naturalmente, equivale a tudo nessa tabela.
def doSQLQuery(value:String) = Action.async { implicit request =>
val result: Future[Seq[User]] = db.run {
sql"select * from users where name = '#$value'".as[User]
}
...
}
SELECT * FROM users
WHERE name = <userName>
userName
não contiver um caractere de aspas simples. Se um invasor com o nome de usuário wiley
inserir a string "name' OR 'a'='a
" para userName
, a consulta se tornará a seguinte:
SELECT * FROM users
WHERE name = 'name' OR 'a'='a';
OR 'a'='a'
faz com que a cláusula "where" sempre seja avaliada como "true" e, portanto, a consulta torna-se logicamente equivalente à seguinte consulta muito mais simples:
SELECT * FROM users;
users
, independentemente do usuário especificado.owner
corresponde ao nome do usuário autenticado no momento.
...
let queryStatementString = "SELECT * FROM items WHERE owner='\(username)' AND itemname='\(item)'"
var queryStatement: OpaquePointer? = nil
if sqlite3_prepare_v2(db, queryStatementString, -1, &queryStatement, nil) == SQLITE_OK {
if sqlite3_step(queryStatement) == SQLITE_ROW {
...
}
}
...
SELECT * FROM items
WHERE owner = '<userName>'
AND itemname = '<itemName>'
itemName
não contiver um caractere de aspas simples. Se um invasor com o nome de usuário wiley
inserir a string "name' OR 'a'='a
" para itemName
, a consulta se tornará a seguinte:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
faz com que a cláusula "where" sempre seja avaliada como "true" e, portanto, a consulta torna-se logicamente equivalente à seguinte consulta muito mais simples:
SELECT * FROM items;
items
, independentemente do proprietário especificado.Example 1
. Se um invasor com o nome de usuário wiley
inserir a string "name'); DELETE FROM items; --
" para itemName
, a consulta se transformará nas duas consultas a seguir:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
--'
Example 1
. Se um invasor inserir a string "name'); DELETE FROM items; SELECT * FROM items WHERE 'a'='a
", as três instruções válidas a seguir serão criadas:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
SELECT * FROM items WHERE 'a'='a';
...
username = Session("username")
itemName = Request.Form("itemName")
strSQL = "SELECT * FROM items WHERE owner = '"& userName &"' AND itemname = '" & itemName &"'"
objRecordSet.Open strSQL, strConnect, adOpenDynamic, adLockOptimistic, adCmdText
...
SELECT * FROM items
WHERE owner = <userName>
AND itemname = <itemName>;
itemName
não contiver um caractere de aspas simples. Se um invasor com o nome de usuário wiley
inserir a string "name' OR 'a'='a
" para itemName
, a consulta se tornará a seguinte:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
faz com que a cláusula "where" sempre seja avaliada como "true" e, portanto, a consulta torna-se logicamente equivalente à seguinte consulta muito mais simples:
SELECT * FROM items;
items
, independentemente do proprietário especificado.Example 1
. Se um invasor com o nome de usuário wiley
inserir a string "name'; DELETE FROM items; --
" para itemName
, a consulta se transformará nas duas consultas a seguir:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
--'
Example 1
. Se um invasor inserir a string "name'); DELETE FROM items; SELECT * FROM items WHERE 'a'='a
", as três instruções válidas a seguir serão criadas:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
SELECT * FROM items WHERE 'a'='a';
owner
corresponde ao nome do usuário autenticado no momento.
...
string userName = ctx.getAuthenticatedUserName();
string queryString = "SELECT * FROM items WHERE owner = '"
+ userName + "' AND itemname = '"
+ ItemName.Text + "'";
SimpleQuery<Item> queryObject = new SimpleQuery(queryString);
Item[] items = (Item[])queryObject.Execute(query);
...
SELECT * FROM items
WHERE owner = <userName>
AND itemname = <itemName>;
itemName
não contiver um caractere de aspas simples. Se um invasor com o nome de usuário wiley
inserir a string "name' OR 'a'='a
" para itemName
, a consulta se tornará a seguinte:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
faz com que a cláusula "where" sempre seja avaliada como "true" e, portanto, a consulta torna-se logicamente equivalente à seguinte consulta muito mais simples:
SELECT * FROM items;
items
, independentemente do proprietário especificado.
...
String userName = ctx.getAuthenticatedUserName();
String itemName = request.getParameter("itemName");
String query = "FROM items WHERE owner = '"
+ userName + "' AND itemname = '"
+ itemName + "'";
List items = sess.createQuery(query).list();
...
SELECT * FROM items
WHERE owner = <userName>
AND itemname = <itemName>;
itemName
não contiver um caractere de aspas simples. Se um invasor com o nome de usuário wiley
inserir a string "name' OR 'a'='a
" para itemName
, a consulta se tornará a seguinte:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
faz com que a cláusula "where" sempre seja avaliada como "true" e, portanto, a consulta torna-se logicamente equivalente à seguinte consulta muito mais simples:
SELECT * FROM items;
items
, independentemente do proprietário especificado.Example 1
. Se um invasor com o nome de usuário wiley
inserir a string "name'; DELETE FROM items; --
" para itemName
, a consulta se transformará nas duas consultas a seguir:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
--'
Example 1
. Se um invasor inserir a string "name'); DELETE FROM items; SELECT * FROM items WHERE 'a'='a
", as três instruções válidas a seguir serão criadas:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
SELECT * FROM items WHERE 'a'='a';
#
, da seguinte maneira:
<select id="getItems" parameterClass="MyClass" resultClass="items">
SELECT * FROM items WHERE owner = #userName#
</select>
#
em torno do nome da variável indicam que iBatis irá criar uma consulta parametrizada com a variável userName
. No entanto, iBatis também permite concatenar variáveis diretamente para instruções SQL usando caracteres $
, abrindo a porta para SQL injection.
<select id="getItems" parameterClass="MyClass" resultClass="items">
SELECT * FROM items WHERE owner = #userName# AND itemname = '$itemName$'
</select>
itemName
não contiver um caractere de aspas simples. Se um invasor com o nome de usuário wiley
inserir a cadeia de caracteres "name' OR 'a'='a
" para itemName
, a consulta se tornará a seguinte:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
faz com que a cláusula "where" sempre seja avaliada como "true" e, portanto, a consulta torna-se logicamente equivalente à seguinte consulta muito mais simples:
SELECT * FROM items;
items
, independentemente do proprietário especificado.Example 1
. Se um invasor com o nome de usuário wiley
inserir a cadeia de caracteres "name'; DELETE FROM items; --
" para itemName
, a consulta se transformará nas duas seguintes consultas:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
--'
Example 1
. Se um invasor inserir a string "name'); DELETE FROM items; SELECT * FROM items WHERE 'a'='a
", as três instruções válidas a seguir serão criadas:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
SELECT * FROM items WHERE 'a'='a';
...
String userName = ctx.getAuthenticatedUserName();
String itemName = request.getParameter("itemName");
String sql = "SELECT * FROM items WHERE owner = '"
+ userName + "' AND itemname = '"
+ itemName + "'";
Query query = pm.newQuery(Query.SQL, sql);
query.setClass(Person.class);
List people = (List)query.execute();
...
SELECT * FROM items
WHERE owner = <userName>
AND itemname = <itemName>;
itemName
não contiver um caractere de aspas simples. Se um invasor com o nome de usuário wiley
inserir a string "name' OR 'a'='a
" para itemName
, a consulta se tornará a seguinte:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
faz com que a cláusula "where" sempre seja avaliada como "true" e, portanto, a consulta torna-se logicamente equivalente à seguinte consulta muito mais simples:
SELECT * FROM items;
items
, independentemente do proprietário especificado.Example 1
. Se um invasor com o nome de usuário wiley
inserir a string "name'; DELETE FROM items; --
" para itemName
, a consulta se transformará nas duas consultas a seguir:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
--'
Example 1
. Se um invasor inserir a string "name'); DELETE FROM items; SELECT * FROM items WHERE 'a'='a
", as três instruções válidas a seguir serão criadas:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
SELECT * FROM items WHERE 'a'='a';
owner
corresponde ao nome do usuário autenticado no momento.
...
string userName = ctx.getAuthenticatedUserName();
string query = "SELECT * FROM items WHERE owner = '"
+ userName + "' AND itemname = '"
+ ItemName.Text + "'";
var items = dataContext.ExecuteCommand<Item>(query);
...
SELECT * FROM items
WHERE owner = <userName>
AND itemname = <itemName>;
itemName
não contiver um caractere de aspas simples. Se um invasor com o nome de usuário wiley
inserir a string "name' OR 'a'='a
" para itemName
, a consulta se tornará a seguinte:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
faz com que a cláusula "where" sempre seja avaliada como "true" e, portanto, a consulta torna-se logicamente equivalente à seguinte consulta muito mais simples:
SELECT * FROM items;
items
, independentemente do proprietário especificado.Example 1
. Se um invasor com o nome de usuário wiley
inserir a string "name'); DELETE FROM items; --
" para itemName
, a consulta se transformará nas duas consultas a seguir:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
--'
Example 1
. Se um invasor inserir a string "name'); DELETE FROM items; SELECT * FROM items WHERE 'a'='a
", as três instruções válidas a seguir serão criadas:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
SELECT * FROM items WHERE 'a'='a';
#
, da seguinte maneira:
<select id="getItems" parameterType="domain.company.MyParamClass" resultType="MyResultMap">
SELECT *
FROM items
WHERE owner = #{userName}
</select>
#
com colchetes em torno do nome da variável indica que MyBatis criará uma consulta parametrizada com a variável do userName
. No entanto, MyBatis também permite concatenar variáveis diretamente para instruções SQL usando o caractere $
, abrindo a porta para SQL injection.
<select id="getItems" parameterType="domain.company.MyParamClass" resultType="MyResultMap">
SELECT *
FROM items
WHERE owner = #{userName}
AND itemname = ${itemName}
</select>
itemName
não contiver um caractere de aspas simples. Se um invasor com o nome de usuário wiley
inserir a cadeia de caracteres "name' OR 'a'='a
" para itemName
, a consulta se tornará a seguinte:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
faz com que a cláusula WHERE
sempre seja avaliada como "true" e, portanto, a consulta torna-se logicamente equivalente à seguinte consulta muito mais simples:
SELECT * FROM items;
items
, independentemente do proprietário especificado.Example 1
. Se um invasor com o nome de usuário wiley
inserir a cadeia de caracteres "name'; DELETE FROM items; --
" para itemName
, a consulta se transformará nas duas seguintes consultas:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
--'
Example 1
. Se um invasor inserir a string "name'); DELETE FROM items; SELECT * FROM items WHERE 'a'='a
", as três instruções válidas a seguir serão criadas:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
SELECT * FROM items WHERE 'a'='a';
owner
corresponde ao nome do usuário autenticado no momento.
...
string userName = ctx.GetAuthenticatedUserName();
string query = "SELECT * FROM items WHERE owner = '"
+ userName + "' AND itemname = '"
+ ItemName.Text + "'";
List items = sess.CreateSQLQuery(query).List();
...
SELECT * FROM items
WHERE owner = <userName>
AND itemname = <itemName>;
ItemName
não contiver um caractere de aspas simples. Se um invasor com o nome de usuário wiley
inserir a string "name' OR 'a'='a
" para ItemName
, a consulta se tornará a seguinte:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
faz com que a cláusula "where" sempre seja avaliada como "true" e, portanto, a consulta torna-se logicamente equivalente à seguinte consulta muito mais simples:
SELECT * FROM items;
items
, independentemente do proprietário especificado.Example 1
. Se um invasor com o nome de usuário wiley
inserir a string "name'; DELETE FROM items; --
" para ItemName
, a consulta se transformará nas duas consultas a seguir:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
--'
Example 1
. Se um invasor inserir a string "name'; DELETE FROM items; SELECT * FROM items WHERE 'a'='a
", as três instruções válidas a seguir serão criadas:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
SELECT * FROM items WHERE 'a'='a';
owner
corresponde ao nome do usuário autenticado no momento.
...
string userName = identity.User;
string itemName = apiGatewayProxyRequest.QueryStringParameters['item'];
string statement = $"SELECT * FROM items WHERE owner = '{userName}' AND itemname = '{itemName}'";
var executeStatementRequest = new ExecuteStatementRequest();
executeStatementRequest.Statement = statement;
var executeStatementResponse = await dynamoDBClient.ExecuteStatementAsync(executeStatementRequest);
return displayResults(executeStatementResponse.Items);
...
SELECT * FROM items
WHERE owner = <userName>
AND itemname = <itemName>;
itemName
não contiver um caractere de aspas simples. Se um invasor com o nome de usuário wiley
inserir a cadeia de caracteres "name' OR 'a'='a
" para itemName
, a consulta se tornará a seguinte:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
faz com que a cláusula "where" sempre seja avaliada como "true" e, portanto, a consulta torna-se logicamente equivalente à seguinte consulta muito mais simples:owner
corresponde ao nome do usuário autenticado no momento.
...
String userName = identity.getUser();
String itemName = apiGatewayProxyRequest.getQueryStringParameters('item');
String statement = String.format("SELECT * FROM items WHERE owner = '%s' AND itemname = '%s'", userName, itemName);
ExecuteStatementRequest executeStatementRequest = new ExecuteStatementRequest();
executeStatementRequest.setStatement(statement);
ExecuteStatementResponse executeStatementResponse = dynamoDBClient.executeStatement(executeStatementRequest);
return displayResults(executeStatementResponse.items());
...
SELECT * FROM items
WHERE owner = <userName>
AND itemname = <itemName>;
itemName
não contiver um caractere de aspas simples. Se um invasor com o nome de usuário wiley
inserir a cadeia de caracteres "name' OR 'a'='a
" para itemName
, a consulta se tornará a seguinte:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
faz com que a cláusula "where" sempre seja avaliada como "true" e, portanto, a consulta torna-se logicamente equivalente à seguinte consulta muito mais simples:
...
String userName = ctx.getAuthenticatedUserName();
String itemName = request.getParameter("itemName");
String query = "SELECT * FROM items WHERE owner = '"
+ userName + "' AND itemname = '"
+ itemName + "'";
ResultSet rs = stmt.execute(query);
...
SELECT * FROM items
WHERE owner = <userName>
AND itemname = <itemName>;
itemName
não contiver um caractere de aspas simples. Se um invasor com o nome de usuário wiley
inserir a string "name' OR 'a'='a
" para itemName
, a consulta se tornará a seguinte:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
faz com que a cláusula "where" sempre seja avaliada como "true" e, portanto, a consulta torna-se logicamente equivalente à seguinte consulta muito mais simples:
SELECT * FROM items;
items
, independentemente do proprietário especificado.Example 1
. Se um invasor com o nome de usuário wiley
inserir a string "name'; DELETE FROM items; --
" para itemName
, a consulta se transformará nas duas consultas a seguir:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
--'
Example 1
. Se um invasor inserir a string "name'); DELETE FROM items; SELECT * FROM items WHERE 'a'='a
", as três instruções válidas a seguir serão criadas:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
SELECT * FROM items WHERE 'a'='a';
Example 1
à plataforma Android.
...
PasswordAuthentication pa = authenticator.getPasswordAuthentication();
String userName = pa.getUserName();
String itemName = this.getIntent().getExtras().getString("itemName");
String query = "SELECT * FROM items WHERE owner = '"
+ userName + "' AND itemname = '"
+ itemName + "'";
SQLiteDatabase db = this.openOrCreateDatabase("DB", MODE_PRIVATE, null);
Cursor c = db.rawQuery(query, null);
...
mysql_real_escape_string()
, impedirá algumas vulnerabilidades de injeção de SQL, mas nem todas. Valer-se dessas funções de codificação é equivalente a usar uma lista de bloqueios fraca para evitar a injeção de SQL, podendo permitir que um invasor modifique o significado da instrução ou execute comandos SQL arbitrários. Como nem sempre é possível determinar de forma estática onde a entrada será exibida dentro de uma determinada seção de código interpretado dinamicamente, os rulepacks do Fortify Secure Coding podem apresentar dados SQL dinâmicos validados como problemas de “SQL Injection: Validação Insuficiente", mesmo que a validação possa ser suficiente para evitar a SQL Injection nesse contexto.mysqli_real_escape_string()
. Quando o modo SQL está definido como "NO_BACKSLASH_ESCAPES", o caractere de barra invertida é tratado como um caractere normal, não como um caractere de escape[5]. Como mysqli_real_escape_string()
leva isso em consideração, a consulta a seguir é vulnerável à SQL injection, pois "
não tem mais o escape para \"
devido à configuração do banco de dados.
mysqli_query($mysqli, 'SET SQL_MODE="NO_BACKSLASH_ESCAPES"');
...
$userName = mysqli_real_escape_string($mysqli, $_POST['userName']);
$pass = mysqli_real_escape_string($mysqli, $_POST['pass']);
$query = 'SELECT * FROM users WHERE userName="' . $userName . '"AND pass="' . $pass. '";';
$result = mysqli_query($mysqli, $query);
...
password
em branco e inserir " OR 1=1;--
para userName
, as aspas não terão escape, e a consulta resultante será a seguinte:
SELECT * FROM users
WHERE userName = ""
OR 1=1;
-- "AND pass="";
OR 1=1
faz com que a cláusula where sempre seja avaliada como true e os hifens duplos fazem com que o resto da instrução seja tratado como um comentário, a consulta se torna equivalente à lógica de uma consulta muito mais simples:
SELECT * FROM users;
owner
corresponde ao nome do usuário autenticado no momento.
...
string userName = ctx.getAuthenticatedUserName();
string query = "SELECT * FROM items WHERE owner = '"
+ userName + "' AND itemname = '"
+ ItemName.Text + "'";
IDataReader responseReader = new InlineQuery().ExecuteReader(query);
...
SELECT * FROM items
WHERE owner = <userName>
AND itemname = <itemName>;
itemName
não contiver um caractere de aspas simples. Se um invasor com o nome de usuário wiley
inserir a string "name' OR 'a'='a
" para itemName
, a consulta se tornará a seguinte:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';
OR 'a'='a'
faz com que a cláusula "where" sempre seja avaliada como "true" e, portanto, a consulta torna-se logicamente equivalente à seguinte consulta muito mais simples:
SELECT * FROM items;
items
, independentemente do proprietário especificado.Example 1
. Se um invasor com o nome de usuário wiley
inserir a string "name'); DELETE FROM items; --
" para itemName
, a consulta se transformará nas duas consultas a seguir:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
--'
Example 1
. Se um invasor inserir a string "name'); DELETE FROM items; SELECT * FROM items WHERE 'a'='a
", as três instruções válidas a seguir serão criadas:
SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name';
DELETE FROM items;
SELECT * FROM items WHERE 'a'='a';