ad_block_sql_urls (public, deprecated)
ad_block_sql_urls conn args why
Defined in packages/acs-tcl/tcl/deprecated-procs.tcl
Deprecated. Invoking this procedure generates a warning.
A filter that detect attempts to smuggle in SQL code through form data variables. The use of bind variables and ad_page_contract input validation to prevent SQL smuggling is preferred.
- Parameters:
- conn (required)
- args (required)
- why (required)
- See Also:
- Testcases:
- No testcase defined.
Source code: ad_log_deprecated proc ad_block_sql_urls set form [ns_getform] if { $form eq "" } { return filter_ok } # Check each form data variable to see if it contains malicious # user input that we don't want to interpolate into our SQL # statements. # # We do this by scanning the variable for suspicious phrases; at # this time, the phrases we look for are: UNION, UNION ALL, and # OR. # # If one of these phrases is found, we construct a test SQL query # that incorporates the variable into its WHERE clause and ask # the database to parse it. If the query does parse successfully, # then we know that the suspicious user input would result in a # executing SQL that we didn't write, so we abort processing this # HTTP request. # set n_form_vars [ns_set size $form] for { set i 0 } { $i < $n_form_vars } { incr i } { set key [ns_set key $form $i] set value [ns_set value $form $i] # michael@arsdigita.com: # # Removed 4000-character length check, because that allowed # malicious users to smuggle SQL fragments greater than 4000 # characters in length. # if { [regexp -nocase {[^a-z_]or[^a-z0-9_]} $value] || [regexp -nocase {union([^a-z0-9_].*all)?[^a-z0-9_].*select} $value] } { # Looks like the user has added "union [all] select" to # the variable, # or is trying to modify the WHERE clause # by adding "or ...". # # Let's see if Oracle would accept these variables as part # of a typical WHERE clause, either as string or integer. # # michael@arsdigita.com: Should we grab a handle once # outside of the loop? # set parse_result_integer [db_string sql_test_1 "select test_sql('select 1 from dual where 1=[DoubleApos $value]') from dual"] if { [string first "'" $value] != -1 } { # # The form variable contains at least one single # quote. This can be a problem in the case that # the programmer forgot to QQ the variable before # interpolation into SQL, because the variable # could contain a single quote to terminate the # criterion and then smuggled SQL after that, e.g.: # # set foo "' or 'a' = 'a" # # db_dml "delete from bar where foo = '$foo'" # # which would be processed as: # # delete from bar where foo = '' or 'a' = 'a' # # resulting in the effective truncation of the bar # table. # set parse_result_string [db_string sql_test_2 "select test_sql('select 1 from dual where 1=[DoubleApos "'$value'"]') from dual"] } else { set parse_result_string 1 } if { $parse_result_integer == 0 || $parse_result_integer == -904 || $parse_result_integer == -1789 || $parse_result_string == 0 || $parse_result_string == -904 || $parse_result_string == -1789 } { # Code -904 means "invalid column", -1789 means # "incorrect number of result columns". We treat this # the same as 0 (no error) because the above statement # just selects from dual and 904 or 1789 only occur # after the parser has validated that the query syntax # is valid. ns_log Error "ad_block_sql_urls: Suspicious request from [ad_conn peeraddr]. Parameter $key contains code that looks like part of a valid SQL WHERE clause: [ad_conn url]?[ad_conn query]" # michael@arsdigita.com: Maybe we should just return a # 501 error. # ad_return_error "Suspicious Request" "Parameter $key looks like it contains SQL code. For security reasons, the system won't accept your request." return filter_return } } } return filter_okXQL Not present: PostgreSQL, Oracle Generic XQL file: packages/acs-tcl/tcl/deprecated-procs.xql