사용자 입력을 삭제하는 것이 가장 좋은시기는 언제입니까?
사용자는 신뢰할 수 없습니다. 신뢰할 수없는 사용자의 입력을 신뢰하지 마십시오. 알겠습니다. 그러나 입력을 삭제하는 가장 좋은시기가 언제인지 궁금합니다. 예를 들어, 사용자 입력을 맹목적으로 저장 한 다음 액세스 / 사용할 때마다이를 삭제합니까, 아니면 입력을 즉시 삭제 한 다음이 "정리 된"버전을 저장합니까? 아마도 이것들 외에도 내가 해보지 못한 다른 접근법이있을 수도 있습니다. 사용자 입력에서 나온 모든 데이터는 여전히 조심스럽게 접근해야하므로 "정리 된"데이터가 여전히 무의식적으로 또는 우연히 위험 할 수 있기 때문에 저는 첫 번째 방법을 더 선호합니다. 어느 쪽이든, 사람들은 어떤 방법이 가장 좋다고 생각하며 그 이유는 무엇입니까?
가능한 한 빨리 삭제하고 싶습니다. 즉, 사용자가 유효하지 않은 데이터를 입력하려고 할 때 삭제가 발생합니다. 나이에 맞는 TextBox가 있고 숫자가 아닌 다른 것을 입력하면 문자 키를 누르지 않습니다.
그런 다음 데이터를 읽는 것이 무엇이든 (종종 서버) 데이터를 읽을 때 온 전성 검사를 수행하여보다 결정된 사용자 (예 : 파일 수동 편집 또는 패킷 수정)로 인해 미끄러지는 것이 없는지 확인합니다. !)
편집 : 전반적으로 조기에 삭제하고 1 초 동안 데이터를 잃어버린 경우 언제든지 삭제합니다 (예 : 파일 저장-> 파일 열기).
불행히도 참가자 중 거의 아무도 자신이 말하는 내용을 명확하게 이해하지 못했습니다. 말 그대로. @Kibbee만이 그것을 똑바로 만들 수있었습니다.
이 항목은 모두 삭제에 관한 것입니다. 그러나 진실은, 광범위하게 "일반적인 목적의 위생 처리"와 같은 것은 모든 사람들이 그렇게 이야기하기를 열망하는 것은 존재하지 않는다는 것입니다.
수많은 매체가 있으며 각 매체 에는 고유 한 고유 한 데이터 형식이 필요 합니다. 더욱이-심지어 하나의 특정 매체 라도 그 부분에 대해 다른 형식을 요구합니다 . 예를 들어 HTML 형식은 HTML 페이지에 포함 된 javascript에는 쓸모가 없습니다. 또는 SQL 쿼리의 숫자에는 문자열 형식화가 쓸모가 없습니다.
사실 대부분의 찬성 답변에서 제안 된 것처럼 이러한 "가능한 한 빨리 위생 처리"는 불가능 합니다. 데이터가 어떤 매체 또는 매체 부분에서 사용 될지 알 수 없기 때문입니다. 우리는 움직이는 모든 것을 피하면서 "sql-injection"으로부터 방어 할 준비를하고 있습니다. 하지만 웁스! -일부 필수 필드가 채워지지 않았고 모든 슬래시를 추가하여 데이터베이스 대신 양식에 데이터를 다시 채워야합니다.
다른 한편으로, 우리는 모든 "사용자 입력"을 부지런히 이스케이프했습니다 ... 그러나 SQL 쿼리에서는 숫자 나 식별자이기 때문에 주위에 따옴표가 없습니다. 그리고 어떤 "위생"도 우리에게 도움이되지 않았습니다.
세 번째로-좋아요, 우리는 끔찍하고 신뢰할 수없고 무시당하는 "사용자 입력"을 삭제하는 데 최선을 다했지만 일부 내부 프로세스에서는이 데이터를 형식없이 사용했습니다 (이미 최선을 다했듯이!)-그리고 웁스! 모든 영광에서 2 차 주사를 받았습니다.
따라서 실제 사용 관점에서 볼 때 유일한 적절한 방법은
- "정리"가 아닌 서식 지정
- 사용 직전
- 특정 매체 규칙에 따라
- 이 매체의 다른 부분에 필요한 하위 규칙을 따를 수도 있습니다.
나는 Radu와 매우 유사하게 내 사용자 데이터를 삭제합니다.
첫 번째 클라이언트 측에서는 정규식을 모두 사용하고 허용되지 않는 입력을 제출하기 전에 제거하는 onChange 또는 OnBlur와 같은 이벤트에 연결된 자바 스크립트 또는 jQuery를 사용하여 주어진 양식 필드에 허용되는 문자 입력을 제어합니다. 그러나 이것은 실제로 해당 사용자에게 데이터가 서버 측에서도 확인된다는 사실을 알리는 효과가 있음을 인식하십시오. 실제 보호보다 더 많은 경고입니다.
둘째, 요즘은 더 이상이 작업이 거의 수행되지 않습니다. 서버 측에서 수행되는 첫 번째 검사는 양식이 제출되는 위치를 확인하는 것입니다. 유효한 위치로 지정한 페이지에서만 양식 제출을 허용하면 데이터를 읽기 전에 스크립트를 종료 할 수 있습니다. 물론, 자체 서버를 가진 훌륭한 해커는 도메인과 IP 주소를 모두 '스푸핑'하여 유효한 양식 위치에서 온 것으로 스크립트에 표시 할 수 있기 때문에 그 자체로는 불충분합니다.
다음으로, 나는 심지어 이런 말을하지 말았어야하지만, 항상, 그리고 내 말은 항상 , 더러운 모드에서 스크립트를 실행합니다. 이것은 당신이 게으르지 않고 4 단계에 대해 부지런히해야합니다.
양식의 주어진 필드에서 예상되는 데이터에 적합한 올바른 형식의 정규식을 사용하여 가능한 한 빨리 사용자 데이터를 삭제하십시오. 악명 높은 ' 유니콘 의 마법의 뿔 '과 같은 지름길 을 사용하여 오염 검사를 통과 하지 마십시오 ... 아니면 보안을 위해 할 수있는 모든 이점을 위해 처음부터 오염 검사를 끄는 것이 좋습니다. 그것은 마치 사이코 패스에게 날카로운 칼을주고, 목을 움켜 쥐고, '당신은 정말로 나를 해치지 않을 것입니다'라고 말하는 것과 같습니다.
시스템 호출, 다른 변수에 대한 할당 또는 기타 보안 위험을 나타낼 수있는 방식으로 실제로 사용할 사용자 데이터 만 삭제하기 때문에이 네 번째 단계에서 다른 대부분과 다른 부분이 있습니다. 데이터를 저장하기위한 쓰기. 사용자가 입력 한 데이터를 시스템에 직접 저장 한 데이터와 비교하는 데만 사용하는 경우 (따라서 내 데이터가 안전하다는 것을 알고 있음), 사용자 데이터를 삭제하지 않아도됩니다. 보안 문제로 자신을 제시하는 방식으로 우리에게 결코 가지 않을 것입니다. 예를 들어 사용자 이름 입력을 예로 들어 보겠습니다. 사용자가 입력 한 사용자 이름을 데이터베이스의 일치 항목과 비교하기 위해서만 사용합니다. 사실이면 데이터베이스의 데이터를 사용하여 스크립트에서 호출 할 수있는 다른 모든 기능을 수행합니다. ,
마지막으로 캡차와 같은 '인간 인증'시스템을 사용하여 요즘 로봇이 시도하는 모든 자동 제출을 필터링합니다. 이것은 사진에서 보는 것을 입력하기 위해 사진과 '인간'에 대한 입력을 사용하는 내 자신의 '인간 인증'스키마를 작성하는 데 시간을 할애 할만큼 충분히 중요합니다. 저는 Captcha 유형 시스템이 사용자를 정말 짜증나게한다는 것을 발견했기 때문에이 작업을 수행했습니다 (왜곡 된 문자를 해독하려고 시도하는 것을 찡그린 눈으로 확인할 수 있습니다 ... 보통 반복해서 반복합니다). 이것은 배고픈 스팸 봇이 즐겨 찾기에 사용하기 때문에 이메일에 SendMail 또는 SMTP를 사용하는 스크립트에 특히 중요합니다.
요약하자면 제가 아내에게하는 것처럼 설명하겠습니다. 귀하의 서버는 인기있는 나이트 클럽과 같고, 경비원이 많을수록 나이트 클럽에서 발생할 수있는 문제가 줄어 듭니다. 문 밖에 두 명의 경비원 (클라이언트 측 유효성 검사 및 사람 인증), 문 바로 안쪽에 경비원 한 명 (유효한 양식 제출 위치 확인 ... '이 ID에 정말 당신이 있습니까?'), 그리고 몇 명의 경비원이 가까이에 있습니다. 문에 근접 (오염 모드를 실행하고 좋은 정규식을 사용하여 사용자 데이터를 확인).
나는 이것이 오래된 게시물이라는 것을 알고 있지만, 여기를 방문한 후 그것을 읽을 수있는 사람이라면 누구나 보안과 관련하여 ' 마법의 총알 ' 이 아니라는 것을 깨달을 수있을만큼 중요하다고 느꼈으 며 ,이 모든 것이 서로 협력하여 작업해야합니다. 사용자가 제공 한 데이터를 안전하게 보호합니다. 이 방법 중 하나 또는 두 가지를 단독으로 사용하는 것은 거의 쓸모가 없습니다.
또는 요약하면, 엄마가 자주 말하듯이 ... '미안한 것보다 안전합니다'.
최신 정보:
요즘 제가하고있는 또 하나의 일은 Base64로 모든 데이터를 인코딩 한 다음 SQL Database에 상주 할 Base64 데이터를 암호화하는 것입니다. 이 방법으로 저장하는 데 총 바이트가 약 1/3 더 필요하지만 보안 이점이 데이터의 추가 크기보다 큽니다.
어떤 종류의 살균을하는지에 따라 다릅니다.
SQL 인젝션으로부터 보호하려면 데이터 자체에 대해 아무것도하지 마십시오. 준비된 문장을 사용하면 사용자가 입력 한 데이터를 엉망으로 만들고 논리에 부정적인 영향을 미칠까 걱정할 필요가 없습니다. 모든 것이 요청에서 오는 문자열이기 때문에 숫자가 숫자이고 날짜가 날짜인지 확인하기 위해 약간 삭제해야합니다. 그러나 블록 키워드 또는 기타 작업을 수행하기 위해 어떤 검사도 시도하지 마십시오.
XSS 공격으로부터 보호하려면 데이터를 저장하기 전에 수정하는 것이 더 쉬울 것입니다. 그러나 다른 사람들이 언급했듯이 때로는 사용자가 입력 한 내용을 그대로 유지하는 것이 좋습니다. 변경하면 영원히 손실되기 때문입니다. 준비된 쿼리를 사용하여 SQL 인젝션에 걸리지 않도록 보장 할 수있는 방식으로 애플리케이션이 삭제 된 HTML 만 출력하도록 보장하는 어리석은 증거가 없다는 것은 거의 안타깝습니다.
가장 중요한 것은 탈출 할 때 항상 일관성을 유지하는 것입니다. 우발적 인 이중 살균은 절름발이이며 살균하지 않으면 위험합니다.
SQL의 경우 데이터베이스 액세스 라이브러리가 값을 자동으로 이스케이프하는 바인드 변수를 지원하는지 확인하십시오. 사용자 입력을 SQL 문자열에 수동으로 연결하는 사람은 누구나 더 잘 알고 있어야합니다.
HTML의 경우 가능한 마지막 순간에 탈출하는 것을 선호합니다. 사용자 입력을 파괴하면 다시 되돌릴 수 없으며 실수를하면 나중에 편집하고 수정할 수 있습니다. 원래 입력을 파괴하면 영원히 사라집니다.
파싱을 시도하기 전에는 조기가 좋습니다. 나중에 출력하거나 특히 다른 구성 요소 (예 : 셸, SQL 등)로 전달하려는 모든 것은 삭제되어야합니다.
그러나 너무 과도하게 사용하지 마십시오. 예를 들어 암호는 저장하기 전에 해시됩니다 (맞습니까?). 해시 함수는 임의의 이진 데이터를 허용 할 수 있습니다. 그리고 절대로 암호를 인쇄하지 않을 것입니다 (맞습니까?). 따라서 암호를 구문 분석하지 말고 삭제하지 마십시오.
Also, make sure that you're doing the sanitizing from a trusted process - JavaScript/anything client-side is worse than useless security/integrity-wise. (It might provide a better user experience to fail early, though - just do it both places.)
My opinion is to sanitize user input as soon as posible client side and server side, i'm doing it like this
- (client side), allow the user to enter just specific keys in the field.
- (client side), when user goes to the next field using onblur, test the input he entered against a regexp, and notice the user if something is not good.
- (server side), test the input again, if field should be INTEGER check for that (in PHP you can use is_numeric() ), if field has a well known format check it against a regexp, all others ( like text comments ), just escape them. If anything is suspicious stop script execution and return a notice to the user that the data he enetered in invalid.
If something realy looks like a posible attack, the script send a mail and a SMS to me, so I can check and maibe prevent it as soon as posible, I just need to check the log where i'm loggin all user inputs, and the steps the script made before accepting the input or rejecting it.
Perl has a taint option which considers all user input "tainted" until it's been checked with a regular expression. Tainted data can be used and passed around, but it taints any data that it comes in contact with until untainted. For instance, if user input is appended to another string, the new string is also tainted. Basically, any expression that contains tainted values will output a tainted result.
Tainted data can be thrown around at will (tainting data as it goes), but as soon as it is used by a command that has effect on the outside world, the perl script fails. So if I use tainted data to create a file, construct a shell command, change working directory, etc, Perl will fail with a security error.
I'm not aware of another language that has something like "taint", but using it has been very eye opening. It's amazing how quickly tainted data gets spread around if you don't untaint it right away. Things that natural and normal for a programmer, like setting a variable based on user data or opening a file, seem dangerous and risky with tainting turned on. So the best strategy for getting things done is to untaint as soon as you get some data from the outside.
And I suspect that's the best way in other languages as well: validate user data right away so that bugs and security holes can't propagate too far. Also, it ought to be easier to audit code for security holes if the potential holes are in one place. And you can never predict which data will be used for what purpose later.
Clean the data before you store it. Generally you shouldn't be preforming ANY SQL actions without first cleaning up input. You don't want to subject yourself to a SQL injection attack.
I sort of follow these basic rules.
- Only do modifying SQL actions, such as, INSERT, UPDATE, DELETE through POST. Never GET.
- Escape everything.
- If you are expecting user input to be something make sure you check that it is that something. For example, you are requesting an number, then make sure it is a number. Use validations.
- Use filters. Clean up unwanted characters.
Users are evil!
Well perhaps not always, but my approach is to always sanatize immediately to ensure nothing risky goes anywhere near my backend.
The added benefit is that you can provide feed back to the user if you sanitize at point of input.
Assume all users are malicious. Sanitize all input as soon as possible. Full stop.
I sanitize my data right before I do any processing on it. I may need to take the First and Last name fields and concatenate them into a third field that gets inserted to the database. I'm going to sanitize the input before I even do the concatenation so I don't get any kind of processing or insertion errors. The sooner the better. Even using Javascript on the front end (in a web setup) is ideal because that will occur without any data going to the server to begin with.
The scary part is that you might even want to start sanitizing data coming out of your database as well. The recent surge of ASPRox SQL Injection attacks that have been going around are doubly lethal because it will infect all database tables in a given database. If your database is hosted somewhere where there are multiple accounts being hosted in the same database, your data becomes corrupted because of somebody else's mistake, but now you've joined the ranks of hosting malware to your visitors due to no initial fault of your own.
Sure this makes for a whole lot of work up front, but if the data is critical, then it is a worthy investment.
I find that cleaning it immediately has two advantages. One, you can validate against it and provide feedback to the user. Two, you do not have to worry about consuming the data in other places.
User input should always be treated as malicious before making it down into lower layers of your application. Always handle sanitizing input as soon as possible and should not for any reason be stored in your database before checking for malicious intent.
ReferenceURL : https://stackoverflow.com/questions/34896/when-is-it-best-to-sanitize-user-input
'programing' 카테고리의 다른 글
스 와이프하여 셀을 삭제하면 tableViewHeader가 셀과 함께 이동합니다. (0) | 2021.01.15 |
---|---|
기기가 충전 중이거나 앱이 포 그라운드 인 경우에만 무음 푸시 알림이 전달됩니다. (0) | 2021.01.15 |
JOIN이 WHERE보다 빠릅니까? (0) | 2021.01.15 |
Python을 사용하여 파일 (ics / icalendar) 구문 분석 (0) | 2021.01.15 |
확장 된 WAR 파일의 장점 / 단점 (0) | 2021.01.15 |